quocbao gửi vào
- 406051 lượt xem
1. Giới thiệu
Bài viết này sẽ hướng dẫn các bạn cách đọc nhiệt độ - độ ẩm từ cảm biến và xuất ra màn hình LCD. Hy vọng rằng qua bài viết này, bạn sẽ dần hiểu được Arduino tạo cho người dùng một sự đơn giản và tiện lợi đến mức nào.
2. Nội dung chính
- Đọc dữ liệu từ cảm biến nhiệt độ - độ ẩm DHT11.
- Sử dụng màn hình LCD để xuất thông tin.
3. Phần cứng cần thiết
- Màn hình LCD 16 x 2
- Mạch điều khiển màn hình LCD sử dụng giao tiếp I2C
- Cảm biến nhiệt độ - độ ẩm DHT11
- Arduino UNO R3 (hoặc tương đương)
- Breadboard
- Dây cắm breadboard
4. Cảm biến DHT11
Cảm biến DHT11 đã được tích hợp trong một mạch duy nhất, bạn chỉ việc nối dây nguồn (Vcc, GND) và dây tín hiệu (Signal) vào mạch Arduino là xong.
Thông số kĩ thuật
- Điện áp hoạt động: 3-5.5V DC
- Ngưỡng độ ẩm: 20 - 90%
- Sai số độ ẩm: ± 5%
- Ngưỡng nhiệt độ: 0 - 55oC
- Sai số nhiệt độ: ± 2oC
Download và cài đặt thư viện hỗ trợ sử dụng DHT11: download tại đây
Kết nối cảm biến DHT11 với mạch Arduino
DHT11 | Arduino UNO R3 |
GND | GND |
Vcc | 5V |
Signal | D2 |
Lập trình
// Gọi thư viện DHT11 #include "DHT.h" const int DHTPIN = 2; //Đọc dữ liệu từ DHT11 ở chân 2 trên mạch Arduino const int DHTTYPE = DHT11; //Khai báo loại cảm biến, có 2 loại là DHT11 và DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); // Khởi động cảm biến } void loop() { float h = dht.readHumidity(); //Đọc độ ẩm float t = dht.readTemperature(); //Đọc nhiệt độ Serial.print("Nhiet do: "); Serial.println(t); //Xuất nhiệt độ Serial.print("Do am: "); Serial.println(h); //Xuất độ ẩm Serial.println(); //Xuống hàng delay(1000); //Đợi 1 giây }
Sau khi upload chương trình lên mạch Arduino, bạn hãy bấm Ctrl + Shift + M để mở cửa sổ Serial Monitor và xem kết quả.
Một lưu ý nho nhỏ cho những bạn lập trình nâng cao, đó là cảm biến DHT11 sẽ "treo" (delay) chương trình của bạn trong quá trình nó đọc nhiệt độ, độ ẩm!
5. Màn hình LCD
Thông thường, để sử dụng màn hình LCD, bạn sẽ phải mất rất nhiều chân trên Arduino để điều khiển. Tham khảo tại http://arduino.cc/en/Tutorial/LiquidCrystal.
Do vậy, để đơn giản hóa công việc, người ta đã tạo ra một loại mạch điều khiển màn hình LCD sử dụng giao tiếp I2C. Nói một cách đơn giản, bạn chỉ tốn ... 2 dây để điều khiển màn hình, thay vì 8 dây như cách thông thường.
Bạn chỉ việc hàn mạch vào như thế này là xong.
2 chân SDA và SCL là 2 chân tín hiệu dùng cho giao tiếp I2C.
Download và cài đặt thư viện hỗ trợ sử dụng màn hình LCD qua giao tiếp I2C: download tại đây
Nếu bạn không có module hỗ trợ này, bạn vẫn có thể điều khiển màn hình theo cách thông thường. Tuy nhiên sẽ rất tốn thời gian và chưa chắc bạn sẽ làm được !
Kết nối module màn hình với Arduino
Module màn hình LCD (16x2) | Arduino |
GND | GND |
Vcc | 5V |
SDA | A4 |
SCL | A5 |
Lập trình
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); //0x27 là địa chỉ màn hình trong bus I2C. Phần này chúng ta không cần phải quá bận tâm vì hầu hết màn hình (20x4,...) đều như thế này! //16 là số cột của màn hình (nếu dùng loại màn hình 20x4) thì thay bằng 20 //2 là số dòng của màn hình (nếu dùng loại màn hình 20x4) thì thay bằng 4 void setup() { lcd.init(); //Khởi động màn hình. Bắt đầu cho phép Arduino sử dụng màn hình, cũng giống như dht.begin() trong chương trình trên lcd.backlight(); //Bật đèn nền lcd.print("Hello world"); //Xuất ra chữ Hello world, mặc định sau khi init thì con trỏ tại cột 0 hàng 0 (trong C, khác với quy ước của tiếng Việt, mọi chỉ số đều bắt đầu bằng số 0, vì vậy bạn cần hiểu rằng, nếu ta kẻ một bảng có 2 hàng và 16 cột thì ô góc trên cùng bên trái là ô (0,0) tương tự với các ô khác, ta cứ tăng dần giá trị lên! lcd.setCursor(0,1); //Đưa con trỏ tới hàng 1, cột 0 lcd.print("I love Arduino !");// Bạn thấy trên màn hình rồi chứ? } void loop() { }
6. Kết hợp đọc nhiệt độ độ - độ ẩm và xuất ra màn hình
Bây giờ bạn đã biết cách đọc nhiệt độ, độ ẩm rồi và cũng đã biết xuất ra màn hình. Vậy bây giờ chúng ta chỉ việc kết hợp cả 2 lại để được một đoạn code như thế này:
#include <DHT.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); const int DHTPIN = 2; const int DHTTYPE = DHT11; DHT dht(DHTPIN, DHTTYPE); byte degree[8] = { 0B01110, 0B01010, 0B01110, 0B00000, 0B00000, 0B00000, 0B00000, 0B00000 }; void setup() { lcd.init(); lcd.backlight(); lcd.print("Nhiet do: "); lcd.setCursor(0,1); lcd.print("Do am: "); lcd.createChar(1, degree); dht.begin(); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(t) || isnan(h)) { // Kiểm tra xem thử việc đọc giá trị có bị thất bại hay không. Hàm isnan bạn xem tại đây http://arduino.vn/reference/isnan } else { lcd.setCursor(10,0); lcd.print(round(t)); lcd.print(" "); lcd.write(1); lcd.print("C"); lcd.setCursor(10,1); lcd.print(round(h)); lcd.print(" %"); } } /* Hãy print ra xem thử bạn nhận được gì! VÀ hãy thử khám phá từng dòng code mới trong này nhé ;) */
Cập nhật từ comment dưới bài viết
- Nếu bạn thấy màn hình không hiển thị rõ chữ, hãy kiểm tra lại các đường dây điện xem có lỏng hay không hoặc thử vặn biến trở trên màn hình để điều chỉnh độ tương phản.
- Nếu khi dịch chương trình bạn gặp các lỗi như "'LiquidCrystal_I2C does not name a type'", "dht.h: No such file or directory",.. thì hãy kiểm tra lại xem mình đã cài đặt thư viện cho cảm biến DHT11 hay chưa.
- Bạn không thể sử dụng cảm biến DHT11 trên mạch Intel Galileo Gen1, mạch Gen2 thì mình chưa test.
- Bạn có thể dùng nhiều cảm biến DHT11 cùng lúc.
- Bạn phải sử dụng 2 chân A4, A5 (I2C) để giao tiếp với màn hình LCD, không thể thay đổi 2 chân này thành các chân khác. Với cách giao tiếp truyền thống, bạn sẽ phải mất đến 6 chân giao tiếp Digital.
7. Một số nội dung cập nhật từ cộng đồng
7.1 Hiển thị thời gian, nhiệt độ, độ ẩm ra màn hình LCD
Cảm ơn bạn thienvk đã đóng góp
Phần cứng sử dụng:
- Mạch thời gian thực RTC DS3231
- Cảm biến nhiệt độ - độ ẩm DHT11
- Màn hình LCD 16x02 điều khiển qua I2C
Code: http://codepad.org/C47v8fVI
Tải thư viện ds3231.h cho mạch thời gian thực: tại đây