Cara Buat Monitor Suhu & Kelembapan DHT11 dengan OLED di ESP32

Black ESP32 NodeMCU wired to a light-blue DHT11 sensor module and a blue 0.96-inch OLED display showing glowing white bars

Sambungkan pin signal modul DHT11 ke GPIO4 pada ESP32, SDA dan SCL OLED ke GPIO21 dan GPIO22, bekalkan kuasa kedua-duanya dari pin 3V3, kemudian jalankan satu sketch dengan library Adafruit DHT dan SSD1306. Semuanya berjalan pada 3.3V dan tak perlu apa-apa resistor tambahan — modul DHT11 3-pin memang sudah ada pull-up terbina di atas board.

Apa komponen yang anda perlukan untuk weather station ESP32 ini?

Board NodeMCU-32S ESP32 ialah otaknya: ada WiFi, logik 3.3V, dan sangat mesra untuk projek pertama. Ia diprogram melalui micro-USB, bukan USB-C, jadi sediakan kabel data micro-USB. Cip USB-nya CP2102, jadi komputer anda perlukan driver Silicon Labs CP210x — bukan driver CH340 yang dipakai board lain.

Kalau COM port masih tak muncul walaupun driver sudah dipasang, ikut panduan ESP32 tak detect kami dulu sebelum salahkan kod.

Macam mana nak sambung DHT11 dan OLED ke ESP32?

OLED 0.96″ ini bercakap melalui I2C, dan pin I2C default ESP32 dalam Arduino ialah GPIO21 (SDA) dan GPIO22 (SCL), jadi tak perlu remap apa-apa. DHT11 pula guna protokol single-wire dia sendiri pada mana-mana GPIO kosong; kami guna GPIO4.

Pin modul Pin ESP32 Nota
OLED GND GND Pin pertama pada display ini — semak silkscreen
OLED VCC 3V3 Pin kedua, bukan pertama
OLED SCL GPIO22 Clock I2C default Arduino
OLED SDA GPIO21 Data I2C default Arduino
DHT11 S (signal) GPIO4 Mana-mana GPIO kosong boleh; sketch guna 4
DHT11 VCC 3V3 Modul terima 3.3–5.5V
DHT11 GND GND

Satu amaran sebelum anda cucuk apa-apa: header OLED ini tersusun GND, VCC, SCL, SDA dari kiri ke kanan — terbalik daripada susunan VCC-dulu pada banyak modul lain. Kalau ikut tabiat sambung wayar merah ke pin pertama, bekalan kuasa masuk terbalik ke display — itulah cara klasik OLED jenis ini mati. Ikut silkscreen, jangan sesekali ikut warna wayar dalam gambar orang lain.

Kartun close-up empat pin header modul OLED biru dengan wayar hitam, merah, kuning dan hijau disambung mengikut susunan
Pada OLED ini pin pertama ialah GND dan pin kedua VCC — terbalik daripada banyak modul lain. Ikut silkscreen, bukan tabiat.

Sekarang berita baiknya: skip resistor pull-up 10k yang disuruh oleh kebanyakan tutorial DHT11. Nasihat itu untuk sensor bare 4-pin; yang kami jual ialah versi modul 3-pin dengan pull-up sedia terpasang pada PCB hitam kecilnya. Sambung S, VCC dan GND, wiring pun siap — dan sebab semuanya berjalan pada 3.3V, level shifting langsung tak diperlukan.

Library dan kod apa yang buat display ini berfungsi?

Stack Adafruit menggerakkan kedua-dua komponen, dipasang dari Library Manager Arduino IDE (Sketch → Include Library → Manage Libraries). Cari DHT sensor library oleh Adafruit dan terima prompt untuk pasang dependency Adafruit Unified Sensor sekali, kemudian pasang Adafruit SSD1306, yang akan tarik Adafruit GFX dengan cara yang sama.

Sketch ini membaca sekali setiap dua saat menggunakan millis() dan bukannya delay(), jadi loop tak pernah tersekat. Datasheet DHT11 Aosong menetapkan tempoh sampling sekurang-kurangnya dua saat, dan library Adafruit pun menguatkuasakan minimum dua saat yang sama secara dalaman — poll lebih laju cuma pulangkan bacaan cache atau bacaan gagal. Dua saat memang rentak semula jadi sensor ini — dan sketch yang sama boleh terus jalan dengan DHT22 tanpa sebarang ubahan.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C      // jalankan I2C scanner kalau skrin kekal kosong
#define DHTPIN 4            // pin S modul DHT11
#define DHTTYPE DHT11       // tukar ke DHT22 kalau anda beli varian itu

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
DHT dht(DHTPIN, DHTTYPE);

