Giám sát nhà kính: nhiệt độ/độ ẩm/ánh sáng tự động điều chỉnh quạt/mái che
Trung cấp1/8/2026- Tác giả: IoTlabs Maker

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.

esp32nha-kinhdht22cam-bien-anh-sangrelaysmart-farmnong-nghiep-thong-minh

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.