Kỹ thuật điện tử & Điện lạnh

Lập trình ESP-IDF giao tiếp với màn hình LCD1602 hiện thị nhiệt độ đọc từ DHT11 kiến thức mới năm 2023

Lập trình ESP-IDF giao tiếp với màn hình LCD1602 hiện thị nhiệt độ đọc từ DHT11 – Cập nhật kiến thức mới nhất năm 2023

Nếu như các bạn đã lập trình với các chip 8051,PIC, AVR, STM thì chắc hẳn không còn xa lạ gì với chúng. Màn hình LCD1602 sử dụng driver HD44780, có khả năng hiển thị 2 dòng với mỗi dòng 16 ký tự. Có độ bền cao, rất phổ biến, nhiều code mẫu và dễ sử dụng thích hợp cho những người mới học và làm dự án và dễ dàng hơn khi sử dụng module đi kèm là mạch chuyển đổi I2C.

 

Màn hình LCD có thể hoạt động ở chế độ 4 bit hoặc 8 bit, xác định số lượng dòng dữ liệu để điều khiển màn hình LCD. Tuy nhiên, nó quá tốn kém về tài nguyên GPIO trên ESP32. Do đó, bạn nên sử dụng mô-đun bộ điều hợp I2C để giảm số lượng chân xuống còn hai chân, đó là dữ liệu nối tiếp (SDA) và đồng hồ nối tiếp (SCL). Ví dụ về mô-đun bộ điều hợp đó được hiển thị ở đây:

Lập trình ESP-IDF giao tiếp với màn hình LCD1602 hiện thị nhiệt độ đọc từ DHT11 6

Sau đây là chắc năng cơ bản của các chân :

Lập trình ESP-IDF giao tiếp với màn hình LCD1602 hiện thị nhiệt độ đọc từ DHT11 7

Trong ví dụ này, chúng ta sẽ phát triển một cảm biến nhiệt độ đơn giản với màn hình LCD. Các thành phần phần cứng như sau:
• Màn hình LCD 16×2 (chip điều khiển HD44780) với bộ điều hợp I2C
• Một bộ chuyển đổi logic, 3,3 V-5 V
• Nguồn điện 5 V cho màn hình
• DHT11
Trước khi bắt đầu viết mã, chúng ta cần kết nối các thành phần như sau :

Lập trình ESP-IDF giao tiếp với màn hình LCD1602 hiện thị nhiệt độ đọc từ DHT11 8

Trước khi viết code, các bạn tải thư viện điều khiển màn hình LCD và DHT tại đây :

https://github.com/tuyentran2502/Lib_esp_idf/tree/master/dht

https://github.com/tuyentran2502/ESP32_HH44780

Tạo một projects như thường lệ bằng flatform IO, chuẩn bị đã hoàn tất, ta đi vào viết code thôi :

Đầu tiên, ta cập nhật platformio.ini  như sau :

 

build_flags =
-DCONFIG_I2CDEV_TIMEOUT=100000
monitor_speed = 115200
lib_extra_dirs =
../../common/ESP32-HD44780/components
../../common/esp-idf-lib/components

NOTE : Bạn nhớ cập nhật lại đường dẫn cho đúng nhé !!!

Thư viện LCD yêu cầu giá trị thời gian chờ cho giao tiếp I2C. Chúng tacung cấp nó dưới dạng build flag, CONFIG_I2CDEV_TIMEOUT. Bước tiếp theo là chỉnh sửa tệp main.c :

 

#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <string.h>
#include <stdio.h>
#include <driver/i2c.h>
#include <HD44780.h>
#include <dht.h>
#define LCD_ADDR 0x27
#define SDA_PIN 21
#define SCL_PIN 22
#define LCD_COLS 16
#define LCD_ROWS 2
#define DHT11_PIN 17
static void init_hw(void)
{
LCD_init(LCD_ADDR, SDA_PIN, SCL_PIN, LCD_COLS, LCD_ROWS);
}

Tệp tiêu đề của thư viện LCD là HD44780.h. Chúng ta cũng xác định một số macro, sẽ được sử dụng cho giao tiếp I2C với mô-đun LCD. Trong hàm init_hw, chúng ta chỉ khởi tạo mô-đun LCD bằng cách sử dụng LCD_init, lấy địa chỉ bus I2C của mô-đun, dữ liệu I2C và các chân đồng hồ, và kích thước LCD là số cột và hàng. Hàm show_dht11 sau đây là lệnh gọi lại tác vụ để hiển thị các kết quả đọc nhiệt độ và độ ẩm từ DHT11:

