- DHT11 - Đặc điểm kỹ thuật và hoạt động
- Giao tiếp với cảm biến DHT11
- Các thành phần bắt buộc
- Sơ đồ
- DHT11 với giải thích mã PIC MPLABX
Đo nhiệt độ và độ ẩm thường hữu ích trong nhiều ứng dụng như Tự động hóa gia đình, Giám sát môi trường, Trạm thời tiết, v.v. Cảm biến nhiệt độ được sử dụng phổ biến nhất bên cạnh LM35 là DHT11, trước đây chúng tôi đã xây dựng nhiều Dự án DHT11 bằng cách kết nối nó với Arduino, với Raspberry Pi và nhiều bảng phát triển khác. Trong bài này, chúng ta sẽ tìm hiểu cách giao tiếp DHT11 này với PIC16F87A, một Vi điều khiển PIC 8-bit. Chúng tôi sẽ sử dụng bộ vi điều khiển này để đọc các giá trị Nhiệt độ và Độ ẩm bằng DHT11 và hiển thị nó trên màn hình LCD. Nếu bạn chưa quen với việc sử dụng bộ vi điều khiển PIC, bạn có thể sử dụng loạt bài hướng dẫn PIC của chúng tôi để tìm hiểu cách lập trình và sử dụng bộ vi điều khiển PIC, hãy bắt đầu.
DHT11 - Đặc điểm kỹ thuật và hoạt động
Cảm biến DHT11 có sẵn ở dạng mô-đun hoặc dạng cảm biến. Trong hướng dẫn này, chúng tôi đang sử dụng cảm biến, sự khác biệt duy nhất giữa cả hai là ở dạng mô-đun, cảm biến có một tụ lọc và một điện trở kéo lên được gắn vào chân đầu ra của cảm biến. Vì vậy, nếu bạn đang sử dụng mô-đun, bạn không cần thêm chúng bên ngoài. DHT11 ở dạng cảm biến được hiển thị bên dưới.
Cảm biến DHT11 có vỏ màu xanh lam hoặc trắng. Bên trong lớp vỏ này, chúng ta có hai thành phần quan trọng giúp chúng ta cảm nhận độ ẩm và nhiệt độ tương đối. Thành phần đầu tiên là một cặp điện cực; điện trở giữa hai điện cực này do chất nền giữ ẩm quyết định. Vì vậy điện trở đo được tỉ lệ nghịch với độ ẩm tương đối của môi trường. Cao hơn độ ẩm tương đối thấp hơn sẽ là giá trị của điện trở và ngược lại. Ngoài ra, lưu ý rằng độ ẩm tương đối khác với độ ẩm thực tế. Độ ẩm tương đối đo hàm lượng nước trong không khí so với nhiệt độ trong không khí.
Thành phần còn lại là một NTC Thermistor gắn trên bề mặt. Thuật ngữ NTC là viết tắt của Hệ số nhiệt độ âm, khi nhiệt độ tăng, giá trị của điện trở sẽ giảm. Đầu ra của cảm biến được hiệu chuẩn tại nhà máy và do đó, là một lập trình viên, chúng tôi không cần lo lắng về việc hiệu chỉnh cảm biến. Đầu ra của cảm biến được đưa ra bởi giao tiếp 1-Wire, chúng ta hãy xem sơ đồ chân và kết nối của cảm biến này.
Sản phẩm nằm trong gói hàng đơn 4pin. Chân thứ nhất được kết nối qua VDD và chân thứ 4 được kết nối qua GND. Chân thứ 2 là chân dữ liệu, được sử dụng cho mục đích giao tiếp. Chân dữ liệu này cần một điện trở kéo lên là 5k. Tuy nhiên, những người khác kéo điện trở lên chẳng hạn như 4,7k đến 10k cũng có thể được sử dụng. Chân thứ 3 không được kết nối với bất kỳ thứ gì. Vì vậy, nó được bỏ qua.
Biểu dữ liệu cung cấp các thông số kỹ thuật cũng như thông tin giao diện có thể được xem trong bảng dưới đây-
Bảng trên hiển thị độ chính xác và phạm vi đo Nhiệt độ và Độ ẩm. Nó có thể đo nhiệt độ từ 0-50 độ C với độ chính xác +/- 2 độ C và độ ẩm tương đối từ 20-90% RH với độ chính xác +/- 5% RH. Thông số kỹ thuật chi tiết có thể được xem trong bảng dưới đây.
Giao tiếp với cảm biến DHT11
Như đã đề cập trước đó, để đọc dữ liệu từ DHT11 với PIC, chúng ta phải sử dụng giao thức truyền thông một dây PIC. Chi tiết về cách thực hiện điều này có thể được hiểu từ sơ đồ giao diện của DHT 11 có thể được tìm thấy trong biểu dữ liệu của nó, tương tự được đưa ra bên dưới.
DHT11 cần tín hiệu khởi động từ MCU để bắt đầu giao tiếp. Do đó, mỗi khi MCU cần gửi tín hiệu khởi động đến Cảm biến DHT11 để yêu cầu nó gửi các giá trị nhiệt độ và độ ẩm. Sau khi hoàn tất tín hiệu khởi động, DHT11 sẽ gửi tín hiệu phản hồi bao gồm thông tin về nhiệt độ và độ ẩm. Giao tiếp dữ liệu được thực hiện bởi giao thức truyền dữ liệu bus đơn. Độ dài dữ liệu đầy đủ là 40 bit và cảm biến sẽ gửi bit dữ liệu cao hơn trước.
Do điện trở kéo lên, đường dữ liệu luôn duy trì ở mức VCC trong chế độ nhàn rỗi. MCU cần giảm điện áp này từ cao xuống thấp trong khoảng thời gian tối thiểu là 18ms. Trong thời gian này, cảm biến DHT11 phát hiện tín hiệu khởi động và bộ vi điều khiển làm cho đường dữ liệu cao trong 20-40us. Thời gian 20-40us này được gọi là khoảng thời gian chờ khi DHT11 bắt đầu phản hồi. Sau khoảng thời gian chờ này, DHT11 sẽ gửi dữ liệu đến bộ vi điều khiển.
Định dạng DỮ LIỆU của cảm biến DHT11
Dữ liệu bao gồm phần thập phân và phần tích phân kết hợp với nhau. Cảm biến tuân theo định dạng dữ liệu dưới đây:
Dữ liệu RH tích phân 8 bit + Dữ liệu RH thập phân 8 bit + Dữ liệu T tích phân 8 bit + Dữ liệu T thập phân 8 bit + Tổng kiểm tra 8 bit.
Người ta có thể xác minh dữ liệu bằng cách kiểm tra giá trị tổng kiểm tra với dữ liệu nhận được. Điều này có thể được thực hiện bởi vì, nếu mọi thứ đều phù hợp và nếu cảm biến đã truyền dữ liệu thích hợp, thì tổng kiểm tra phải là tổng của “Dữ liệu RH tích phân 8 bit + Dữ liệu RHdata 8 bit thập phân + Dữ liệu T tích phân 8 bit + Dữ liệu T thập phân 8 bit”.
Các thành phần bắt buộc
Đối với dự án này, những điều dưới đây là bắt buộc:
- Thiết lập lập trình vi điều khiển PIC (8bit).
- Breadboard
- Bộ nguồn 5V 500mA.
- 4,7k điện trở 2 cái
- Điện trở 1k
- PIC16F877A
- Tinh thể 20mHz
- Tụ điện 33pF 2 chiếc
- 16x2 ký tự LCD
- Cảm biến DHT11
- Dây nhảy
Sơ đồ
Sơ đồ mạch để giao tiếp DHT11 với PIC16F877A được hiển thị bên dưới.
Chúng tôi đã sử dụng màn hình LCD 16x2 để hiển thị các giá trị nhiệt độ và độ ẩm mà chúng tôi đo được từ DHT11. Màn hình LCD được giao diện ở chế độ 4 dây và cả cảm biến và màn hình LCD đều được cấp nguồn bởi nguồn điện bên ngoài 5V. Tôi đã sử dụng một breadboard để tạo tất cả các kết nối cần thiết và đã sử dụng bộ chuyển đổi 5V bên ngoài. Bạn cũng có thể sử dụng bảng cấp nguồn breadboard này để cấp nguồn 5V cho bo mạch của mình.
Khi mạch đã sẵn sàng, tất cả những gì chúng ta phải làm là tải lên đoạn mã được cung cấp ở cuối trang này và chúng ta có thể bắt đầu đọc Nhiệt độ và Độ ẩm như hình dưới đây. Nếu bạn muốn biết mã được viết như thế nào và nó hoạt động như thế nào, hãy đọc thêm. Ngoài ra, bạn có thể tìm thấy toàn bộ hoạt động của dự án này trong video ở cuối trang này.
DHT11 với giải thích mã PIC MPLABX
Mã được viết bằng MPLABX IDE và được biên dịch bằng trình biên dịch XC8, cả hai đều do chính Microchip cung cấp và miễn phí tải xuống và sử dụng. Vui lòng tham khảo các hướng dẫn cơ bản để hiểu cơ bản về lập trình, chỉ có ba chức năng quan trọng cần thiết để giao tiếp với cảm biến DHT11 được thảo luận dưới đây. Các chức năng là -
void dht11_init (); void find_response (); char read_dht11 ();
Hàm đầu tiên được sử dụng cho tín hiệu bắt đầu với dht11. Như đã thảo luận trước đây, mọi giao tiếp với DHT11 đều bắt đầu bằng tín hiệu khởi động, ở đây hướng chân được thay đổi lúc đầu để cấu hình chân dữ liệu làm đầu ra từ vi điều khiển. Sau đó, đường dữ liệu được kéo xuống thấp và tiếp tục chờ 18mS. Sau đó, một lần nữa dòng được tạo ra bởi bộ vi điều khiển và tiếp tục chờ lên đến 30us. Sau thời gian chờ đó, chân dữ liệu được đặt làm đầu vào cho bộ vi điều khiển để nhận dữ liệu.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // Cấu hình RD0 là đầu ra DHT11_Data_Pin = 0; // RD0 gửi 0 tới cảm biến __delay_ms (18); DHT11_Data_Pin = 1; // RD0 gửi 1 tới cảm biến __delay_us (30); DHT11_Data_Pin_Direction = 1; // Định cấu hình RD0 làm đầu vào }
Hàm tiếp theo được sử dụng để thiết lập bit kiểm tra tùy thuộc vào trạng thái chân dữ liệu. Nó được sử dụng để phát hiện phản hồi từ cảm biến DHT11.
void find_response () { Check_bit = 0; __delay_us (40); if (DHT11_Data_Pin == 0) { __delay_us (80); if (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
Cuối cùng là chức năng đọc dht11; ở đây dữ liệu được đọc thành định dạng 8 bit, nơi dữ liệu được trả về bằng thao tác dịch chuyển bit tùy thuộc vào trạng thái chân dữ liệu.
char read_dht11 () { dữ liệu char, for_count; for (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __delay_us (30); if (DHT11_Data_Pin == 0) { data & = ~ (1 << (7 - for_count)); // Xóa bit (7-b) } else { data- = (1 << (7 - for_count)); // Đặt bit (7-b) while (DHT11_Data_Pin); } } trả về dữ liệu; }
Các bác sĩ cho biết thêm:
Sau đó, mọi thứ được thực hiện vào chức năng chính. Đầu tiên, quá trình khởi tạo hệ thống được thực hiện khi màn hình LCD được khởi tạo và hướng cổng các chân LCD được đặt thành đầu ra. Ứng dụng đang chạy bên trong chức năng chính
void main () { system_init (); while (1) { __delay_ms (800); dht11_init (); find_response (); if (Check_bit == 1) { RH_byte_1 = read_dht11 (); RH_byte_2 = read_dht11 (); Temp_byte_1 = read_dht11 (); Temp_byte_2 = read_dht11 (); Summation = read_dht11 (); if (Summation == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Humidity = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Nhiệt độ:"); // lcd_puts (""); lcd_data (48 + ((Độ ẩm / 10)% 10)); lcd_data (48 + (Độ ẩm% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Độ ẩm:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("Lỗi tổng kiểm tra"); } } else { clear_screen (); lcd_com (0x80); lcd_puts ("Lỗi !!!"); lcd_com (0xC0); lcd_puts ("Không có phản hồi."); } __delay_ms (1000); } }
Giao tiếp với cảm biến DHT11 được thực hiện bên trong vòng lặp while, nơi tín hiệu khởi động được gửi đến cảm biến. Sau đó, hàm find_response được kích hoạt. Nếu Check_bit là 1 thì giao tiếp tiếp theo sẽ được thực hiện nếu không màn hình LCD sẽ hiển thị hộp thoại lỗi.
Tùy thuộc vào dữ liệu 40bit, read_dht11 được gọi 5 lần (5 lần x 8bit) và được lưu trữ dữ liệu theo định dạng dữ liệu được cung cấp trong biểu dữ liệu. Các tình trạng checksum cũng sẽ được kiểm tra và nếu lỗi được tìm thấy, nó cũng sẽ thông báo bằng màn hình LCD. Cuối cùng, dữ liệu được chuyển đổi và truyền đến màn hình LCD 16x2 ký tự.
Bạn có thể tải mã hoàn chỉnh cho phép đo Nhiệt độ và Độ ẩm PIC này từ đây. Cũng kiểm tra video trình diễn dưới đây.
Hy vọng bạn đã hiểu dự án và thích xây dựng một cái gì đó hữu ích. Nếu bạn có bất kỳ câu hỏi nào, hãy để lại chúng trong phần bình luận bên dưới hoặc sử dụng diễn đàn của chúng tôi cho các câu hỏi kỹ thuật khác.