
Giám sát nhà kính: nhiệt độ/độ ẩm/ánh sáng tự động điều chỉnh quạt/mái che
Dùng ESP32 + DHT22 + cảm biến ánh sáng LDR để giám sát nhiệt độ, độ ẩm và ánh sáng trong nhà kính, tự động bật quạt làm mát khi quá nóng và kéo mái che khi nắng gắt qua 2 relay, tiết kiệm năng lượng.
Tổng Quan Dự Án: Giám Sát Nhà Kính Thông Minh
Dự án 'Giám sát nhà kính: nhiệt độ/độ ẩm/ánh sáng tự động điều chỉnh quạt/mái che' là một ứng dụng IoT thú vị, sử dụng ESP32, cảm biến DHT22 và cảm biến ánh sáng LDR để giám sát và điều khiển môi trường trong nhà kính. Mục tiêu của dự án là tự động hóa việc điều chỉnh quạt làm mát và mái che khi nhiệt độ và độ sáng vượt quá ngưỡng cho phép, từ đó tiết kiệm năng lượng và tối ưu hóa điều kiện phát triển cây trồng.
Bạn Sẽ Học Được Gì?
- Cách sử dụng ESP32 để thu thập dữ liệu từ các cảm biến.
- Phương pháp kết nối và lập trình cảm biến DHT22 để đo nhiệt độ và độ ẩm.
- Cách sử dụng cảm biến ánh sáng LDR để phát hiện mức độ ánh sáng.
- Cách điều khiển relay để bật tắt quạt và mái che tự động.
- Quản lý dữ liệu và tối ưu hóa năng lượng trong hệ thống nhà kính.
Những Tính Năng Chính
- Giám sát Nhiệt Độ và Độ Ẩm: Sử dụng cảm biến DHT22 để theo dõi các thông số môi trường.
- Cảm Biến Ánh Sáng: Cảm biến LDR giúp xác định mức độ ánh sáng trong nhà kính.
- Điều Khiển Tự Động: Hệ thống tự động bật quạt làm mát khi nhiệt độ cao và kéo mái che khi có ánh sáng mạnh.
- Tích Hợp ESP32: Sử dụng vi điều khiển ESP32 để kết nối và điều khiển các cảm biến và relay.
- Tối Ưu Hóa Năng Lượng: Giảm thiểu tiêu thụ năng lượng và duy trì điều kiện lý tưởng cho cây trồng.
Tại Sao Dự Án Này Thú Vị?
Dự án này không chỉ giúp bạn nắm vững các khái niệm cơ bản về IoT mà còn cung cấp cho bạn kỹ năng thực hành trong việc lập trình và thiết kế hệ thống tự động. Việc áp dụng công nghệ vào nông nghiệp thông minh đang ngày càng trở nên phổ biến và có ý nghĩa quan trọng trong việc cải thiện năng suất và chất lượng nông sản. Ngoài ra, dự án còn hướng đến việc tiết kiệm năng lượng, góp phần bảo vệ môi trường và phát triển bền vững. Với sự phát triển nhanh chóng của công nghệ, các giải pháp IoT trong nông nghiệp sẽ mở ra nhiều cơ hội mới cho người làm nông và các nhà nghiên cứu.
Hướng dẫn chi tiết
Dùng ESP32 + DHT22 + LDR để giám sát nhà kính, tự động bật quạt và kéo mái che qua 2 relay khi vượt ngưỡng nhiệt độ/ánh sáng, có hysteresis chống nhấp nháy relay.
1. Giới thiệu
Nhà kính giúp kiểm soát tiểu khí hậu cho cây trồng, nhưng nếu phải canh nhiệt độ, độ ẩm và ánh sáng bằng tay thì rất tốn công và dễ sai lệch vào lúc trời thay đổi đột ngột. Dự án này dùng ESP32 kết hợp cảm biến DHT22 (nhiệt độ/độ ẩm) và module quang trở LDR (ánh sáng) để giám sát liên tục điều kiện bên trong nhà kính, sau đó tự động bật quạt làm mát khi nhiệt độ vượt ngưỡng và kéo mái che khi ánh nắng quá gắt, thông qua 2 relay độc lập điều khiển 2 tải khác nhau (quạt và motor/mái che).
Hệ thống dùng cơ chế hysteresis (ngưỡng bật khác ngưỡng tắt) để tránh đóng/tắt relay liên tục khi giá trị cảm biến dao động quanh ngưỡng — giúp quạt và mái che vận hành bền hơn, ít hao mòn tiếp điểm relay.
2. Linh kiện cần có
Linh kiện | Số lượng | Giá tham khảo |
|---|---|---|
ESP32 DevKit V1 (30 chân) | 1 | ~90.000 - 120.000đ |
DHT22 (AM2302) – Nhiệt độ & Độ ẩm | 1 | ~45.000 - 60.000đ |
Module LDR – Cảm biến quang trở | 1 | ~10.000 - 15.000đ |
Relay module 1 kênh – 5V (điều khiển quạt) | 1 | ~20.000 - 30.000đ |
Relay module 1 kênh – 5V (điều khiển mái che/motor) | 1 | ~20.000 - 30.000đ |
Dây jumper, breadboard, nguồn 5V cho relay/quạt | 1 bộ | ~20.000 - 40.000đ |
Lưu ý an toàn:
Quạt/motor mái che thường dùng nguồn AC hoặc DC riêng qua tiếp điểm NO/COM của relay, không cấp trực tiếp điện lưới vào ESP32.
Nếu điều khiển tải AC, cần thợ điện có kinh nghiệm đấu nối và cách ly tốt.
3. Sơ đồ kết nối
DHT22 | ESP32 |
|---|---|
VCC | 3V3 |
GND | GND |
DATA | GPIO27 |
LDR module | ESP32 |
|---|---|
VCC | 3V3 |
GND | GND |
AO (Analog Out) | GPIO34 (ADC1_CH6, input-only) |
Relay 1 (Quạt làm mát) | ESP32 |
|---|---|
VCC | VIN (5V) |
GND | GND |
IN | GPIO26 |
Relay 2 (Mái che) | ESP32 |
|---|---|
VCC | VIN (5V) |
GND | GND |
IN | GPIO25 |
Lưu ý quan trọng:
Relay module dùng cuộn dây 5V — phải cấp nguồn VCC từ chân VIN (5V) của ESP32, KHÔNG dùng chân 3V3 vì relay sẽ không đủ điện áp để đóng tiếp điểm ổn định (đây là lỗi wiring rất phổ biến).
Relay IN là active-low: mức LOW kích hoạt đóng tiếp điểm.
4. Code ví dụ #1 – Đọc cảm biến và in dữ liệu JSON qua Serial
#include <DHT.h>
#define DHTPIN 27
#define DHTTYPE DHT22
#define LDR_PIN 34
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
}
void loop() {
float humidity = dht.readHumidity();
float tempC = dht.readTemperature();
int lightRaw = analogRead(LDR_PIN);
if (isnan(humidity) || isnan(tempC)) {
Serial.println("Loi doc DHT22!");
} else {
Serial.print("Nhiet do: "); Serial.print(tempC); Serial.println(" *C");
Serial.print("Do am: "); Serial.print(humidity); Serial.println(" %");
Serial.print("Anh sang (raw ADC): "); Serial.println(lightRaw);
}
delay(2000); // DHT22 can toi thieu 2s giua 2 lan doc
}
5. Code ví dụ #2 – Điều khiển relay theo ngưỡng cố định (không hysteresis)
#define RELAY_FAN_PIN 26
#define RELAY_ON LOW
#define RELAY_OFF HIGH
const float TEMP_THRESHOLD = 32.0;
void setup() {
pinMode(RELAY_FAN_PIN, OUTPUT);
digitalWrite(RELAY_FAN_PIN, RELAY_OFF);
}
void loop() {
float tempC = 33.5; // thay bang gia tri doc tu DHT22 thuc te
if (tempC > TEMP_THRESHOLD) {
digitalWrite(RELAY_FAN_PIN, RELAY_ON); // bat quat
} else {
digitalWrite(RELAY_FAN_PIN, RELAY_OFF); // tat quat
}
delay(2000);
}
6. Code ví dụ #3 – Ứng dụng thực tế: giám sát nhà kính đầy đủ với hysteresis
/*
Giam sat nha kinh: nhiet do / do am / anh sang tu dong dieu chinh quat/mai che
Board: ESP32 DevKit V1 (30 pins)
Cam bien: DHT22 (nhiet do/do am), LDR module (anh sang)
Co cau chap hanh: Relay 1 kenh x2 (quat lam mat, mai che/motor bong)
Wiring (khop voi diagram tren IoTLabs Maker):
DHT22 DATA -> GPIO27 VCC -> 3V3 GND -> GND
LDR AO -> GPIO34 (ADC1_CH6, input-only) VCC -> 3V3 GND -> GND
Relay1 (quat) IN -> GPIO26 VCC -> VIN(5V) GND -> GND
Relay2 (mai che) IN -> GPIO25 VCC -> VIN(5V) GND -> GND
Nguong dieu khien (co the tuy chinh qua Serial hoac hard-code):
- Bat quat khi nhiet do > TEMP_FAN_ON
- Bat mai che (che nang) khi anh sang (LDR) > LIGHT_SHADE_ON (sang gat)
*/
#include <DHT.h>
#define DHTPIN 27
#define DHTTYPE DHT22
#define LDR_PIN 34
#define RELAY_FAN_PIN 26
#define RELAY_SHADE_PIN 25
// Relay module active-low: LOW = kich hoat (dong tiep diem)
#define RELAY_ON LOW
#define RELAY_OFF HIGH
const float TEMP_FAN_ON = 32.0; // *C - bat quat khi vuot nguong
const float TEMP_FAN_OFF = 29.0; // *C - tat quat (hysteresis tranh dong tat lien tuc)
const int LIGHT_SHADE_ON = 2800; // ADC raw (0-4095), cang lon = cang toi -> tuy module
const int LIGHT_SHADE_OFF = 1800;
DHT dht(DHTPIN, DHTTYPE);
bool fanState = false;
bool shadeState = false;
unsigned long lastRead = 0;
const unsigned long READ_INTERVAL_MS = 2000; // DHT22 lay mau toi thieu 2s/lan
void applyRelay(int pin, bool on) {
digitalWrite(pin, on ? RELAY_ON : RELAY_OFF);
}
void setup() {
Serial.begin(115200);
delay(300);
Serial.println();
Serial.println(F("=== Giam sat nha kinh IoTLabs - Boot OK ==="));
pinMode(RELAY_FAN_PIN, OUTPUT);
pinMode(RELAY_SHADE_PIN, OUTPUT);
applyRelay(RELAY_FAN_PIN, false);
applyRelay(RELAY_SHADE_PIN, false);
dht.begin();
Serial.println(F("DHT22 + LDR + 2 Relay san sang. Bat dau vong lap giam sat."));
}
void loop() {
unsigned long now = millis();
if (now - lastRead < READ_INTERVAL_MS) {
return;
}
lastRead = now;
float humidity = dht.readHumidity();
float tempC = dht.readTemperature();
int lightRaw = analogRead(LDR_PIN);
bool dhtOk = !(isnan(humidity) || isnan(tempC));
if (!dhtOk) {
// Cam bien loi/chua on dinh -> bao cao degrade, khong dieu khien mu quang theo du lieu rac
Serial.print(F("{\"temp_c\":null,\"humidity\":null,\"light_raw\":"));
Serial.print(lightRaw);
Serial.print(F(",\"fan\":"));
Serial.print(fanState ? "true" : "false");
Serial.print(F(",\"shade\":"));
Serial.print(shadeState ? "true" : "false");
Serial.println(F(",\"status\":\"dht_error\"}"));
return;
}
// Hysteresis dieu khien quat theo nhiet do
if (!fanState && tempC > TEMP_FAN_ON) {
fanState = true;
applyRelay(RELAY_FAN_PIN, true);
} else if (fanState && tempC < TEMP_FAN_OFF) {
fanState = false;
applyRelay(RELAY_FAN_PIN, false);
}
// Hysteresis dieu khien mai che theo anh sang (raw ADC cang cao = cang toi tuy module)
if (!shadeState && lightRaw > LIGHT_SHADE_ON) {
shadeState = true;
applyRelay(RELAY_SHADE_PIN, true);
} else if (shadeState && lightRaw < LIGHT_SHADE_OFF) {
shadeState = false;
applyRelay(RELAY_SHADE_PIN, false);
}
Serial.print(F("{\"temp_c\":"));
Serial.print(tempC, 1);
Serial.print(F(",\"humidity\":"));
Serial.print(humidity, 1);
Serial.print(F(",\"light_raw\":"));
Serial.print(lightRaw);
Serial.print(F(",\"fan\":"));
Serial.print(fanState ? "true" : "false");
Serial.print(F(",\"shade\":"));
Serial.print(shadeState ? "true" : "false");
Serial.println(F(",\"status\":\"ok\"}"));
}
7. Lỗi thường gặp
Lỗi | Nguyên nhân | Cách sửa |
|---|---|---|
DHT22 trả về NaN liên tục | Đọc quá nhanh (dưới 2s/lần), dây DATA không có điện trở kéo lên, hoặc dây quá dài | Đảm bảo delay ≥ 2000ms giữa các lần đọc; thêm điện trở 10kΩ kéo lên giữa DATA và VCC nếu dùng module trần |
Relay không đóng tiếp điểm dù GPIO đã set LOW | Relay VCC nối vào 3V3 thay vì VIN(5V) — không đủ điện áp kích cuộn dây | Cấp nguồn relay từ chân VIN (5V) của ESP32, không dùng 3V3 |
Quạt/mái che đóng/tắt liên tục (nhấp nháy relay) | Ngưỡng bật và tắt giống nhau, giá trị cảm biến dao động quanh ngưỡng | Dùng hysteresis: ngưỡng tắt thấp hơn ngưỡng bật vài độ (như code ví dụ #3) |
Giá trị LDR không đổi dù trời sáng/tối khác nhau | Đọc nhầm chân DO (digital) thay vì AO (analog), hoặc biến trở trên module chưa chỉnh | Dùng analogRead() trên chân AO; chỉnh biến trở trên module nếu cần mở rộng dải đo |
8. Tổng kết
Hệ thống giám sát nhà kính này cho phép tự động hóa 2 phản ứng quan trọng nhất trong nông nghiệp nhà kính: làm mát khi quá nóng và che nắng khi ánh sáng quá gắt, mà không cần người trực theo dõi liên tục. Cơ chế hysteresis giúp bảo vệ tuổi thọ relay và tránh dao động điều khiển không cần thiết.
Người dùng có thể mở rộng thêm bằng cách gửi dữ liệu JSON qua MQTT/WiFi lên dashboard để theo dõi từ xa, hoặc thêm cảm biến độ ẩm đất để tưới tự động, biến đây thành một hệ thống nhà kính thông minh hoàn chỉnh.