Search Code

ESP32 Упатство 44/55 - ESP32 Камера Веб Сервер Видео Пренос Преку Wifi CAM-2 | SunFounder's ESP32 комплет

ESP32 Упатство 44/55 - ESP32 Камера Веб Сервер Видео Пренос Преку Wifi CAM-2 | SunFounder's ESP32 комплет

Во ова упатство, ќе создадеме временска станица во реално време користејќи го ESP32 и неговата камера екстензија. Овој проект ќе му овозможи на ESP32 да прикажува временски податоци како температура и влажност на LCD екран, додека истовремено стримува видео преку Wi-Fi. До крајот на ова упатство, ќе имате целосно функционална временска станица која се ажурира на секои 10 секунди, обезбедувајќи вредни временски информации на вашите прсти. За повеќе јасност, погледнете го видеото (во видеото на 00:00).

extension_bopard_camera

Објаснување на хардверот

Главните компоненти на овој проект вклучуваат ESP32 микроконтролер, LCD дисплеј и камера модул. ESP32 е моќен микроконтролер кој има вградени Wi-Fi и Bluetooth можности, овозможувајќи му да се поврзе на интернет и да комуницира со други уреди. Камера модулот овозможува видео стриминг, додека LCD дисплејот ги прикажува временските информации на корисникот.

LCD-от користен во овој проект е 20x4 карактерен дисплеј, кој може да прикаже значителна количина на информации одеднаш. Тој е поврзан со ESP32 за прикажување на температурата, влажноста и други временски податоци преземени од онлајн API. 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-от и камерата. Потоа, поврзете го 5V пинот на ESP32 со VCC на LCD-от. За камерата, поврзете ја кафеавата жица со заземјување, црвената жица со 5V, жолтата жица со GPIO 21, и портокаловата жица со GPIO 22. Осигурете се дека врските се безбедни за да избегнете какви било проблеми за време на работата.

Следно, поврзете го LCD-от со соодветните GPIO пинови. Специфичните пинови може да варираат во зависност од вашата поставеност, но обично, ќе ги поврзете контролните пинови со одредени GPIO на ESP32. Погрижете се да ја погледнете техничката спецификација или дијаграмот на пинови за вашиот специфичен LCD модел за да го потврдите правилното жицирање. По завршувањето на овие врски, проверете ги сите жици за какви било лабави или неточни врски.

Примери на код & Објаснување

Во кодот, прво ги вклучуваме потребните библиотеки за управување со камерата и Wi-Fi функционалностите. Суштинските идентификатори се декларирани, вклучувајќи ги ssid и password за Wi-Fi акредитиви. Конфигурацијата за камерата е поставена користејќи ја структурата 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 поврзувањето и го стартуваме серверот за камера. Јамката за поврзување продолжува додека не се воспостави успешна Wi-Fi врска, што е клучно за преземање временски податоци од API-то.

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 Избор на ESP32 плоча и COM порт во Arduino IDE
  • 9:17 Демонстрација
  • 12:06 Демонстрација на мобилен телефон

Images

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
Language: 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);
}

Resources & references

Files📁

No files available.