Hướng dẫn DHT11 / DHT22 ESP32 kèm code mẫu trên Arduino IDE

Trong bài này, IoTZone sẽ hướng dẫn bạn cách đo nhiệt độ, độ ẩm trên cảm biến DHT11 / DHT22 ESP32 thông qua phần mềm Arduino IDE nhé! Mình sẽ giải thích chi tiết từng bước và từng dòng lệnh cho bạn dễ hình dung.

Giới thiệu cảm biến DHT11 / DHT22 ESP32

Cả hai loại DHT11 và DHT22 đều là cảm biến đo nhiệt độ và độ ẩm. Đây là các cảm biến cực kỳ phổ biến với các anh em maker khi làm việc với các dự án liên quan đến nhiệt độ, độ ẩm:

Giới thiệu cảm biến DHT11 / DHT22 ESP32

Trong các cảm biến DHT11 / DHT22 này có sẵn các con chip, giúp chuyển đổi thành tín hiệu kỹ thuật số, cho phép chúng ta dễ dàng sử dụng hơn.

Tuy đều là đo nhiệt độ, nhưng cảm biến DHT22 ESP32 sẽ có độ phân giải cũng như phạm vi đo nhiệt độ độ ẩm cao hơn so với DHT11. Tuy nhiên, vì chất lượng tốt hơn nên giá thành của DHT22 sẽ hơi nhỉnh hơn đôi chút, và chúng ta chỉ có thể yêu cầu cảm biến này đọc thông tin trong khoản 2 giây.

Ngược lại, cảm biến DHT11 hỗ trợ chúng ta đọc thông tin mỗi giây, và chúng có chi phí rẻ hơn đôi chút.

Bạn có thể xem bảng so sánh về thông số kỹ thuật giữa cảm biến DHT11 và DHT22 qua bảng dưới để hiểu hơn:

Cảm biến DHT11Cảm biến DHT22
Khoảng giá trị nhiệt độ đo được0 – 50 độ C (+/- 2 độ C)-40 đến 80 độ C (+/- 0,5 độ C)
Khoảng giá trị độ ẩm đo được20 đến 90% (+/- 5%)0 đến 100% (+/- 2%)
Sai sốĐộ ẩm: 1%, nhiệt độ: 1 độ CĐộ ẩm: 0,1%, nhiệt độ: 0,1 độ C
Điện áp3V – 5,5V3V – 6V
Dòng điện0,5 – 2,5 mA1 – 1,5mA
Thời gian lấy mẫu1 giây2 giây

Mặc dù có các điểm khác biệt, nhưng nhìn chung thì cảm biến DHT11 và DHT22 đều hoạt động khá giống nhau và cũng chỉ có công dụng là đo nhiệt độ và độ ẩm.

Bạn có thể chọn bất kỳ loại cảm biến nào mình thích và làm theo hướng dẫn bên dưới nhé!

Giới thiệu về sơ đồ chân của cảm biến DHT11 / DHT22 ESP32

Trên cảm biến DHT có 4 chân. Tuy nhiên, trong đó chúng ta chỉ dùng 3 chân như sau:

  • Chân 1: Kết nối với chân 3,3V
  • Chân 2: Kết nối với các chân GPIO
  • Chân 3: Không sử dụng
  • Chân 4: Kết nối với chân GND
Giới thiệu về sơ đồ chân của cảm biến DHT11 / DHT22 ESP32

Chuẩn bị

  • ESP32
  • Cảm biến DHT11 / DHT22
  • Breadboard
  • Dây Jumper

Kết nối

Bạn kết nối ESP32 DHT11 hoặc DHT22 tại chân GPIO 4 nhé!

Kết nối cảm biến DHT11 / DHT22 ESP32
Kết nối cảm biến DHT11 / DHT22 ESP32

Cài thư viện

Bạn hãy truy cập vào Sketch Include Library > Manage Libraries rồi tải về 2 thư viện sau nhé:

  • DHT library from Adafruit
  • Adafruit Unified Sensor library

Nạp chương trình

Bạn nạp chương trình sau vào ESP32:

#include "DHT.h"

#define DHTPIN 4     // Digital pin connected to the DHT sensor
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors.  This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println(F("DHTxx test!"));

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));
}

Dưới đây, mình sẽ giải thích chi tiết về từng dòng lệnh:

Thêm thư viện “DHT.h” vào chương trình của bạn. Thư viện này chứa các hàm và thông tin cần thiết để tương tác với cảm biến độ ẩm và nhiệt độ DHT.

#include "DHT.h"

Xác định chân mà cảm biến DHT11 / DHT22 kết nối với ESP32 là chân GPIO 4:

#define DHTPIN 4     // Digital pin connected to the DHT sensor

Xác định cảm biến bạn dùng là DHT11 hay DHT22 ESP32, như mình là đang dùng DHT22:

//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

Tạo đối tượng DHT:

DHT dht(DHTPIN, DHTTYPE);