void show_dht11(void *param)
{
char buff[17];
int16_t temperature, humidity;
uint8_t read_cnt = 0;
while (true)
{
vTaskDelay(2000 / portTICK_PERIOD_MS);
LCD_clearScreen();
if (dht_read_data(DHT_TYPE_DHT11, (gpio_num_t)DHT11_
PIN, &humidity, &temperature) == ESP_OK)
{
temperature /= 10;
humidity /= 10;
memset(buff, 0, sizeof(buff));
sprintf(buff, "Temp: %d", temperature);
LCD_home();
LCD_writeStr(buff);
memset(buff, 0, sizeof(buff));
sprintf(buff, "Hum: %d", humidity);
LCD_setCursor(0, 1);
LCD_writeStr(buff);
}

Trong vòng lặp while, chúng ta xóa màn hình bằng LCD_clearScreen và đọc từ DHT11 cứ sau 2 giây. Cách tiếp cận chính để viết trên màn hình là đi đến vị trí ghi đầu tiên và sau đó gửi văn bản đến mô-đun LCD. Ví dụ: để hiển thị nhiệt độ, chúng ta sử dụng hàm LCD_home để di chuyển con trỏ đến vị trí (cột = 0, hàng = 0) và gọi LCD_writeStr với chuỗi nhiệt độ làm tham số. Chức năng định vị con trỏ trên bất kỳ vị trí nào là LCD_setCursor, lấy vị trí cột và hàng là thông số. Sau đó, chúng ta xử lý lỗi đọc DHT11 như sau :

else
{
LCD_home();
memset(buff, 0, sizeof(buff));
sprintf(buff, "Failed (%d)", ++read_cnt);
LCD_writeStr(buff);
}
}
}

Nếu không thể đọc từ DHT11, chúng ta sẽ hiển thị thông báo lỗi trên màn hình LCD.
Chúng ta đã triển khai chức năng hiển thị và có thể viết mã hàm app_main tiếp theo:

void app_main(void)
{
init_hw();
xTaskCreate(show_dht11, "dht11", configMINIMAL_STACK_SIZE *
4, NULL, 5, NULL);
}

app_main khá đơn giản. Đầu tiên chúng ta khởi tạo phần cứng và sau đó bắt đầu một tác vụ với show_dht11, hiển thị các bài đọc từ DHT11 trên màn hình LCD. Đó là tất cả. Mã đã hoàn thành và sẵn sàng để kiểm tra. Sau khi flash bộ devkit, chúng ta có thể quan sát thấy rằng màn hình LCD cập nhật 2 giây một lần với một số đọc mới từ DHT11.

Như vậy là đã xong, build và chạy thôi.

Chúc các bạn học tập thật tốt !!!

Series Navigation

<< Lập trình ESP-IDF với động cơ bướcLập trình ESP-IDF cảm biến chạm sử dụng FreeRtos >>

Kết thúc
Ngoài các bài viết tin tức, bài báo hàng ngày của https://www.kythuatcodienlanh.com/, nguồn nội dung cũng bao gồm các bài viết từ các cộng tác viên chuyên gia đầu ngành về chuỗi kiến thức kỹ thuật điện, điện lạnh, điện tử, cơ khí,…,.. được chia sẽ chủ yếu từ nhiều khía cạnh liên quan chuỗi kiến thức này.
Bạn có thể dành thời gian để xem thêm các chuyên mục nội dung chính với các bài viết tư vấn, chia sẻ mới nhất, các tin tức gần đây từ chuyên gia và đối tác của Chúng tôi. Cuối cùng, với các kiến thức chia sẻ của bài viết, hy vọng góp phần nào kiến thức hỗ trợ cho độc giả tốt hơn trong hoạt động nghề nghiệp cá nhân!
* Ý kiến được trình bày trong bài viết này là của tác giả khách mời và không nhất thiết phải là SEMTEK. Nhân viên tác giả, cộng tác viên biên tập sẽ được liệt kê bên cuối bài viết.
Trân trọng,
Các chuyên mục nội dung 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 *

Back to top button