使用ESP32CAM開發實時視頻監控應用

一、ESP32CAM介紹

ESP32CAM 是由 ESPRESSIF 生產的一款基於 ESP32 芯片的開發板,內置一顆 OV2640 攝像頭,支持最大 1600×1200 的 JPEG 輸出。該開發板通過 Wi-Fi 或串口與外界通訊,無需外接服務器即可實現視頻流的監控。另外,它還搭載了一個帶有外接天線的 Wi-Fi 芯片,能夠在約 400 米的室外環境下進行通訊。由於它結合了 ESP32 的強大功能和攝像頭的圖像處理技術,因此可以應用於視頻監控、人機交互、智能家居等多個領域。

二、連接硬件電路

為了使用 ESP32CAM 進行實時視頻監控,需要在 ESP32CAM 上連接一塊 LCD 屏幕,以顯示相機拍攝到的實時圖像。具體步驟如下:
1、將 ESP32CAM 上的 GPIO16 引腳連接到 LCD 屏幕的 RST 引腳上,GPIO17 引腳連接到 LCD 屏幕的 DC 引腳上,GPIO18 引腳連接到 LCD 屏幕的 CS 引腳上,GPIO23 引腳連接到 LCD 屏幕的 MOSI 引腳上,GPIO5 引腳連接到 LCD 屏幕的 SCL 引腳上。
2、通過 USB 線纜將 ESP32CAM 連接到電腦上,用 Arduino IDE 或者其他常用工具對 ESP32CAM 進行編程配置。
3、將 ESP32CAM 與 LCD 屏幕、WIFI 帶天線連接好,插上電源開啟,就可以開始進行實時監控。

三、代碼實現

下面是一個使用 ESP32CAM 進行實時視頻監控的示例代碼,其中使用了 Arduino 庫中提供的 Adafruit_SSD1306、Wire、Adafruit_GFX、WiFi、ESP32_Camera等庫:

#include "Adafruit_SSD1306.h"
#include 
#include 
#include "esp_camera.h"
#include "WiFi.h"

//設置Wi-Fi信息
const char* ssid = "MyNetwork";  //Wi-Fi名稱
const char* password = "MyPassword";  //Wi-Fi密碼

// OLED配置
#define SCREEN_WIDTH 128 // OLED 寬度,單位像素
#define SCREEN_HEIGHT 64 // OLED 高度,單位像素
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

//創建 WIFIClient 對象
WiFiClient client;

//Web服務器地址
const char* server = "192.168.1.102";

void setup() {
  Serial.begin(115200);

  // 初始化ESP32CAM攝像頭的引腳
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = 5;
  config.pin_d1 = 18;
  config.pin_d2 = 19;
  config.pin_d3 = 21;
  config.pin_d4 = 36;
  config.pin_d5 = 39;
  config.pin_d6 = 34;
  config.pin_d7 = 35;
  config.pin_xclk = 0;
  config.pin_pclk = 22;
  config.pin_vsync = 25;
  config.pin_href = 23;
  config.pin_sscb_sda = 26;
  config.pin_sscb_scl = 27;
  config.pin_pwdn = 32;
  config.pin_reset = -1;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  config.frame_size = FRAMESIZE_UXGA;
  config.jpeg_quality = 10;
  config.fb_count = 2;

  // 啟動ESP32CAM攝像頭
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  //初始化和顯示OLED
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 initialization failed"));
    return;
  }
  display.display();
  delay(2000);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println("Camera Initialized!");

  //連接Wi-Fi網絡,打印連接情況
  WiFi.begin(ssid, password);
  Serial.println(" ");
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("Connected");
  delay(1000);
}

void loop() {
  //檢測Wi-Fi是否連接,如未連接,則重連
  if(client.connected() == false){
    if (WiFi.status() == WL_CONNECTED) {
      Serial.println("Reconnecting to Web Server");
      if (client.connect(server, 80)) {
        Serial.println("Web Server Connected");
      }
    }
    else{
      Serial.println("WiFi Disconnected");
      while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.print(".");
      }
    }
  }

  //從ESP32CAM獲取一幀圖像數據
  camera_fb_t * fb = esp_camera_fb_get();
  if(!fb) {
    Serial.println("Camera capture failed");
    return;
  }

  //將圖像數據編碼成JPEG格式並上傳到Web服務器
  String head = "--WiFiEsp32CamBoundary\r\nContent-Disposition: form-data; name=\"file\"; filename=\"esp32cam.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n";
  String tail = "\r\n--WiFiEsp32CamBoundary--\r\n";
  client.println("POST /upload HTTP/1.1");
  client.println("Host: " + String(server));
  client.println("Content-Length: " + String(head.length() + fb->len + tail.length()) + "\r\n" + "Content-Type: multipart/form-data; boundary=WiFiEsp32CamBoundary");
  client.print(head);
  client.write(fb->buf, fb->len);
  client.print(tail);

  //清除圖像緩存並更新OLED顯示
  esp_camera_fb_return(fb);
  display.clearDisplay();
  display.setCursor(0, 0);
  display.println("Data sent to Server\n");
  display.display();
  delay(5000);
}

四、缺陷及優化

該示例代碼雖然能夠從 ESP32CAM 上獲取實時視頻流並上傳到Web服務器上進行實時監控,但在實際應用時還存在一些不足。如圖像質量較低,時間延遲大,上傳數據量大等問題。為了優化應用效果,可以將圖像數據進行壓縮、使用視頻流作為上傳方式等多種手段進行優化。

五、總結

使用 ESP32CAM 開發實時視頻監控應用需要將 ESP32CAM 連接到 LCD 屏幕,然後通過編程配置 ESP32CAM 實現視頻實時監控效果。代碼示例中,我們使用 Arduino 庫中提供的 Adadruit_SSD1306、Wire、Adafruit_GFX、WiFi、ESP32_Camera 等庫,編寫了一段通過使用 ESP32CAM 拍攝實時視頻並將圖像數據上傳到 Web 服務器,實現實時視頻監控的示例程序。然而,實際應用中仍需要通過多種手段對應用進行優化,以實現更高效、更穩定、更安全的視頻監控。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/201131.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-06 11:30
下一篇 2024-12-06 11:30

相關推薦

發表回復

登錄後才能評論