Kết nối cảm biến nhiệt độ DHT11 và DHT22 với Arduino

Bạn muốn theo dõi dữ liệu về khí hậu trong nhà, hoặc xây dựng hệ thống kiểm soát nhiệt độ – độ ẩm? Cảm biến nhiệt độ – độ ẩm DHT11 hoặc DHT22 của sẽ là lựa chọn đơn giản và hoàn hảo cho bạn!

Cảm biến DHT11 / DHT22 đã được hiệu chỉnh sẵn, chỉ với một vài kết nối và một chút mã Arduino, bạn có thể bắt đầu đo độ ẩm tương đối và nhiệt độ ngay lập tức. Cảm biến cung cấp các chỉ số nhiệt độ và độ ẩm chính xác đến một chữ số thập phân. Nhược điểm duy nhất là cảm biến DHT11 / DHT22 chỉ cung cấp dữ liệu mới mỗi giây hoặc hai giây, nhưng với mức giá rẻ thì như vậy là quá tốt bạn không thể đòi hỏi gì hơn nữa.

Linh kiện sử dụng trong bài viết Shop liên kết bán hàng
Cảm biến nhiệt độ – độ ẩm DHT11
Cảm biến nhiệt độ – độ ẩm DHT22
Màn hình LCD1602 https://www.makerstore.vn/product/73563784/
Arduino Uno R3 https://www.makerstore.vn/product/80653977/

So sánh cảm biến DHT11 và DHT22

Cảm biến DHT11 và DHT22 là hai cảm biến được sử dụng phổ biến nhất trong dòng DHTxx. Chúng có vẻ giống nhau và có cùng cấu hình chân kết nối, nhưng thông số kỹ thuật thì khác nhau.

Trong hai loại này, DHT22 đắt hơn và chắc chắn có thông số kỹ thuật tốt hơn. DHT22 có thể đo nhiệt độ từ -40°C đến +125°C với độ chính xác ±0.5°C, trong khi DHT11 có thể đo nhiệt độ từ 0°C đến 50°C với độ chính xác ±2°C. Ngoài ra, cảm biến DHT22 có thể đo độ ẩm tương đối từ 0 đến 100% với độ chính xác 2-5%, trong khi cảm biến DHT11 chỉ có thể đo độ ẩm tương đối từ 20 đến 80% với độ chính xác 5%.

Bảng so sánh cấu hình chi tiết cảm biến DHT11 và DHT22:

DHT11 DHT22
Điện áp hoạt động 3-5V 3-5V
Dòng điện hoạt động 2.5mA max 2.5mA max
Phạm vi độ ẩm 20-80% (sai số 5%) 0-100% (sai số 2-5%)
Phạm vi nhiệt độ 0-50°C / ± 2°C -40 tới 80°C / ± 0.5°C
Tần suất lấy mẫu 1 Hz (1 giây / lần) 0.5 Hz (2 giây / lần)
Kích thước 15.5mm x 12mm x 5.5mm 15.1mm x 25mm x 7.7mm
Ưu điểm Giá rẻ hơn, tốc độ lấy mẫu cao hơn Chính xác hơn

Mặc dù DHT22 có độ chính xác cao hơn và có khả năng hoạt động trong một dải nhiệt độ và độ ẩm rộng hơn, nhưng có nhưng ưu điểm mà DHT11 hoàn toàn vượt trội hơn DHT22. Đó là giá thành rẻ hơn, kích thước nhỏ gọn hơn và có tốc độ lấy mẫu cao hơn. DHT11 thực hiện việc đọc dữ liệu một lần mỗi giây (hoặc tốc độ lấy mẫu 1Hz), trong khi DHT22 thực hiện việc đọc dữ liệu một lần mỗi hai giây (hoặc tốc độ lấy mẫu 0.5Hz).

