Apa Projek Ni
Sambung ESP8266/NodeMCU dengan sensor gas MQ135 dan sensor suhu/kelembapan DHT22. Yang penting kat sini — wiring kena betul, especially voltage divider untuk MQ135 sebab output dia 5V tapi ESP8266 ADC max 3.3V.
Components
- ESP8266 / NodeMCU
- MQ135 gas sensor
- DHT22 temperature & humidity sensor
- Resistors: 10kΩ + 20kΩ (voltage divider), 4.7kΩ (DHT22 pull-up)
- Breadboard + jumper wires
Wiring
MQ135 → ESP8266
| MQ135 Pin | Connect To |
|---|---|
| VCC | 5V (Vin) |
| GND | GND |
| AOUT | Voltage divider → A0 |
Voltage divider: MQ135 AOUT → 10kΩ → A0 → 20kΩ → GND
Kenapa? MQ135 output 0-5V, ESP8266 ADC handle 0-3.3V je. Voltage divider scale down: 5V × (20k / 30k) = 3.3V. Safe.
DHT22 → ESP8266
| DHT22 Pin | Connect To |
|---|---|
| VCC | 3.3V |
| GND | GND |
| DATA | D4 (GPIO2) |
Pull-up resistor: 4.7kΩ antara DATA dan VCC (3.3V). Tanpa ni, bacaan jadi erratic.
Common Mistakes
- Tak pasang voltage divider — ADC ESP8266 boleh rosak kalau kena 5V direct
- Tak pasang pull-up resistor DHT22 — bacaan intermittent, kadang NaN
- Power MQ135 dari 3.3V — tak cukup, heater tak panas, reading tak accurate. Kena guna 5V (Vin)
- Baca MQ135 terus lepas power on — sensor perlu warm up 2-3 minit untuk stable reading
Quick Test Code
#include <DHT.h>
#define DHTPIN D4
#define DHTTYPE DHT22
#define MQ135PIN A0
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
delay(2000); // DHT22 startup
}
void loop() {
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int gas = analogRead(MQ135PIN);
Serial.printf("Temp: %.1f C, Humidity: %.1f%%, Gas: %d\n", temp, hum, gas);
delay(2000);
}
Kalau semua wiring betul, serial monitor patut show readings yang stable lepas 2-3 minit warm up.