ESP32 Người mới

Đo nhiệt độ và độ ẩm bằng ESP32 và cảm biến DHT22

Nối DHT22 vào ESP32, cài thư viện Adafruit và in nhiệt độ, độ ẩm ra Serial Monitor mỗi hai giây.

30.09.20267 phút đọc

DHT22 đo nhiệt độ từ −40 đến 80°C với sai số khoảng ±0,5°C, và độ ẩm từ 0 đến 100%. So với DHT11 rẻ hơn, DHT22 chính xác hơn hẳn và đọc được nhiệt độ âm. Đổi lại, nó chỉ cho một kết quả mới mỗi hai giây.

Linh kiện cần có

Linh kiệnSố lượngGiá tham khảo
Bo ESP32 DevKit V11~90.000đ
Cảm biến DHT22 (AM2302)1~55.000đ
Điện trở 10kΩ1~500đ
Dây cắm breadboard3~5.000đ

Giá tham khảo ở các cửa hàng linh kiện tại Việt Nam, tháng 10/2026. Giá thay đổi theo thời điểm và nơi bán.

Sơ đồ nối dây

Chân linh kiệnNối vào
DHT22 chân 1 (VCC)3V3
DHT22 chân 2 (DATA)GPIO 4, kèm điện trở 10kΩ kéo lên 3V3
DHT22 chân 4 (GND)GND

Rút nguồn trước khi cắm dây. Kiểm tra lại toàn bộ sơ đồ rồi mới cắm USB.

Các bước thực hiện

Bước 1. Nối dây

Nhìn mặt có lưới của cảm biến, chân đánh số từ trái sang. Chân 3 không dùng. Điện trở 10kΩ nối giữa chân DATA và chân VCC, thiếu nó cảm biến thường trả về nan.

Bước 2. Cài hai thư viện

Vào Sketch → Include Library → Manage Libraries. Tìm và cài DHT sensor library của Adafruit, sau đó cài tiếp Adafruit Unified Sensor. Thiếu thư viện thứ hai thì code sẽ không biên dịch được.

Bước 3. Nạp và xem kết quả

Nạp code, mở Serial Monitor ở 115200. Mỗi hai giây sẽ có một dòng nhiệt độ và độ ẩm.

Mã nguồn

dht22_esp32.ino
#include "DHT.h"

#define DHTPIN  4
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  dht.begin();
  Serial.println("Bat dau doc DHT22");
}

void loop() {
  delay(2000);  // DHT22 chi cho ket qua moi moi 2 giay

  float doAm     = dht.readHumidity();
  float nhietDo  = dht.readTemperature();

  if (isnan(doAm) || isnan(nhietDo)) {
    Serial.println("Khong doc duoc cam bien!");
    return;
  }

  float nhietDoCamNhan = dht.computeHeatIndex(nhietDo, doAm, false);

  Serial.print("Nhiet do: ");
  Serial.print(nhietDo);
  Serial.print(" C  |  Do am: ");
  Serial.print(doAm);
  Serial.print(" %  |  Cam giac nhu: ");
  Serial.print(nhietDoCamNhan);
  Serial.println(" C");
}

Giải thích code

readTemperature() trả về độ C, thêm tham số true sẽ ra độ F. Hàm computeHeatIndex() tính nhiệt độ cảm nhận, kết hợp nhiệt độ với độ ẩm; tham số false nghĩa là đang làm việc với độ C.

Khi cảm biến lỗi, thư viện trả về nan (không phải một con số). Phải kiểm tra bằng isnan() chứ không so sánh với 0, vì 0°C là giá trị hợp lệ.

Lỗi thường gặp

  • Luôn in ra “Khong doc duoc cam bien”Thiếu điện trở kéo lên 10kΩ, hoặc cắm nhầm chân, hoặc cấp 5V cho bản DHT22 rời cần 3,3V.
  • Giá trị độ ẩm nhảy lung tungDây quá dài. Giữ dây dưới 20cm, hoặc dùng điện trở 4,7kΩ.
  • Lỗi biên dịch nhắc Adafruit_Sensor.hChưa cài thư viện Adafruit Unified Sensor.