Mặc dù có những khác biệt này, điện áp hoạt động của cả hai cảm biến đều dao động từ 3 đến 5 volt, với dòng điện tối đa là 2.5mA (trong quá trình chuyển đổi). Điểm hay nhất chính là cảm biến DHT11 và DHT22 có cùng chuẩn chân kết nối nên chúng có thể hoán đổi cho nhau, có nghĩa là nếu bạn xây dựng dự án của mình với một cảm biến, bạn có thể dễ dàng rút nó ra và thay thế bằng một cảm biến khác. Mã của bạn có thể cần điều chỉnh một chút, nhưng hệ thống dây vẫn giữ nguyên!

Bên trong cảm biến DHT11 và DHT22

Nếu bạn tháo vỏ cảm biến, bạn sẽ thấy một điện trở nhiệt độ NTC và một cảm biến độ ẩm bên trong.

Bên trong cảm biến DHT11
Bên trong cảm biến DHT22

Thành phần cảm biến độ ẩm bên trong DHT11 và DHT22 gồm hai điện cực với một lớp nền giữ ẩm ở giữa (thường là muối hoặc polymer nhựa dẫn điện).

Khi độ ẩm tăng lên, lớp nền sẽ hấp thụ hơi nước, dẫn đến việc giải phóng các ion và làm giảm điện trở giữa hai điện cực. Sự thay đổi điện trở này tỷ lệ thuận với độ ẩm, có thể được đo để ước tính độ ẩm tương đối.

Cấu trúc cảm biến độ ẩm bên trong DHT11 và DHT22

DHT11 và DHT22 cũng bao gồm một điện trở nhiệt NTC để đo nhiệt độ. NTC là một loại điện trở có thể thay đổi giá trị theo nhiệt độ.

Về mặt kỹ thuật, tất cả các điện trở đều là NTC theo nghĩa là điện trở của chúng thay đổi một chút theo nhiệt độ, nhưng sự thay đổi này thường rất nhỏ và khó đo. Điện trở nhiệt NTC được thiết kế để điện trở của chúng thay đổi đáng kể theo nhiệt độ (khoảng 100 ohms trở lên mỗi độ). Thuật ngữ “NTC” là viết tắt của “Hệ số nhiệt độ âm” (Negative Temperature Coefficient), nghĩa là điện trở giảm khi nhiệt độ tăng.

Điện trở nhiệt NTC

Sơ đồ chân cảm biến DHT11 và DHT22

Cảm biến DHT11 và DHT22 đều tương đối đơn giản để kết nối, cảm biến có 4 chân:

Sơ đồ chân kết nối DHT11 và DHT22
  • VCC(+): Chân này cung cấp nguồn điện cho cảm biến. Mặc dù điện áp cung cấp có thể dao động từ 3.3V đến 5.5V, nhưng nguồn điện 5V được khuyến nghị sử dụng. Với nguồn cung cấp 5V, cảm biến có thể được đặt cách xa vi điều khiển tới 20m. Với điện áp cung cấp 3.3V, cảm biến chỉ nên được đặt cách 1m nếu không sẽ gây ra hiện tượng sụt áp trên đường dây làm lỗi tín hiệu.
  • Data: Chân này được sử dụng để giao tiếp giữa cảm biến và vi điều khiển.
  • NC: không sử dụng (Not Connected)
  • GND(-): Đây là chân nối đất.

Kết nối cảm biến DHT11 và DHT22 với Arduino

Việc kết nối cảm biến DHTxx với Arduino rất đơn giản. Kết nối chân VCC(+) với chân nguồn 5V và chân GND(-) với chân GND của Arduino. Cuối cùng, kết nối chân Data với một chân digital (ví dụ ở đây là chân D8).

Để đảm bảo giao tiếp chính xác giữa cảm biến và Arduino, bạn cũng cần thêm một điện trở kéo lên 10K giữa chân DataVCC(+) để giữ tín hiệu ở mức HIGH.

Các sơ đồ dưới đây cho thấy cách kết nối tất cả các thành phần:

Kết nối cảm biến DHT11 với Arduino
Kết nối cảm biến DHT22 với Arduino

Cài đặt thư viện cảm biến DHT

