Bài viết này, OhStem sẽ hướng dẫn các bạn cách đọc nhiệt độ, độ ẩm từ cảm biến DHT11 với Node Wifi32 và hiển thị chúng lên OLED. Phần mềm mình sử dụng ở đây là Arduino IDE. Nếu bạn chưa biết cảm biến DHT11 là gì, chức năng của nó ra sao, bạn có thể tham khảo bài viết sau: Cảm biến nhiệt độ, độ ẩm DHT là gì?
Mục lục
CÁC THIẾT BỊ CẦN CÓ:
Đối với hướng dẫn này, chúng tôi sẽ sử dụng:
MÀN HÌNH OLED:
Màn hình Oled 0.96 inch giao tiếp I2C cho khả năng hiển thị đẹp, sang trọng, rõ nét vào ban ngày và khả năng tiết kiệm năng lượng tối đa với mức chi phí phù hợp, màn hình sử dụng giao tiếp I2C cho chất lượng đường truyền ổn định và rất dễ giao tiếp chỉ với 2 chân GPIO.
Thông số kỹ thuật:
- Hỗ trợ cả 3.3V và 5V
- Số điểm hiển thị: 128×64 điểm.
- Độ rộng màn hình: 0.96 inch
- Màu hiển thị: Trắng / Xanh Dương.
- Giao tiếp: I2C
- Driver: SSD1306
- Tương thích với chuẩn cắm plug & play 4 pin Blocky Piece
KẾT NỐI PHẦN CỨNG
Màn hình oled có nhiều loại và có 2 chuẩn kết nối chính là SPI và I2C. Màn hình Oled chúng ta sử dụng trong bài này sử dụng giao thức I2C bao gồm 2 dây là SCL và SDA.
Kết nối phần cứng như sau:
CÀI ĐẶT THƯ VIỆN:
Để đọc dữ liệu từ DHT11, chúng tôi sử dụng thư viện DHT sensor library của Adafruit.
Mở Arduino IDE vào Sketch > Include Library > Manage Libraries.
Cài đặt thư viện OLED: chúng tôi sử dụng bộ thư viện SSD1306 library của Adafruit.
Sau khi cài xong thư viện SSD1306 chúng ta cài tiếp thư viện GFX.
CODE:
#include#include #include #include #include "DHT.h" #define DHTPIN 32 // what digital pin the DHT sensor is connected to #define DHTTYPE DHT11 // there are multiple kinds of DHT sensors #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels DHT dht(DHTPIN, DHTTYPE); // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); void setup() { Serial.begin(115200); dht.begin(); if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64 Serial.println(F("SSD1306 allocation failed")); for (;;); } delay(2000); display.setFont(&FreeSerif9pt7b); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 20); // Display static text display.println("Hello, world!"); display.display(); } void loop() { float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) ) { Serial.println("Failed to read from DHT sensor!"); return; } Serial.print("Humidity: "); Serial.print(h); Serial.println(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C "); delay(2000); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 20); // Display static text display.print("Humi: "); display.print(h); display.print(" %\t"); display.setCursor(0, 50); display.print("TEMP: "); display.print(t); display.print(" C"); display.display(); }
GIẢI THÍCH CODE:
Đầu tiên, ta khai báo thư viện Wire và thư viện cho OLED bằng đoạn mã sau:
#include#include #include
Khai báo font chữ bằng cú pháp như dưới:
#include
Khai báo thư viện cho DHT11:
#include "DHT.h" #define DHTPIN 32 // what digital pin the DHT sensor is connected to #define DHTTYPE DHT11 // there are multiple kinds of DHT sensors
Sau đó, định nghĩa độ phân giải của Oled. Oled ta sử dụng có độ phân giải là 128 x 64 pixels:
#define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels
Sau đó, khởi tạo đối tượng hiển thị với chiều rộng và chiều cao được xác định trước đó bằng giao thức I2C (& Wire):
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Trong hàm setup(), khởi tạo chức năng Serial, kiểm tra xem thử Oled đã được kết nối với ESP32 chưa, đúng địa chỉ chưa.
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64 Serial.println(F("SSD1306 allocation failed")); for (;;); }
Chờ khoảng 2s để Oled có đủ thời gian để khởi tạo trước khi ghi:
delay(2000);
Cài font chữ:
display.setFont(&FreeSerif9pt7b);
Sau khi khởi tạo, xóa bộ đệm hiển thị:
display.clearDisplay();
Cài font size sử dụng hàm display.setTextSize():
display.setTextSize(1);
Cài màu chữ sử dụng hàm display.setTextColor():
display.setTextColor(WHITE);
Đưa con trỏ đến vị trí cần ghi bằng hàm display.setCursor(x, y) với x là hàng còn y là cột:
display.setCursor(0, 20);
Hiển thị dòng chữ “Hello, world!” lên Oled:
display.println("Hello, world!"); display.display();
Trong hàm loop():
Đọc dữ liệu trả về vào 2 biến:
float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature();
Kiểm tra dữ liệu trả về, nếu dữ liệu đọc được là nan thì in ra màn hình: Failed to read from DHT sensor!
if (isnan(h) || isnan(t) ) { Serial.println("Failed to read from DHT sensor!"); return; }
In ra terminal kết quả đọc được từ DHT11:
Serial.print("Humidity: "); Serial.print(h); Serial.println(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C ");
Gửi kết quả lên OLED:
display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 20); // Display static text display.print("Humi: "); display.print(h); display.print(" %\t"); display.setCursor(0, 50); display.print("TEMP: "); display.print(t); display.print(" C"); display.display();
KẾT QUẢ NHẬN ĐƯỢC:
Tổng kết,
Trên đây, OhStem đã hướng dẫn bạn cách đọc thông tin nhiệt độ, độ ẩm từ cảm biến DHT11 ra màn hình OLED, sử dụng board mạch ESP32. Rất đơn giản phải không?
Để xem tất cả các bài hướng dẫn về lập trình Arduino, bạn truy cập vào đây nhé: Tổng hợp các bài hướng dẫn về Arduino. Nếu bạn có bất kỳ ý kiến đóng góp hoặc thắc mắc gì, bạn có thể để lại comment phía dưới hoặc liên hệ với OhStem qua Fanpage để được hỗ trợ nhé!