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

ESP-IDF giao tiếp với màn hình OLED kiến thức mới năm 2023

ESP-IDF giao tiếp với màn hình OLED – Cập nhật kiến thức mới nhất năm 2023

Màn hình diode phát quang hữu cơ (OLED) có một số ưu điểm hơn màn hình LCD, đáng chú ý nhất như sau:
• Sử dụng năng lượng thấp hơn vì không cần đèn nền.
• Thời gian phản hồi nhanh chóng.
• Tích hợp giao tiếp I2C.
• Mỏng, nhỏ gọn hơn.
Những lợi thế đó làm cho nó trở thành một lựa chọn mạnh mẽ trong nhiều sản phẩm. Tuy nhiên, nó là một tương đối
công nghệ mới nên giá cao hơn một chút. Bạn có thể thấy hình ảnh của màn hình OLED trong hình sau:

Lần này,  tôi sẽ phát triển ứng dụng nhiệt độ tương tự với màn hình OLED. Các thành phần phần cứng mà tôi cần như sau:
• Màn hình OLED 1,3 “với chip trình điều khiển SH1106 (Tôi có một cái từ AZ-Delivery)
• DHT11
Chip trình điều khiển hỗ trợ mức logic 3,3 V và tôi có thể giao tiếp trực tiếp với ESP32. Hơn nữa, màn hình OLED không yêu cầu bất kỳ nguồn điện bên ngoài nào, nhờ tỷ lệ tiêu thụ điện năng thấp, dưới 11 mA. Kết nối với bộ phát triển ESP32 rất đơn giản, như được minh họa trong hình sau:ESP-IDF giao tiếp với màn hình OLED 4

Như thường lệ, tôi cập nhật tệp platformio.ini trước:

 

monitor_speed = 115200
lib_extra_dirs =
../../common/components
../../common/esp-idf-lib/components

note : Bạn cập nhật lại platform.ini đúng với cấu trúc chương trình của bạn nhé !!!

Đầu tiên các bạn tải thư viện cho màn hình OLED tại đây : https://github.com/lexus2k/ssd1306

Sau khi cấu hình đúng, chúng ta có thể tiếp tục với tệp mã. Tôi cần đổi tên nó thành main.cpp để làm cho PlatformIO sử dụng trình biên dịch C++, vì thư viện OLED được phát triển trong C++. Hãy bắt đầu như sau:

#include "dht.h"
#include "ssd1306.h"
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <stdio.h>
#define DHT11_PIN 17
#define OLED_CLK 22
#define OLED_SDA 21
extern "C" void app_main(void);
static void init_hw(void)
{
ssd1306_128x64_i2c_initEx(OLED_CLK, OLED_SDA, 0);
}

Tôi bao gồm ssd1306.h để điều khiển màn hình OLED và xác định các chân cắm. Một điểm quan trọng là chúng ta cần đánh dấu hàm app_main là extern “C” vì trình biên dịch C++ không hiểu tên của nó (vì đây là điểm đầu vào của ứng dụng của chúng ta khi ESP32 khởi động). ssd1306_128x64_i2c_initEx khởi tạo trình điều khiển OLED với thông tin I2C. 28×64 trong tên hàm biểu thị chiều rộng và chiều cao của OLED tính bằng pixel. Tham số cuối cùng dành cho địa chỉ bus I2C và việc chuyển nó bằng không (0) làm cho thư viện sử dụng địa chỉ mặc định của màn hình OLED. Tiếp theo, chúng ta có các chức năng hiển thị để hiển thị :

static void draw_screen(void)
{
ssd1306_clearScreen();
ssd1306_setFixedFont(ssd1306xled_font8x16);
ssd1306_printFixed(0, 0, "Temp", STYLE_NORMAL);
ssd1306_printFixed(0, 32, "Hum", STYLE_NORMAL);
}
static void display_reading(int temp, int hum)
{
char buff[10];
ssd1306_setFixedFont(ssd1306xled_font6x8);
sprintf(buff, "%d", temp);
ssd1306_printFixedN(48, 0, buff, STYLE_BOLD, 2);
sprintf(buff, "%d", hum);
ssd1306_printFixedN(48, 32, buff, STYLE_BOLD, 2);
}

 draw_screen là funcion để in các dòng khởi đầu. Đầu tiên, tôi xóa màn hình với sự trợ giúp của ssd1306_clearScreen và đặt phông chữ thành ssd1306xled_font8x16 bằng cách gọi ssd1306_setFixedFont cho văn bản cho đến lần tiếp theo nó được gọi bằng phông chữ khác. Sau đó, tôi gọi ssd1306_printFixed để in một chuỗi Temp tại vị trí của (cột = 0, hàng = 0) tính bằng pixel. Tương tự, tôi in Hum tại vị trí của (cột = 0, hàng = 32) ở vị trí giữa của chiều cao. Tôi sử dụng chức năng display_reading để cập nhật các giá trị nhiệt độ và độ ẩm mới nhất cho màn hình. Khi nó được gọi, phông chữ được cập nhật thành ssd1306xled_font6x8 trước tiên, sau đó các giá trị được in trên màn hình bằng cách gọi ssd1306_printFixedN. Tham số cuối cùng của hàm này chia tỷ lệ kích thước phông chữ bằng N, trong trường hợp của tôi là 2. Tiếp theo, tôi thực hiện một chức năng để đọc từ DHT11. Cụ thể như sau :

static void read_dht11(void* arg)
{
int16_t humidity = 0, temperature = 0;
while(1)
{
vTaskDelay(2000 / portTICK_PERIOD_MS);
dht_read_data(DHT_TYPE_DHT11, (gpio_num_t)DHT11_PIN,
&humidity, &temperature);
display_reading(temperature / 10, humidity / 10);
}
}

read_dht11 là lệnh gọi lại tác vụ để đọc từ DHT11 sau mỗi 2 giây. Trong vòng lặp while, nó sẽ gọi hàm display_reading để hiển thị các giá trị trên màn hình OLED.Đến đây, tôi và các bạn có thể hoàn thành ứng dụng bằng cách mã hóa hàm app_main như được cung cấp tiếp theo.

 

void app_main()
{
init_hw();
draw_screen();
xTaskCreate(read_dht11, "dht11", configMINIMAL_STACK_SIZE *
8, NULL, 5, NULL);
}

Hàm app_main khởi tạo phần cứng, vẽ các nhãn và cuối cùng chuyển quyền điều khiển cho hàm read_dht11 bằng cách tạo một tác vụ với nó. Chương trình hiện đã hoàn tất và các bạn tải code xuống kit và bắt đầu chạy thử thôi !!!

Chúc các bạn thành công !!!

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