Cảm biến DHT có giao thức truyền dữ liệu của riêng chúng, giao thức này yêu cầu thời gian lấy mẫu chính xác. Tuy nhiên, chúng ta không cần lo lắng quá nhiều về điều này, vì chúng ta sẽ sử dụng thư viện DHTlib, thư viện này xử lý hầu hết mọi thứ.

Để cài đặt thư viện, bạn hãy chọn trên thanh menu của Arduino IDE: Sketch > Include Library > Manage Libraries… rồi tìm kiếm từ khóa “dhtlib”. Nhấp vào kết quả đó và sau đó chọn cài đặt (Install).

Thư viện DHTlib

Ví dụ 1: Hiển thị và đọc thông số cảm biến DHT22 trên Serial Monitor

Sau khi cài đặt thư viện, sao chép và dán đoạn mã này vào Arduino IDE.

Đoạn mã kiểm tra sau đây sẽ in giá trị nhiệt độ và độ ẩm tương đối của cảm biến DHT22 vào màn hình serial.

Hãy nạp thử đoạn code này vào board sau đó kết nối module cảm biến:

#include <dht.h>
#define dataPin 8 // Defines pin number to which the sensor is connected
dht DHT; // Creats a DHT object

void setup() 
{
    Serial.begin(9600);
}
void loop() 
{
    //Uncomment whatever type you're using!
    int readData = DHT.read22(dataPin); // DHT22/AM2302
    //int readData = DHT.read11(dataPin); // DHT11

    float t = DHT.temperature; // Gets the values of the temperature
    float h = DHT.humidity; // Gets the values of the humidity

    // Printing the results on the serial monitor
    Serial.print("Temperature = ");
    Serial.print(t);
    Serial.print(" ");
    Serial.print((char)176);//shows degrees character
    Serial.print("C | ");
    Serial.print((t * 9.0) / 5.0 + 32.0);//print the temperature in Fahrenheit
    Serial.print(" ");
    Serial.print((char)176);//shows degrees character
    Serial.println("F ");
    Serial.print("Humidity = ");
    Serial.print(h);
    Serial.println(" % ");
    Serial.println("");

    delay(2000); // Delays 2 secods
}

Sau khi nạp đoạn mã, bạn sẽ thấy kết quả hiển thị ra trên Serial Monitor.

Cảm biến DHT22 Serial Monitor

Ví dụ 2: Hiển thị giá trị module cảm biến DHT22 trên màn hình LCD

Đây là giao diện hiển thị của LCD1602.

Hiển thị nhiệt độ – độ ẩm DHT22 trên LCD1602

Chúng ta hãy kết nối LCD như hình bên dưới.

Kết nối LCD1602 vào Arduino để hiển thị thông số cảm biến DHT22

Code Arduino

#include <LiquidCrystal.h> // includes the LiquidCrystal Library
#include <dht.h>
#define dataPin 8

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
dht DHT;
bool showcelciusorfarenheit = false;

void setup() 
{
    lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display
}

void loop() 
{
    int readData = DHT.read22(dataPin);
    float t = DHT.temperature;
    float h = DHT.humidity;
    lcd.setCursor(0,0); // Sets the location at which subsequent text written to the LCD will be displayed
    lcd.print("Temp.: "); // Prints string "Temp." on the LCD

    //Print temperature value in Celcius and Fahrenheit every alternate cycle
    if(showcelciusorfarenheit)
    {
        lcd.print(t); // Prints the temperature value from the sensor
        lcd.print(" ");
        lcd.print((char)223);//shows degrees character
        lcd.print("C");
        showcelciusorfarenheit = false;
    }
    else
    {
        lcd.print((t * 9.0) / 5.0 + 32.0); // print the temperature in Fahrenheit
        lcd.print(" ");
        lcd.print((char)223);//shows degrees character
        lcd.print("F");
        showcelciusorfarenheit = true;
    }
    
    lcd.setCursor(0,1);
    lcd.print("Humi.: ");
    lcd.print(h);
    lcd.print(" %");
    delay(5000);
}

nguồn: lastminuteengineers.com