ESP32: Đọc cảm biến nhiệt độ, độ ẩm DHT11 hiển thị lên OLED

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ì?

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:

Module màn hình OLED
Module 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:

Kết nối cảm biến DHT11 và OLED với ESP32
Kết nối cảm biến DHT11 và màn hình OLED

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 cho cảm biến DHT11

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.

Cài 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:

Kết quả nhận được
OLED hiển thị nhiệt độ từ cảm biến DHT11
Hiển thị kết quả

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é!

Tags: cảm biến DHT, DHT ESP32, đọc nhiệt độ lên OLED

Những bài liên quan

Trả lời

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 *

Fill out this field
Fill out this field
Vui lòng nhập địa chỉ email hợp lệ.
You need to agree with the terms to proceed