Arduino筆記(90):ESP32CAM將影像呈現在ST7789(1.5吋 TFT-LCD)

繼續前一篇初次設定 ESP32CAM的實作,想將ESP32CAM做一個簡單的相機功能,或是加上人體感應器(PIR),當感應物體移動時,就拍照存到SD卡,或是寄出照片到 Gmail 信箱等,都是想實作完成的項目。接下來就看一下如何將拍照的影像呈現到顯示器,我用的型號是 ST7789 的1.5吋 TFT-LCD,解析度是 240x240,影像品質還可以,足可呈現拍攝的影像。

[材料]

  • USB轉TTL序列傳輸線 CP2102
  • ESP32CAM開發板
  • ST7789 1.5" TFT-LCD
  • 排線 x n 條

[接線圖]

ESP32CAMCP2012ST7789 1.5" TFT-LCD
5V5V(VCC)VCC
GNDGNDGND
VORTX-
VOTRX-
IO0GND-
GPIO2-RES(RST)
GPIO14-MOSI(SDA)
GPIO15-SCLK(SCK)
GPIO13-DC
上傳程式到 ESP32時,需將IO0接地(如下圖連接的橘色線條)。上傳完成後,要獨立執行上傳到ESP32CAM時,需將IO0與接地的線分開(如下圖連接的橘色線條)。



[安裝程式庫]

本實作需要安裝以下程式庫: 程式庫(Library)安裝方法請參考另一篇文章:  Arduino筆記:安裝 Arduino IDE 程式庫(Library)


[程式]

參考的程式是 liefyuan 在 Github 的程式庫:Arduino_ST7789_Comp
接好 ST7789 及 ESP32CAM 的線路,將程式上傳。只要執行就會開啟 LED 閃光燈,這個 LED 燈太刺眼了,想辦法將它關掉。找了一些文件,發現這個閃光燈是接在 GPIO4,而原來的程式 TFT_DC 就是接到 GPIO4。為了解決不要開閃光燈問題,我將 ST7789 連接DC的線改接到 ESP32CAM 的 GPIO13,並加上一段關閉閃光燈的程式碼如下:
pinMode(4, OUTPUT);   //GPIO4 是 LED閃光燈的IO
digitalWrite(4, LOW);  //關閉閃光燈
修改後的程式如下:
#include <Adafruit_GFX.h>    // Core graphics library
#include <Arduino_ST7789_Comp.h> // Hardware-specific library for ST7789
#include <esp_camera.h>
#include <SPI.h>             // Arduino SPI library

// ST7789 TFT 模組接線設定
#define TFT_RST         2    // Or set to -1 and connect to Arduino RESET pin
#define TFT_DC         13
#define TFT_MOSI        14    // Data out
#define TFT_SCLK        15    // Clock out

// Initialize Adafruit ST7789 TFT library
Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST, TFT_MOSI, TFT_SCLK);

#define SCREEN_WIDTH  240 
#define SCREEN_HEIGHT 240 

#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27

#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22

static camera_config_t camera_config = {
  .pin_pwdn = PWDN_GPIO_NUM,
  .pin_reset = RESET_GPIO_NUM,
  .pin_xclk = XCLK_GPIO_NUM, 
  .pin_sscb_sda = SIOD_GPIO_NUM,  
  .pin_sscb_scl = SIOC_GPIO_NUM,
     
  .pin_d7 = Y9_GPIO_NUM,
  .pin_d6 = Y8_GPIO_NUM,
  .pin_d5 = Y7_GPIO_NUM, 
  .pin_d4 = Y6_GPIO_NUM,
  .pin_d3 = Y5_GPIO_NUM,
  .pin_d2 = Y4_GPIO_NUM,  
  .pin_d1 = Y3_GPIO_NUM,
  .pin_d0 = Y2_GPIO_NUM,
  .pin_vsync = VSYNC_GPIO_NUM,
  .pin_href = HREF_GPIO_NUM,
  .pin_pclk = PCLK_GPIO_NUM,

  .xclk_freq_hz = 20000000,
  .ledc_timer = LEDC_TIMER_0,
  .ledc_channel = LEDC_CHANNEL_0,
  
  .pixel_format = PIXFORMAT_RGB565,
  .frame_size = FRAMESIZE_HQVGA,
  .jpeg_quality = 12,
  .fb_count = 1,
};

byte x,y;
uint8_t oldpixel, newpixel;
int quanterror;

esp_err_t camera_init(){
    //initialize the camera
    esp_err_t err = esp_camera_init(&camera_config);
    if (err != ESP_OK) {
        Serial.print("Camera Init Failed");
        return err;
    }
    sensor_t * s = esp_camera_sensor_get();
    //初始化影像拍攝翻轉及色彩飽和度
    if (s->id.PID == OV2640_PID) {
        s->set_vflip(s, 1);//flip it back
        s->set_brightness(s, 1);//up the blightness just a bit
        s->set_contrast(s, 1);
    }
  
    Serial.print("Camera Init OK");
    return ESP_OK;
}

void showImage(void)
{
    camera_fb_t *fb = esp_camera_fb_get();
    // 顯示影像
    tft.drawEsp32camImage(0, 0, 240, 480, (uint8_t*)fb->buf);
    esp_camera_fb_return(fb);
}
 
void setup(void) {
    Serial.begin(115200);
    // 關閉 ESP32-CAM 板上的 LED閃光燈
    pinMode(4, OUTPUT);   //GPIO4 是 LED閃光燈的IO
    digitalWrite(4, LOW);  //關閉閃光燈
          
    // 假使顯示器有 CS pin 試著使用 SPI_MODE0
    tft.init(240, 240);    // Init ST7789 display 240x240 pixel
    
    // 將影像轉90度,如果影像翻轉,可將這行改成註解或刪除
    tft.setRotation(2);
    
    Serial.println(F("Initialized"));

    uint16_t time = millis();
    tft.fillScreen( WHITE);
    time = millis() - time;
    
    camera_init();
    Serial.println("done");
    delay(1000);
}
 
void loop() {
    showImage();
}

[結果]

將鏡頭對準馬克杯拍攝,可以看到畫面顯示在 TFT-LCD上。

[參考資料]

Post a Comment

較新的 較舊