const unsigned long READ_INTERVAL = 2000; // DHT11 perlukan sekurang-kurangnya 2 s antara bacaan
unsigned long lastRead = 0;

void setup() {
  Serial.begin(115200);
  dht.begin();
  if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
    Serial.println("SSD1306 not found - check wiring and address");
    while (true) delay(10);   // berhenti di sini, tiada apa nak dipapar
  }
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println("DHT11 monitor ready");
  display.display();
}

void loop() {
  if (millis() - lastRead < READ_INTERVAL) return; // tunggu tanpa blocking
  lastRead = millis();

  float h = dht.readHumidity();
  float t = dht.readTemperature(); // Celsius

  display.clearDisplay();
  display.setCursor(0, 0);

  if (isnan(h) || isnan(t)) {
    display.setTextSize(1);
    display.println("Sensor read failed");
    display.println("Check DHT11 wiring");
  } else {
    display.setTextSize(1);
    display.println("Temperature:");
    display.setTextSize(2);
    display.print(t, 1);
    display.println(" C");
    display.setTextSize(1);
    display.println("Humidity:");
    display.setTextSize(2);
    display.print(h, 1);
    display.println(" %");
  }
  display.display();
}

Macam mana kalau OLED anda di alamat 0x3D dan bukan 0x3C?

Display kelas SSD1306 duduk di salah satu daripada dua alamat I2C — 0x3C atau 0x3D, ditentukan oleh bit alamat SA0 pada controller. 0x3C ialah default yang paling biasa dan itulah yang sketch ini guna.

Kalau skrin kekal gelap, jangan teka — scan. Core Arduino ESP32 sudah sedia ada scanner di File → Examples → Wire → WireScan; upload, buka Serial Monitor, dan ia akan cetak setiap alamat I2C yang dijumpai. Apa sahaja yang dilaporkan itulah yang masuk ke OLED_ADDR; kalau tiada apa dijumpai, itu masalah wiring, bukan masalah alamat.

Patut beli DHT11 atau DHT22?

DHT11 dan DHT22 ialah dua varian sensor yang sama — listing kami ada kedua-duanya — dan jawapan jujurnya, setiap satu ada tugas masing-masing. Angka di bawah diambil dari panduan DHT Adafruit; kadar sampling pula ikut datasheet DHT11 Aosong sendiri, yang lebih ketat daripada angka 1 Hz Adafruit.

Spesifikasi DHT11 DHT22
Julat suhu 0–50°C −40 hingga 80°C
Ketepatan suhu ±2°C ±0.5°C
Julat kelembapan 20–80% RH 0–100% RH
Ketepatan kelembapan ±5% ±2–5%
Kadar sampling maksimum 0.5 Hz (setiap 2 saat) 0.5 Hz (setiap 2 saat)

Untuk bilik, pejabat atau grow cabinet di Malaysia, julat 0–50°C dan ketepatan ±2°C DHT11 sudah lebih dari cukup. Pilih DHT22 kalau nak bacaan bawah 0°C (log peti sejuk), kelembapan di luar julat 20–80%, atau ketepatan lebih tinggi untuk benda macam inkubator. Dalam kod, satu-satunya perubahan ialah #define DHTTYPE DHT22.

Kenapa skrin kosong atau bacaan keluar “nan”?

Bacaan nan (not a number) bermaksud library DHT tanya sensor tapi tak dapat jawapan. Semak tiga perkara ikut urutan: wayar S betul-betul pada GPIO4 dan tercucuk kemas, DHTTYPE padan dengan sensor sebenar anda (DHT11 yang dibaca sebagai DHT22 akan gagal), dan VCC/GND pergi ke 3V3 dan GND. Kod yang dicopy selalunya poll terlalu laju juga — kekalkan sekurang-kurangnya dua saat antara bacaan.

OLED kosong sedangkan sensor berfungsi hampir selalu berpunca dari bahagian I2C: SDA dan SCL tertukar, alamat salah dalam OLED_ADDR, atau GND/VCC terbalik pada header yang tersusun terbalik itu. Jalankan sketch WireScan dulu — dalam sepuluh saat ia beritahu sama ada display hidup dan di alamat mana ia duduk.

