ESP32-CAM 定时发送照片到服务器:WebSocket 示例及中文注释

以下是一个 ESP32-CAM 通过 WebSocket 定时发送照片给服务器的示例代码,附带中文注释:

#include <WiFi.h>
#include <WebSocketsClient.h>
#include <ArduinoJson.h>
#include "esp_camera.h"
#include "img_converters.h"
#include "fb_gfx.h"
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"

// 定义 WiFi 信息
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";

// 定义 WebSocket 服务器信息
const char* serverAddress = "your_SERVER_ADDRESS";
const int serverPort = 8080;

// 定义 WebSocket 客户端
WebSocketsClient webSocket;

// 定义摄像头分辨率和旋转角度
#define CAMERA_MODEL_AI_THINKER
#define PWDN_GPIO_NUM     -1
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM     4
#define SIOD_GPIO_NUM     18
#define SIOC_GPIO_NUM     23
#define Y9_GPIO_NUM       36
#define Y8_GPIO_NUM       37
#define Y7_GPIO_NUM       38
#define Y6_GPIO_NUM       39
#define Y5_GPIO_NUM       35
#define Y4_GPIO_NUM       14
#define Y3_GPIO_NUM       13
#define Y2_GPIO_NUM       34
#define VSYNC_GPIO_NUM    5
#define HREF_GPIO_NUM     27
#define PCLK_GPIO_NUM     25
#define D0_GPIO_NUM       32
#define D1_GPIO_NUM       33
#define D2_GPIO_NUM       15
#define D3_GPIO_NUM       2
#define D4_GPIO_NUM       0
#define D5_GPIO_NUM       4
#define D6_GPIO_NUM       16
#define D7_GPIO_NUM       17
#define CAM_RESOLUTION    FRAMESIZE_VGA
#define CAM_ROTATION      0

// 初始化摄像头
void initCamera() {
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
  esp_err_t err = esp_camera_init(&camera_config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }
  sensor_t *sensor = esp_camera_sensor_get();
  sensor->set_framesize(sensor, CAM_RESOLUTION);
  sensor->set_vflip(sensor, 1);
  sensor->set_hmirror(sensor, 1);
  sensor->set_rotation(sensor, CAM_ROTATION);
}

// 定时器回调函数,用于定时发送照片给服务器
void sendPhoto() {
  camera_fb_t *fb = esp_camera_fb_get();
  if (!fb) {
    Serial.println("Camera capture failed");
    return;
  }
  // 将照片转换为 JPEG 格式
  size_t jpegSize = 0;
  uint8_t *jpegBuffer = NULL;
  bool jpegConversionSuccess = frame2jpg(fb, 80, &jpegBuffer, &jpegSize);
  esp_camera_fb_return(fb);
  if (!jpegConversionSuccess) {
    Serial.println("JPEG conversion failed");
    return;
  }
  // 发送照片给服务器
  webSocket.sendBIN(jpegBuffer, jpegSize);
  free(jpegBuffer);
}

// WebSocket 事件处理函数
void webSocketEvent(WStype_t type, uint8_t *payload, size_t length) {
  switch (type) {
    case WStype_DISCONNECTED:
      Serial.println("WebSocket disconnected");
      break;
    case WStype_CONNECTED:
      Serial.println("WebSocket connected");
      break;
    case WStype_TEXT:
      Serial.println("Received text message: '" + String((char*)payload) + "'");
      break;
    case WStype_BIN:
      Serial.println("Received binary message");
      break;
    case WStype_ERROR:
      Serial.println("WebSocket error");
      break;
    case WStype_FRAGMENT_TEXT_START:
      Serial.println("Text fragment start");
      break;
    case WStype_FRAGMENT_BIN_START:
      Serial.println("Binary fragment start");
      break;
    case WStype_FRAGMENT:
      Serial.println("Fragment");
      break;
    case WStype_FRAGMENT_FIN:
      Serial.println("Fragment end");
      break;
  }
}

void setup() {
  Serial.begin(115200);
  // 关闭串口 0,避免与摄像头通讯冲突
  Serial.swap();
  // 初始化 WiFi 连接
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("WiFi connected");
  // 初始化摄像头
  initCamera();
  // 连接 WebSocket 服务器
  webSocket.begin(serverAddress, serverPort, "/");
  webSocket.onEvent(webSocketEvent);
  // 定时器,每隔 5 秒钟发送一次照片给服务器
  setInterval(5000, sendPhoto);
}

void loop() {
  webSocket.loop();
}

实现步骤:

  1. 定义 WiFi 和 WebSocket 服务器信息。
  2. 初始化摄像头,并设置分辨率和旋转角度。
  3. 定义定时器回调函数 sendPhoto(),用于定时发送照片给服务器。
  4. 定义 WebSocket 事件处理函数 webSocketEvent(),用于处理 WebSocket 事件。
  5. setup() 函数中,连接 WiFi 和 WebSocket 服务器,初始化摄像头,设置定时器。
  6. loop() 函数中,调用 webSocket.loop(),处理 WebSocket 事件。

注意事项:

  • 由于 ESP32-CAM 的串口 0 与摄像头通讯冲突,因此在 setup() 函数中需要调用 Serial.swap() 关闭串口 0。
  • 由于 ESP32-CAM 的内存有限,需要注意内存使用情况,避免内存泄漏等问题。

希望此示例能够帮助您快速上手使用 ESP32-CAM 通过 WebSocket 定时发送照片到服务器。

ESP32-CAM 定时发送照片到服务器:WebSocket 示例及中文注释

原文地址: https://www.cveoy.top/t/topic/jM3O 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录