🌡️ Hướng Dẫn Đọc Cảm Biến DHT11 Bằng PIC16F877A (CCS C)
Cảm biến DHT11 là một loại cảm biến phổ biến để đo nhiệt độ và độ ẩm trong các hệ thống nhúng. Trong bài viết này, chúng ta sẽ tìm hiểu cách kết nối và lập trình đọc dữ liệu DHT11 bằng vi điều khiển PIC16F877A sử dụng phần mềm CCS C Compiler.
📘 Mục lục
1. Giới thiệu cảm biến DHT11
DHT11 tích hợp cả cảm biến độ ẩm và cảm biến nhiệt độ trên cùng một module. Giao tiếp sử dụng 1 dây dữ liệu (1-Wire), giúp việc lập trình và kết nối dễ dàng. Dữ liệu truyền ở dạng số 8-bit (humidity integer, humidity decimal, temperature integer, temperature decimal, checksum).
- Điện áp hoạt động: 3V – 5V
- Độ ẩm: 20% – 90%RH (±5%)
- Nhiệt độ: 0°C – 50°C (±2°C)
- Chu kỳ lấy mẫu: 1 giây/lần
2. Sơ đồ nối dây với PIC16F877A
Sơ đồ kết nối cơ bản giữa DHT11 và PIC16F877A như sau:
- VCC → 5V
- DATA → RA0 (chân 2 trên PIC16F877A)
- GND → GND
- Điện trở kéo (Pull-up) 10kΩ nối giữa DATA và VCC
3. Nguyên lý giao tiếp 1-Wire
PIC gửi tín hiệu “Start” kéo chân DATA xuống thấp 18ms → cao 20-40µs. DHT11 phản hồi bằng cách kéo thấp 80µs và cao 80µs, sau đó gửi 40 bit dữ liệu (5 byte):
- Byte 1: Độ ẩm phần nguyên
- Byte 2: Độ ẩm phần thập phân (thường = 0)
- Byte 3: Nhiệt độ phần nguyên
- Byte 4: Nhiệt độ phần thập phân (thường = 0)
- Byte 5: Checksum = tổng 4 byte đầu (mod 256)
4. Code CCS C đọc DHT11
Dưới đây là ví dụ code CCS C cho PIC16F877A đọc DHT11 và hiển thị giá trị qua LCD 16×2:
//--------------------------------------------------
// Code: Đọc cảm biến DHT11 bằng PIC16F877A (CCS C)
//--------------------------------------------------
#include <16F877A.h>
#fuses NOWDT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include // Thư viện LCD chuẩn của CCS
#define DHT11_PIN PIN_A0
int8 humidity, temperature;
int1 dht11_read() {
int8 i, j, data[5] = {0,0,0,0,0};
output_low(DHT11_PIN);
delay_ms(18);
output_high(DHT11_PIN);
delay_us(40);
input(DHT11_PIN);
if(!input(DHT11_PIN)) {
delay_us(80);
if(input(DHT11_PIN)) {
delay_us(80);
for(i=0;i<5;i++) {
for(j=0;j<8;j++) {
while(!input(DHT11_PIN));
delay_us(30);
if(input(DHT11_PIN)) {
data[i] |= (1<<(7-j));
while(input(DHT11_PIN));
}
}
}
if(data[4] == (data[0]+data[1]+data[2]+data[3])) {
humidity = data[0];
temperature = data[2];
return TRUE;
}
}
}
return FALSE;
}
void main() {
lcd_init();
lcd_putc('\f');
lcd_gotoxy(1,1);
lcd_putc("DHT11 Sensor");
delay_ms(1000);
while(TRUE) {
if(dht11_read()) {
lcd_putc('\f');
printf(lcd_putc,"Nhiet do: %u C", temperature);
lcd_gotoxy(1,2);
printf(lcd_putc,"Do am: %u %%", humidity);
} else {
lcd_putc('\f');
lcd_putc("Loi doc DHT11!");
}
delay_ms(2000);
}
}
Giải thích:
- Chân DHT11 nối với RA0, sử dụng điện trở kéo 10kΩ.
- Hàm
dht11_read()đọc 5 byte dữ liệu từ cảm biến và kiểm tra checksum. - Kết quả hiển thị trên LCD 16x2 (RS → RD0, EN → RD1, D4–D7 → RD4–RD7).
5. Kết quả hiển thị và kiểm tra
Khi chạy mô phỏng trong Proteus hoặc thực tế, màn hình LCD sẽ hiển thị:
Nhiet do: 28 C
Do am: 67 %
6. Liên hệ hỗ trợ kỹ thuật
Zalo hỗ trợ: 0334 308 669
Gửi file project hoặc hỏi thêm về code CCS.
Nguồn: Fuvitech.vn
