Chuyên đề arduino – Giao tiếp cảm biến DHT11 đo độ ẩm và nhiệt độ

     Đo độ ẩm và nhiệt độ hiện nay đang được sử dụng rộng rãi trong các ứng dụng thực tế. Mục đích của các phương pháp đo này là để xác định độ ẩm và nhiệt độ để có phương pháp thay đổi để độ ẩm và nhiệt độ đạt mức yêu cầu. Bài hướng dẫn hôm nay tôi sẽ hướng dẫn cho các bạn giao tiếp cảm biến DHT11 đo độ ẩm và nhiệt độ. 

  NỘI DUNG BÀI VIẾT 

  • Tìm hiểu về cảm biến DHT11
  • Các lệnh cần thiết để điều khiển
  • Cài đặt thư viện
  • Khai báo thư viện DHT.h
  • Khai báo đối tượng thuộc thư viện DHT
  • Lệnh kích hoạt đối tượng – begin()
  • Lệnh đọc dữ liệu độ ẩm từ cảm biến – readHumidity()
  • Lệnh đọc nhiệt độ dạng độ C – readTemperature()
  • Lệnh đọc nhiệt độ dạng độ F – readTemperature(true)
  • Ứng dụng đo nhiệt độ và độ ẩm

  1. TÌM HIỂU VỀ CẢM BIẾN DHT11 

Sơ đồ chân cảm biến DH11

    Cảm biến DHT11 là cảm biến được sử dụng để đo được cả về nhiệt độ và độ ẩm. Các chức năng đo đã được tích hợp sẵn, chúng ta chỉ cần cấp nguồn và đọc dữ liệu từ cảm biến. Cảm biến DHT11 có tín hiệu đầu ra là giá trị số, điều này đảm bảo độ tín cậy cao và không có bị nhiễu. Dữ liệu ngõ ra là tín hiệu số dạng 8 bit, tương thích với nhiều dòng vi điều khiển. Công việc điều khiển cũng rất đơn giản. Chúng ta chỉ việc cấp nguồn và đọc dữ liệu số từ chân tín hiệu.   

     Thông số kỹ thuật của DHT11

  • Kích thước nhỏ gọn.
  • Nguồn cấp từ 3V – 5.5VDC.
  • Dòng điện: 0.5mA đến 2.5mA
  • Giới hạn của độ ẩm: từ 20% đến 90%, sai số 5%.
  • Giới hạn đo nhiệt độ: từ 0 đến 50oC, sai số 2oC.
  • Giá trị được lưu trong thah ghi 8 bit
  • Thời gian đáp ứng mỗi lần đọc dữ liệu là 1s
  • Khoảng cách truyền tối đa: 20m 

 2. CÁC LỆNH CẦN THIẾT ĐỂ ĐIỀU KHIỂN 

 2.1 CÀI ĐẶT THƯ VIỆN 

   Trong lần đầu tiên lập trình để giao tiếp với cảm biến DHT11 chúng ta cần phải download thư viện DHT.h cho Arduino IDE. Các bạn có thể download từ nguồn internet để kích hoạt cho thư viện.

 2.2 KHAI BÁO THƯ VIỆN DHT.h 

     Trong chương trình chúng ta cần khai báo thư viện DHT.h và định nghĩa dạng cảm biến đang sử dụng. 

     Cú pháp: #include “DHT.h

                     #define Type DHT11

     Trong chương trình này chúng ta đang sử dụng dòng cảm biến DHT.h và định nghĩa loại cảm biến là DHT11.

   2.3 KHAI BÁO ĐỐI TƯỢNG THUỘC THƯ VIỆN DHT 

   Sau khi khai báo xong thư viện DHT, chúng ta cần khai báo các đối tượng mang kiểu dữ liệu DHT để thực hiện được các lệnh trong thư viện DHT.

   Cú pháp: <Tên thư viện>  <Tên cảm biến>(<Chân đọc cảm biến>, <Loại cảm biến>);

   Ví dụ: trong trường hợp tôi đang khai báo đối tượng có tên là HT, chân đọc cảm biến là chân số 2, thì dòng lệnh khai báo đối tượng được viết như sau:

    DHT   HT(2,Type);

  2.4 LỆNH KÍCH HOẠT ĐỐI TƯỢNG – begin() 

   Để kích hoạt chức năng đối tượng kiểu dữ liệu DHT thì chúng ta phải thực hiện lệnh begin().

   Cú pháp:  <Tên đối tượng>.begin()

   Ví dụ: đối tượng được khai báo là HT thì lệnh kích hoạt được viết là.

   HT.begin();

   2.5 LỆNH ĐỌC ĐỘ ẨM TỪ CẢM BIẾN – readHumidity() 

   Cú pháp: <Biến nhận độ ẩm> = <Tên đối tượng>.readHumidity();

   Trong lệnh đọc cảm biến các bạn cần phải khai báo biến nhận độ ẩm. Giá trị độ ẩm đọc được là số thập phân, do vậy kiểu dữ liệu cho biến nhận độ ẩm là float.

   Ví dụ

    float do_am;

    do_am = HT.readHumidity();

   2.6 LỆNH ĐỌC NHIỆT ĐỘ DẠNG ĐỘ C – readTemperature() 

   Cú pháp: <Biến nhận nhiệt độ C> = <Tên đối tượng>.readTemperature();

   Trong lệnh đọc cảm biến nhiệt độ dạng độ C các bạn cần phải khai báo biến nhận nhiệt độ. Giá trị nhiệt độ đo được là số thập phân nên kiểu dữ liệu cho biến nhận nhiệt độ loại độ C là float.

   Ví dụ

    float do_C;

    do_C = HT.readTemperature();

  2.7 LỆNH ĐỌC NHIỆT ĐỘ DẠNG ĐỘ F – readTemperature(true) 

   Cú pháp: <Biến nhận nhiệt độ F> = <Tên đối tượng>.readTemperature(true);

   Trong lệnh đọc cảm biến nhiệt độ dạng độ F các bạn cần phải khai báo biến nhận nhiệt độ. Giá trị nhiệt độ đo được là số thập phân nên kiểu dữ liệu cho biến nhận nhiệt độ loại độ F là float.

   Ví dụ

    float do_F;

    do_F = HT.readTemperature(true);

  3. ỨNG DỤNG ĐO NHIỆT ĐỘ VÀ ĐỘ ẨM 

   Ví dụ 1: Đo nhiệt độ và độ ẩm bằng cảm biến DHT11. Dữ liệu đo được hiển thị lên màn hình serial.

   Linh kiện cần thiết