Kartun perbandingan OLED gelap dengan wayar DHT11 longgar berbanding OLED menyala dengan semua wayar tersambung betul ke ESP32
Skrin gelap atau bacaan nan hampir selalu berpunca dari satu wayar longgar atau tertukar — cucuk semula, kemudian scan semula.

Bacaan yang lari 1–2°C dari remote aircond anda pun bukan kerosakan — itu masih dalam spec ±2°C DHT11.

Boleh guna Arduino Uno ganti ESP32?

Arduino Uno boleh jalankan projek ini dengan tiga library yang sama, cuma pin sahaja berubah: SDA OLED ke A4, SCL ke A5, dan signal DHT11 ke pin digital 2 (kemas kini DHTPIN). Bekalkan kedua-dua modul dari pin 5V Uno — modul DHT11 terima 3.3–5.5V, dan modul OLED ini ada regulator bekalan sendiri di atas board, sebab itulah semua projek klasik Uno OLED memang suap 5V padanya.

Yang hilang ialah WiFi: Uno boleh papar bacaan secara lokal tapi takkan boleh hantar ke phone anda. Kalau weather station yang connected memang matlamat akhir, mula terus dengan ESP32 — perbandingan ESP32 vs ESP8266 vs Uno kami huraikan bila setiap board masuk akal.

Kesilapan biasa yang kami nampak dari pelanggan sebenar

Corak paling mahal ialah wiring OLED dengan wayar-merah-dulu ikut muscle memory. Pada display ini, itu meletakkan VCC pada pin GND, dan bekalan terbalik boleh bunuh modul serta-merta — inilah satu-satunya kesilapan dalam projek ini yang hardware tak maafkan.

Seterusnya, mengikut gambarajah sensor bare padahal guna modul 3-pin: tercari-cari pin keempat, tambah pull-up yang tak perlu, atau percaya warna wayar dalam gambarajah dan bukannya penanda S, VCC dan GND yang tercetak pada modul itu sendiri. Silkscreen pada modul sentiasa menang.

Di bahagian software, perangkap biasa ialah kod paste dengan DHTTYPE DHT22 tertinggal, yang buat DHT11 yang elok pulangkan nan selama-lamanya. Dan banyak projek pertama tersekat lebih awal lagi — pada kabel micro-USB charge-only yang boleh bekalkan kuasa tapi tak boleh upload.

Kartun modul DHT11 tiga pin biru muda disambung ke ESP32 manakala sensor bare empat pin generik dipangkah
DHT11 kami ialah modul 3-pin dengan resistor pull-up sedia terpasang pada PCB hitamnya — abaikan gambarajah sensor bare 4-pin.

FAQ

Boleh ke DHT11 ukur suhu negatif macam dalam peti sejuk?

Tak boleh. DHT11 baca 0–50°C, jadi ia berhenti pada takat beku. Untuk log peti sejuk atau freezer, pilih varian DHT22 yang boleh baca sampai −40°C — wiring dan sketch kekal sama kecuali satu baris.

Perlu ke tambah resistor 10k untuk DHT11?

Tak perlu dengan modul kami. Modul DHT11 3-pin sudah ada resistor pull-up terbina pada PCB-nya, jadi ia sambung terus ke ESP32 dengan tiga wayar sahaja. Hanya sensor bare 4-pin yang perlukan pull-up luaran.

Kenapa OLED saya tak papar apa-apa walaupun kod berjaya upload?

Biasanya alamat I2C atau wiring. Jalankan contoh WireScan dari core ESP32: kalau ia cetak 0x3D, tukar OLED_ADDR; kalau tiada apa dijumpai, semak semula SDA pada GPIO21, SCL pada GPIO22, dan pastikan GND dan VCC ikut susunan pin GND-dulu display ini.

Boleh ke projek ini guna power bank?

Boleh — keseluruhan litar tarik arus yang sedikit sahaja, dan power bank ke port micro-USB menjadikannya mudah alih. Sesetengah power bank auto-off pada beban ringan; panduan power supply ESP32 kami cover hal itu dan pilihan jangka panjang.

Perlu ke breadboard untuk projek ini?

Tak perlu. Board ESP32, modul DHT11 dan OLED semuanya datang dengan pin header male, jadi tujuh jumper wire female-to-female cukup untuk sambung semuanya terus. Guna breadboard hanya kalau anda nak pemasangan lebih kemas atau merancang tambah sensor lain nanti.

Kemas kini terakhir Ogos 2026. Tersangkut? Chat dengan kami di WhatsApp.

Leave a Reply

Your email address will not be published. Required fields are marked *