響應式自適應網(wǎng)站模板杭州seo培訓
本節(jié)我們繼續(xù)ESP和ST 7789的話題,這節(jié)課我們來學學如何展示圖片,話不多說,先上效果
好,教程開始~前情提要,要看懂這篇,建議搭配樓主的前兩期文章
使用ESP32驅動LCD-ST7789屏幕[ESP–2]
加速你的LCD-ST7789屏幕![ESP–3]
好,話不多說,直接開始
顯示原理
ST7789支持的顏色為RGB565,一般我們常見的顏色是RGB888,就是RGB三色各占一個字節(jié)(一個字節(jié)8位),ST7789畢竟是MCU模塊,自然要減輕負擔,所以RGB閹割成了2字節(jié)能表示的(人眼對綠光最敏感,所以綠光的色階更多)
然后如何在屏幕上放像素呢?
tft.drawPixel(x , y , 0xFFFF);
//封裝好的函數(shù),直接輸入一個二字節(jié)數(shù)就行,多么簡單
所以現(xiàn)在的問題就是怎么把圖片轉換為一個RGB565數(shù)組,然后導入我們的程序。這里我使用的是開源的格式轉換工具BMPCVT
在網(wǎng)上和GITHUB上有這個軟件
使用方法
- 點擊FILE/OPEN 打開你需要轉換的文件
、
選擇IMAGE/CONVERT INTO /16BIT COLOR565
選擇FILE/SAVE AS/進入下面的界面
選擇C bitmap的格式,保存到你可見的位置
/
最后的加工
不過這個數(shù)組我們現(xiàn)在還不能直接使用,因為我們用的是eSPI 庫,這個作者用的是GUI(?)
打開文件,你會看到這個畫面
- 刪除include 命令
- 刪除數(shù)組的static 修飾符
- 刪去結尾的那個結構體
- 將這個文件放到你的工程中去
- 如果可以,把后綴改成H,然后包含一下
下面就是代碼了
#include <TFT_eSPI.h>
#include <SPI.h>#include "image_rgb565.cpp"
//包含你的數(shù)組class Timer {
public:Timer() : start_timepoint(std::chrono::high_resolution_clock::now()) {}void reset() {start_timepoint = std::chrono::high_resolution_clock::now();}double elapsed() const {auto end_timepoint = std::chrono::high_resolution_clock::now();std::chrono::duration<double> elapsed_time = end_timepoint - start_timepoint;return elapsed_time.count();}private:std::chrono::time_point<std::chrono::high_resolution_clock> start_timepoint;
};
Timer timer;TFT_eSPI tft = TFT_eSPI(); // 使用優(yōu)化后的TFT_eSPI庫void drawImage() {// 將圖片數(shù)據(jù)繪制到 ST7789 上int16_t x = 0, y = 0; // 圖像繪制起始位置for (int16_t j = 0; j < 240; j++) {for (int16_t i = 0; i < 240; i++) {uint16_t color = image_data[j * 240 + i];tft.drawPixel(x + i, y + j, color);}}
}void setup() {Serial.begin(9600);tft.init();tft.setRotation(1); // 設置旋轉// 如果需要,可以明確調(diào)用長寬// 顯示固定的文本,只在 setup 中顯示一次tft.fillScreen(TFT_BLACK);Serial.printf("Total heap: %d ", ESP.getHeapSize()); // 獲取總堆內(nèi)存大小Serial.println();Serial.printf("Free heap: %d", ESP.getFreeHeap()); // 獲取當前可用堆內(nèi)存大小Serial.println();Serial.printf("Total PSRAM: %d", ESP.getPsramSize()); // 獲取總PSRAM大小(如果支持)Serial.println();Serial.printf("Free PSRAM: %d", ESP.getFreePsram()); // 獲取當前可用PSRAM大小(如果支持)Serial.println();
}void loop() {// 繪制動態(tài)變化的部分tft.fillRect(0, 0, 100, 50, TFT_BLACK); // 清除FPS部分drawImage();float FPS = 1 / (timer.elapsed());tft.setCursor(0, 0);tft.printf("FPS: %.2f", FPS);timer.reset();delay(50);}