코드 검색

ESP32 튜토리얼 44/55 - ESP32 카메라 웹 서버 WiFi를 통한 비디오 스트림 CAM-2 | SunFounder의 ESP32 키트

ESP32 튜토리얼 44/55 - ESP32 카메라 웹 서버 WiFi를 통한 비디오 스트림 CAM-2 | SunFounder의 ESP32 키트

이 튜토리얼에서는 ESP32와 카메라 확장 보드를 사용하여 실시간 기상 관측소를 만들어 보겠습니다. 이 프로젝트를 통해 ESP32는 LCD 화면에 온도와 습도 같은 기상 데이터를 표시하면서 Wi-Fi를 통해 비디오를 스트리밍할 수 있습니다. 이 튜토리얼이 끝나면 10초마다 업데이트되어 유용한 기상 정보를 바로 확인할 수 있는 완전한 기능의 기상 관측소를 갖게 됩니다. 더 자세한 내용은 비디오(비디오 00:00 부분)를 참조하세요.

확장 보드 카메라

하드웨어 설명

이 프로젝트의 주요 구성 요소는 ESP32 마이크로컨트롤러, LCD 디스플레이, 카메라 모듈입니다. ESP32는 Wi-Fi와 Bluetooth 기능이 내장된 강력한 마이크로컨트롤러로, 인터넷에 연결하고 다른 장치와 통신할 수 있습니다. 카메라 모듈은 비디오 스트리밍을 가능하게 하고, LCD 디스플레이는 사용자에게 기상 정보를 표시합니다.

이 프로젝트에 사용된 LCD는 20x4 문자 디스플레이로, 한 번에 많은 정보를 표시할 수 있습니다. 온라인 API에서 가져온 온도, 습도 및 기타 기상 데이터를 표시하기 위해 ESP32에 연결됩니다. ESP32에는 배터리 관리 시스템도 포함되어 있어 무선으로 작동할 수 있습니다.

데이터시트 세부 정보

제조업체 Espressif
부품 번호 ESP32-WROOM-32
로직/IO 전압 3.3 V
공급 전압 3.0 - 3.6 V
출력 전류 (GPIO당) 12 mA
피크 전류 (GPIO당) 40 mA
PWM 주파수 가이드 1 kHz
입력 로직 임계값 0.3 * VDD ~ 0.7 * VDD
전압 강하 / RDS(on) / 포화 0.1 V (일반)
열 제한 125 °C
패키지 QFN48
참고 사항 / 변형 PSRAM 옵션 포함

 

  • 적절한 전원 공급(3.0 - 3.6 V)을 확인하세요.
  • 고전류 애플리케이션에는 방열판을 사용하세요.
  • GPIO 전류 제한(핀당 12 mA)에 주의하세요.
  • LCD와 카메라를 올바르게 연결하여 통신 오류를 방지하세요.
  • 연결 문제가 있는 경우 Wi-Fi 자격 증명과 API 키를 확인하세요.

배선 지침

ESP32를 LCD 및 카메라 모듈과 배선하려면 먼저 전원 핀과 접지 핀을 연결하세요. ESP32의 접지 핀을 LCD와 카메라의 접지에 연결합니다. 그런 다음 ESP32의 5V 핀을 LCD의 VCC에 연결합니다. 카메라의 경우 갈색 선을 접지에, 빨간색 선을 5V에, 노란색 선을 GPIO 21에, 주황색 선을 GPIO 22에 연결합니다. 작동 중 문제가 발생하지 않도록 연결이 확실한지 확인하세요.

다음으로 LCD를 적절한 GPIO 핀에 연결합니다. 특정 핀은 설정에 따라 다를 수 있지만, 일반적으로 제어 핀을 ESP32의 지정된 GPIO에 연결합니다. 사용 중인 특정 LCD 모델의 데이터시트나 핀아웃 다이어그램을 참조하여 올바른 배선을 확인하세요. 이러한 연결을 완료한 후 모든 배선에 느슨하거나 잘못된 연결이 없는지 다시 확인하세요.

코드 예제 및 설명

코드에서 먼저 카메라와 Wi-Fi 기능을 처리하는 데 필요한 라이브러리를 포함합니다. 필수 식별자는 Wi-Fi 자격 증명을 위한 ssidpassword를 포함하여 선언됩니다. 카메라 구성은 camera_config_t 구조체를 사용하여 설정되며, 여기서 픽셀 형식 및 프레임 크기와 같은 다양한 매개변수를 정의합니다.

const char* ssid = "SSID";
const char* password = "PASSWORD";

void setup() {
  Serial.begin(115200);
  camera_config_t config;
  // ... (구성 설정)
  esp_err_t err = esp_camera_init(&config);
  // 오류 확인
}

이 스니펫은 카메라를 초기화하고 설정 중 오류가 있는지 확인합니다. 카메라 초기화에 실패하면 오류 메시지가 시리얼 모니터에 출력됩니다.

다음으로 Wi-Fi 연결을 처리하고 카메라 서버를 시작합니다. 연결 루프는 API에서 기상 데이터를 가져오는 데 중요한 Wi-Fi 연결이 성공할 때까지 계속됩니다.

WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}
startCameraServer();

이 섹션에서는 Wi-Fi 연결을 시작하고 연결이 설정될 때까지 시리얼 모니터에 점을 출력합니다. 연결되면 카메라 서버가 시작되어 비디오 스트리밍이 가능해집니다.

전체 코드는 기사 아래에 로드되며, 모든 부분이 어떻게 결합되는지 확인할 수 있습니다.

시연 / 기대 효과

모든 배선이 완료되고 코드가 업로드되면 ESP32가 Wi-Fi 네트워크에 연결되어 10초마다 기상 데이터를 가져오기 시작합니다. 온도와 습도 판독값이 LCD 화면에 표시됩니다. 또한 카메라는 Wi-Fi를 통해 비디오를 스트리밍하며, 시리얼 모니터에 출력된 로컬 IP 주소를 통해 접속할 수 있습니다. Wi-Fi 연결에 실패하면 ESP32가 시리얼 출력을 통해 알려줍니다(비디오 10:00 부분).

비디오 타임스탬프

  • 00:00 시작
  • 1:42 ESP32-Cam 소개
  • 4:30 Arduino 코드 설명
  • 7:35 Arduino IDE에서 ESP32 보드 및 COM 포트 선택
  • 9:17 시연
  • 12:06 모바일 폰에서의 시연

이미지

ESP32-40-micro-sd-card-2
ESP32-40-micro-sd-card-2
extension_bopard_camera
extension_bopard_camera
845-ESP32 Tutorial 44/55- Arduino code for camera web sever
언어: C++
#include "esp_camera.h"
#include <WiFi.h>

//
// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality
//            Ensure ESP32 Wrover Module or other board with PSRAM is selected
//            Partial images will be transmitted if image exceeds buffer size
//
//            You must select partition scheme from the board menu that has at least 3MB APP space.
//            Face Recognition is DISABLED for ESP32 and ESP32-S2, because it takes up from 15 
//            seconds to process single frame. Face Detection is ENABLED if PSRAM is enabled as well

// ===================
// Select camera model
// ===================
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
// #define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM
#define CAMERA_MODEL_AI_THINKER // Has PSRAM
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM
//#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM
// ** Espressif Internal Boards **
//#define CAMERA_MODEL_ESP32_CAM_BOARD
//#define CAMERA_MODEL_ESP32S2_CAM_BOARD
//#define CAMERA_MODEL_ESP32S3_CAM_LCD

#include "camera_pins.h"

// Replace the next variables with your SSID/Password combination
const char* ssid = "SSID";
const char* password = "PASSWORD";

void startCameraServer();
void setupLedFlash(int pin);

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  Serial.println();

  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sccb_sda = SIOD_GPIO_NUM;
  config.pin_sccb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.frame_size = FRAMESIZE_UXGA;
  config.pixel_format = PIXFORMAT_JPEG; // for streaming
  // config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition
  config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
  config.fb_location = CAMERA_FB_IN_PSRAM;
  config.jpeg_quality = 12;
  config.fb_count = 1;
  
  // if PSRAM IC present, init with UXGA resolution and higher JPEG quality
  //                      for larger pre-allocated frame buffer.
  if(config.pixel_format == PIXFORMAT_JPEG){
    if(psramFound()){
      config.jpeg_quality = 10;
      config.fb_count = 2;
      config.grab_mode = CAMERA_GRAB_LATEST;
    } else {
      // Limit the frame size when PSRAM is not available
      config.frame_size = FRAMESIZE_SVGA;
      config.fb_location = CAMERA_FB_IN_DRAM;
    }
  } else {
    // Best option for face detection/recognition
    config.frame_size = FRAMESIZE_240X240;
#if CONFIG_IDF_TARGET_ESP32S3
    config.fb_count = 2;
#endif
  }

#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

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

  sensor_t * s = esp_camera_sensor_get();
  // initial sensors are flipped vertically and colors are a bit saturated
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1); // flip it back
    s->set_brightness(s, 1); // up the brightness just a bit
    s->set_saturation(s, -2); // lower the saturation
  }
  // drop down frame size for higher initial frame rate
  if(config.pixel_format == PIXFORMAT_JPEG){
    s->set_framesize(s, FRAMESIZE_QVGA);
  }

#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
  s->set_vflip(s, 1);
  s->set_hmirror(s, 1);
#endif

#if defined(CAMERA_MODEL_ESP32S3_EYE)
  s->set_vflip(s, 1);
#endif

// Setup LED FLash if LED pin is defined in camera_pins.h
#if defined(LED_GPIO_NUM)
  setupLedFlash(LED_GPIO_NUM);
#endif

  WiFi.begin(ssid, password);
  WiFi.setSleep(false);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  startCameraServer();

  Serial.print("Camera Ready! Use 'http://");
  Serial.print(WiFi.localIP());
  Serial.println("' to connect");
}

void loop() {
  // Do nothing. Everything is done in another task by the web server
  delay(10000);
}

자원 및 참고자료

파일📁

파일이 없습니다.