Linh kiện Số lượng
Bo arduino UNO 01
Cảm biến DHT11 01

   Sơ đồ kết nối phần cứng

     Bạn cần có điện trở kéo lên tại chân tín hiệu của cảm biến. Khi sử dụng điện trở kéo lên đảm bảo tín hiệu không bị nhiễu hay sai lệch.

   Đoạn code chương trình

#include "DHT.h"
#define Type DHT11
int sensorPin=2;
DHT HT(sensorPin,Type);
float do_am;
float do_C;
float do_F;
 
void setup() {
Serial.begin(9600);
pinMode(sensorPin, INPUT);
HT.begin();
delay(500);
}
 
void loop() {
do_am=HT.readHumidity();
do_C=HT.readTemperature();
do_F=HT.readTemperature(true);
 
Serial.print("Do am: ");
Serial.print(do_am);
Serial.print("Nhiet do: ");
Serial.print(do_C);
Serial.print(" C ");
Serial.print("do_F);
Serial.println(" F ");
delay(1000); 
} 

   Giải thích chương trình

    Khai báo thư viện và biến

#include "DHT.h" 
#define Type DHT11 
int sensorPin=2; 
DHT HT(sensorPin,Type); 
float do_am; 
float do_C; 
float do_F;

      Trong chương trình chúng ta cần khai báo thư viện DHT.h để arduino hiểu được các linh kiện cần thiết. Sau khi khai báo xong thư viện chúng ta định nghĩa kiểu cảm biến DHT11 đang sử dụng.

     Lệnh DHT HT(sensorPin, Type) là lệnh để khai báo đối tượng HT mang kiểu dữ liệu DHT. Mục đích của dòng khai báo này là cho phép đối tượng HT sử dụng được các lệnh có trong thư viện DHT.h.

     Tiếp theo chúng ta thực hiện các lệnh khai báo các biến kiểu float để lưu trữ giá trị của độ ẩm, nhiệt độ dạng độ C, nhiệt độ dạng độ F. 

     Các lệnh trong chương trình void setup()

void setup() { 
Serial.begin(9600); 
pinMode(sensorPin, INPUT);
HT.begin(); 
delay(500); 
}

    Chúng ta khai báo Serial.begin(9600) để kích hoạt chức năng truyền dữ liệu nối tiếp lên màn hình. Tốc độ truyền dữ liệu thông thường lên máy tính là 9600 bau.    

    Trong chương trình void setup() chúng ta dùng lệnh pinMode() để định nghĩa chân sensorPin là chân đọc dữ liệu chỗ arduino. Bản chất của dữ liệu đọc được từ cảm biến là dữ liệu số, nên chúng ta có thể sử dụng chân số 2 để đọc. 

     Ngoài ra, trong chương trình void setup() này chúng ta cần phải dùng lệnh delay(500). Mục đích để chờ cho cảm biến ổn định khi mới cấp nguồn rồi mới thực hiện đọc dữ liệu.

     Đoạn chương trình void loop()

void loop() { 
do_am=HT.readHumidity(); 
do_C=HT.readTemperature(); 
do_F=HT.readTemperature(true); 
Serial.print("Do am: "); 
Serial.print(do_am); 
Serial.print("Nhiet do: "); 
Serial.print(do_C); 
Serial.print(" C "); 
Serial.print("do_F); 
Serial.println(" F "); 
delay(1000); 
}

   Trong đoạn chương trình chính void loop() chúng ta chỉ việc đọc dữ liệu từ chân cảm biến. Lưu các giá trị đọc được vào các biến. Sau đó xuất dữ liệu lên màn hình Serial.

    Ví dụ 2: Ứng dụng đo độ ẩm và nhiệt độ bằng cảm biến DHT11 và hiển thị lên màn hình LCD 16×2.

   Các linh kiện cần thiết

Linh kiện Số lượng
Bo arduino UNO 01
Cảm biến DHT11 01
LCD 16×2 01
Biến trở 01

     Sơ đồ kết nối

     Đoạn code chương trình 

#include "DHT.h"
#define Type DHT11
#include <LiquidCrystal.h>
int rs=12;
int en=11;
int d4=5;
int d5=4;
int d6=3;
int d7=2;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);
 
int sensorPin=7;
DHT HT(sensorPin,Type);
float do_am;
float do_C;
float do_F;

void setup() {
HT.begin();
delay(500);
lcd.begin(16,2); 
}
 
void loop() {
do_am=HT.readHumidity();
do_C=HT.readTemperature();
do_F=HT.readTemperature(true);
 
lcd.setCursor(0,0);
lcd.print("Nhiet do F= ");
lcd.print(do_F);
lcd.setCursor(0,1);
lcd.print("Do am= ");
lcd.print(do_am);
lcd.print(" %");
delay(500);
lcd.clear();
 
Serial.print("Do am: ");
Serial.print(do_am);
Serial.print("% Nhiet do ");
Serial.print(do_C);
Serial.print(" C ");
Serial.print(do_F);
Serial.println(" F "); 
}

     Giải thích chương trình

     Đoạn chương trình này hoàn toàn giống với chương trình trên về cấu trúc. Tuy nhiên, trong ví dụ này chúng ta muốn hiển thị lên LCD. Do vậy, cần có những lệnh riêng của LCD để hiển thị giá trị. Những lệnh riêng này tôi đã hướng dẫn rất kỹ trong bài viết giao tiếp arduino với LCD. Các bạn hãy xem lại bài viết LCD để hiểu rõ hơn. Chúc các bạn học tốt.

 

 


Categories:

Để lại một bình luận

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 *