Khởi tạo màn hình Serial Monitor ở tốc độ 9600 và in ra màn hình Serial:

Serial.begin(9600);
Serial.println(F("DHTxx test!"));

Khởi tạo cảm biến DHT:

dht.begin();

Trong vòng lặp loop() cho độ trễn 2000ms (là 2 giây), vì cảm biến DHT22 ESP32 mình dùng có thời gian lấy mẫu là 2 giây. Điều này đồng nghĩa với sau mỗi 2 giây thì chúng ta sẽ nhận được một kết quả về nhiệt độ:

delay(2000);

Kết quả nhiệt độ, độ ẩm hiện tại đang trả về dưới hình thức float, chúng ta cần tạo các biến là h (độ ẩm) và t (nhiệt độ) để lưu các giá trị này:

float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();

Với nhiệt độ, nếu bạn cần đo theo thang đo F thì bạn viết như sau:

float f = dht.readTemperature(true);

Kiểm tra xem giá trị nhiệt độ gửi về từ cảm biến DHT11 / DHT22 có đúng và hợp lệ không:

if (isnan(h) || isnan(t) || isnan(f)) {
   Serial.println(F("Failed to read from DHT sensor!"));
   return;

Tính chỉ số nhiệt dựa trên thang đo C hoặc thang đo F:

// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);

In tất cả kết quả lên màn hình Serial Monitor:

Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("%  Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(f);
Serial.print(F("°F  Heat index: "));
Serial.print(hic);
Serial.print(F("°C "));
Serial.print(hif);
Serial.println(F("°F"));

Kết quả

Bây giờ, hãy nạp đoạn code trên vào mạch ESP32 của bạn, rồi mở màn hình Serial Monitor ở tốc độ 9600 để xem thử nhé!

Số liệu về nhiệt độ, độ ẩm từ cảm biến DHT11 / DHT22 ESP32 sẽ được cập nhật liên tục (theo chu kỳ 2 giây 1 lần):

Kết quả dự án đo nhiệt độ, độ ẩm từ cảm biến DHT11 / DHT22 ESP32
Kết quả dự án đo nhiệt độ, độ ẩm từ cảm biến DHT11 / DHT22 ESP32

Các lỗi thường gặp

Nếu bạn bị lỗi và không đọc được nhiệt độ, độ ẩm từ cảm biến DHT11 / DHT22 ESP32, bạn hãy xử lý theo các cách sau, tùy theo từng trường hợp và xem thử nhé:

“Failed to read from DHT sensor!”

Biểu hiện: trên màn hình hiển thị dòng chữ “Failed to read from DHT sensor!” hoặc là Nan reading như dưới:

Lỗi thường gặp khi dùng cảm biến DHT11 / DHT22 ESP32

Cách khắc phục: Bạn hãy thử:

  • Kiểm tra lại dây cắm và kết nối các phần cứng đã đúng chưa
  • Kiểm tra lại nguồn điện áp xem có nằm trong mức phù hợp chưa (3V – 5,5V cho cảm biến DHT11 và 3V – 6V cho cảm biến DHT22)
  • Cổng USB cấp nguồn điện cho ESP32 bị kém chất lượng, hoặc do bạn cắm USB vào laptop nên không đủ nguồn điện. Bạn có thể cắm vào nguồn điện khác hoặc sử dụng các dây cáp USB ngắn hơn, hoặc USB có chất lượng tốt hơn
  • Kiểm tra trong đoạn code của bạn đã khai báo đúng loại cảm biến DHT mà bạn dùng chưa, như trong đoạn code của mình bên dưới là cảm biến DHT22 ESP32:
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
  • Tăng thời gian delay, vì đa phần các cảm biến DHT lấy mẫu khá chậm.
  • Đổi cảm biến DHT khác để thử, vì đôi khi cảm biến DHT11 / DHT22 bạn dùng đã bị hỏng
  • Tốc độ truyền của Serial Monitor bị sai hoặc bạn chưa upload code vào ESP32 được (do chọn sai cổng COM hoặc sai board mạch khi upload code)

Adafruit_Sensor.h: No such file or directory

Đây là một lỗi khá nhiệm trong, biểu hiện là bạn nhận được lỗi sau khi compile đoạn code:

fatal error: Adafruit_Sensor.h: No such file or directory 
#include <Adafruit_Sensor.h>

Khi đó, bạn cần cài đặt thư viện Adafruit Unified Sensor (tương tự như cài 2 thư viện trên mình đã hướng dẫn nhé).

Sau khi cài thư viện, bạn hãy khởi động lại Arduino, code sẽ hết lỗi.

Lời kết

Với bài hướng dẫn về cảm biến DHT11 / DHT22 ESP32 này, chúng ta đã cùng đi qua cách nhận thông tin từ cảm biến DHT và hiển thị lên màn hình Serial Monitor. Khá đơn giản phải không nào.

Dưới đây là một số dự án khác của IoTZone, bạn có thể tham khảo và làm theo nếu thích:

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *