Руководство по устранению неполадок ESP32-CAM

После выпуска нескольких проектов с ESP32-CAM, некоторые читатели сообщили о проблемах при использовании ESP32-CAM. Данное руководство представляет собой сборник наиболее распространённых ошибок при работе с ESP32-CAM и способов их устранения.

Руководство по устранению неполадок ESP32-CAM: исправление самых распространённых проблем

Мы выпустили следующие проекты с ESP32-CAM:

Примечание: некоторые из наших читателей сообщали об ошибках при следовании проекту ESP32-CAM с Home Assistant. Мы изменили некоторые строки в коде, поэтому большинство проблем, связанных с этим проектом, должны быть исправлены.

Обратите внимание, что некоторые из этих ошибок нам не удалось воспроизвести на нашей стороне. Тем не менее, мы собрали всю информацию от наших читателей, чтобы найти ответы на наиболее распространённые проблемы.

Если у вас другая проблема или другое решение, вы можете поделиться своими советами, написав комментарий ниже.

Наиболее распространённые ошибки:

01. Failed to connect to ESP32: Timed out waiting for packet header 02. Camera init failed with error 0x20001 или аналогичная 03. Brownout detector или Guru meditation error 04. Sketch too big error — неправильная схема разделов 05. Board at COMX is not available — COM-порт не выбран 06. Psram error: GPIO isr service is not installed 07. Слабый сигнал Wi-Fi 08. Нет IP-адреса в Serial Monitor Arduino IDE 09. Не удаётся открыть веб-сервер 10. Изображение тормозит / высокая задержка 11. esp_camera_fb_get(): Failed to get the frame on time!

1. Failed to connect to ESP32: Timed out waiting for packet header

ESP32-CAM Failed to connect to ESP32: Timed out waiting for packet header

Эта ошибка означает, что ESP32-CAM не находится в режиме прошивки или неправильно подключена к FTDI-программатору.

Проверьте шаги загрузки кода

Убедитесь, что вы точно выполнили все шаги для перевода ESP32-CAM в режим прошивки. Невыполнение одного из шагов может привести к этой ошибке. Вот шаги, которые нужно выполнить:

Подключите плату ESP32-CAM к компьютеру с помощью FTDI-программатора. Используйте следующую схему подключения:

ESP32-CAM подключена к FTDI-программатору для загрузки программы через Arduino IDE

Важно: GPIO 0 должен быть подключён к GND, чтобы можно было загружать код.

Многие FTDI-программаторы имеют джампер, позволяющий выбрать 3.3V или 5V. Убедитесь, что джампер установлен в правильное положение для выбора 5V.

Важно: GPIO 0 должен быть подключён к GND, чтобы можно было загружать код.

ESP32-CAM

FTDI-программатор

GND

GND

5V

VCC (5V)

U0R

TX

U0T

RX

GPIO 0

GND

Для загрузки кода выполните следующие шаги:

  1. Перейдите в Tools > Board и выберите AI-Thinker ESP32-CAM.

  2. Перейдите в Tools > Port и выберите COM-порт, к которому подключена ESP32.

  3. Затем нажмите кнопку загрузки, чтобы загрузить код.

Кнопка загрузки Arduino IDE
  1. Когда в окне отладки начнут появляться точки, как показано ниже, нажмите встроенную кнопку RST на ESP32-CAM.

Точки при загрузке кода

Через несколько секунд код должен быть успешно загружен на вашу плату.

GPIO 0 должен быть подключён к GND

Важно: если вы не можете загрузить код, убедитесь, что GPIO 0 подключён к GND и что вы выбрали правильные настройки в меню Tools. Также нажмите встроенную кнопку Reset, чтобы перезапустить ESP32 в режиме прошивки. Кроме того, убедитесь, что джампер на FTDI-программаторе установлен на 5V.

Проверьте используемый FTDI-программатор

Один из наших читателей сообщил следующее: «обнаружил, что плату можно программировать с помощью USB-to-TTL модуля модели CP2102, а модель CH340 НЕ работает». Вот FTDI-программатор, который мы используем.

Питание ESP32-CAM от 5V

Некоторые из наших читателей сообщили, что загрузить код удалось только при питании ESP32 от 5V. Поэтому запитывайте ESP32-CAM от 5V.

FTDI-программатор 5V

Измерьте выходное напряжение вашего FTDI-программатора (VCC и GND) с помощью мультиметра, чтобы убедиться, что он обеспечивает 5V для вашей ESP32-CAM.

Выходное напряжение FTDI-программатора 5V на мультиметре

2. Camera init failed with error 0x20001 или аналогичная

ESP32-CAM Camera init failed with error 0x20001 или аналогичная

Если вы получаете именно эту ошибку, это означает, что ваша камера OVX неправильно подключена к плате ESP32 или в коде неправильно указано назначение пинов.

Иногда многократное отключение и подключение FTDI-программатора или многократная перезагрузка платы может решить проблему.

Камера подключена неправильно

Камера имеет крошечный разъём, и вы должны убедиться, что она подключена правильной стороной и плотно зафиксирована, иначе не удастся установить соединение.

Неправильное назначение пинов в коде

Эта ошибка также может означать, что вы не выбрали правильную плату в секции define или определение пинов неправильно для вашей платы.

Убедитесь, что в ваших проектах выбран правильный модуль камеры. Нужно просто раскомментировать правильный модуль камеры и закомментировать все остальные:

//#define CAMERA_MODEL_WROVER_KIT
//#define CAMERA_MODEL_M5STACK_PSRAM
#define CAMERA_MODEL_AI_THINKER

В данном примере мы используем CAMERA_MODEL_AI_THINKER, поэтому именно он активирован. В противном случае назначение пинов будет неверным и камера не сможет инициализироваться.

Существует множество плат esp32-cam («поддельные платы»), в которых разводка между ESP32 и камерой OV может отличаться, поэтому простого выбора модуля камеры может быть недостаточно. Возможно, потребуется проверить каждое объявление gpio в соответствии с распиновкой вашей платы.

Например, плата M5Stack без PSRAM имеет другое назначение пинов, чем M5STACK с PSRAM (определённое в коде по умолчанию). Поэтому нужно изменить определение пинов в коде в соответствии с распиновкой платы.

Недостаточно питания через USB-порт

Если вы питаете ESP32 через USB-порт компьютера, он может не обеспечивать достаточную мощность.

Неисправный FTDI-программатор

Некоторые читатели также сообщили, что эта проблема была решена заменой их FTDI-программатора на этот.

Камера/коннектор сломаны

Если вы получаете эту ошибку, это также может означать, что ваша камера или шлейф камеры сломаны. В этом случае можно приобрести новую камеру OV2640.

3. Brownout detector или Guru meditation error

Когда вы открываете Serial Monitor Arduino IDE и сообщение об ошибке «Brownout detector was triggered» постоянно печатается снова и снова, это означает, что существует какая-то аппаратная проблема.

Обычно это связано с одной из следующих причин:

  • Низкокачественный USB-кабель;

  • USB-кабель слишком длинный;

  • Плата с дефектом (плохая пайка);

  • Плохой USB-порт компьютера;

  • Или недостаточная мощность, обеспечиваемая USB-портом компьютера.

Решение:

  • попробуйте другой, более короткий USB-кабель (с проводами данных)

  • используйте другой USB-порт компьютера или USB-хаб с внешним блоком питания

  • некоторые читатели сообщили, что при питании ESP32-CAM от 5V проблема была решена.

Также следуйте рекомендациям, описанным в пункте 2.

4. Sketch too big error — неправильная схема разделов

ESP32-CAM Sketch too big error --- неправильная схема разделов

Когда вы получаете следующую ошибку:

Sketch too big; see http://www.arduino.cc/en/Guide/Troubleshooting#size for tips on reducing it.
Error compiling for board ESP32 Dev Module.

Это означает, что вы не выбрали правильную схему разделов. Убедитесь, что выбрана правильная схема разделов. В Arduino IDE перейдите в Tools > Partition Scheme и выберите «Huge APP (3MB No OTA)».

5. Board at COMX is not available — COM-порт не выбран

ESP32-CAM COM-порт не выбран

Если вы получаете следующую ошибку или подобную:

serial.serialutil.SerialException: could not open port 'COM8': WindowsError(2, 'The system cannot find the file specified.')
Failed to execute script esptool
the selected serial port Failed to execute script esptool
 does not exist or your board is not connected
Board at COM8 is not available

Это означает, что вы не выбрали COM-порт в меню Tools. В Arduino IDE перейдите в Tools > Port и выберите COM-порт, к которому подключена ESP32.

Это также может означать, что ESP32-CAM не устанавливает последовательное соединение с вашим компьютером или неправильно подключена к USB-разъёму.

6. Psram error: GPIO isr service is not installed

ESP32-CAM Psram error GPIO isr service is not installed

Вы используете плату без PSRAM и получаете следующую ошибку или подобную:

E (161) gpio: gpio_isr_handler_remove(380): GPIO isr service is not installed, call gpio_install_isr_service() first
Camera init failed with error 0x101

когда плата была инициализирована со следующими настройками:

config.frame_size = FRAMESIZE_UXGA;
config.jpeg_quality = 10;
config.fb_count = 2;

Добавление следующего кода исправляет проблему (он понижает разрешение изображения, поэтому для хранения изображений не потребуется столько памяти. Однако в результате вы не сможете получить некоторые форматы высокого разрешения из-за ограниченной памяти):

if(psramFound()){
  config.frame_size = FRAMESIZE_UXGA;
  config.jpeg_quality = 10;
  config.fb_count = 2;
} else {
  config.frame_size = FRAMESIZE_SVGA;
  config.jpeg_quality = 12;
  config.fb_count = 1;
}

Примечание: распознавание и обнаружение лиц не работает на платах без PSRAM. Однако вы по-прежнему можете использовать все остальные функции платы. Например, хотя вы не можете использовать функции распознавания и обнаружения лиц этого проекта (ESP32-CAM видеостриминг и распознавание лиц с Arduino IDE), вы можете экспериментировать с примером и изучать возможности платы, если в коде правильно указано назначение пинов.

7. Слабый сигнал Wi-Fi

Некоторые читатели сообщили, что после питания ESP32-CAM от 5V они получили более стабильный сигнал Wi-Fi. Вы можете прочитать специальное руководство по подключению внешней антенны к ESP32-CAM и расширению зоны покрытия Wi-Fi.

ESP32-CAM имеет возможность использовать либо встроенную антенну, либо внешнюю. Если ваша ESP32-CAM AI-Thinker не подключается к Wi-Fi или имеет слабое подключение, возможно, включена внешняя антенна. Если вы подключите внешнюю антенну к разъёму, она должна работать нормально.

Проверьте, находится ли джампер (резистор 0K) рядом с разъёмом антенны в правильном положении для нужной антенны. Есть 3 маленьких белых квадрата, расположенных в форме «<», где среднее положение является общим.

ESP32-CAM внешняя и встроенная антенна

Фото: Helmut Schoenborn

На следующем фото показан крупный план этой области. Вы можете чётко видеть маленький резистор 0K, подключённый к встроенной антенне.

ESP32-CAM подключена к встроенной антенне

Фото: Helmut Schoenborn

Если плата повёрнута так, что PCB-антенна находится сверху:

  • Для использования PCB-антенны резистор должен быть в верхнем положении, вот так: /

  • Для разъёма антенны резистор должен быть в нижнем положении, вот так: \

Таким образом, чтобы включить встроенную антенну:

  • Отпаяйте резистор, который идёт к антенне, он в положении \

  • И спаяйте вместе два контакта для включения встроенной антенны.

8. Нет IP-адреса в Serial Monitor Arduino IDE

Если вы видите только точки, печатающиеся в Serial Monitor (……), это означает, что ваша ESP32-CAM не устанавливает Wi-Fi-соединение с вашим роутером.

Проверьте сетевые учётные данные

Убедитесь, что вы ввели точные сетевые учётные данные (SSID и пароль) в следующих переменных:

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Выберите правильную скорость передачи в Serial Monitor Arduino IDE

Если вы не выберете правильную скорость передачи в Serial Monitor Arduino IDE, вы не получите IP-адрес вашей платы или увидите на экране мусорные символы.

Убедитесь, что выбрана правильная скорость передачи. В наших примерах с ESP32-CAM мы используем скорость 115200 бод.

Перезагрузите плату несколько раз

Возможно, вам также потребуется несколько раз нажать встроенную кнопку RESET на ESP32-CAM, чтобы перезапустить ESP и вывести IP-адрес при загрузке.

RX и TX перепутаны

Проверьте подключения между платой ESP32 и FTDI-программатором. RX подключается к TX, а TX — к RX. Если эти подключения перепутаны, ESP32-CAM не сможет установить последовательную связь с вашим компьютером.

Дальность Wi-Fi

Если роутер находится далеко от вашей платы ESP32, она может не поймать сигнал Wi-Fi. Убедитесь, что ваша ESP32-CAM находится достаточно близко к роутеру.

9. Не удаётся открыть веб-сервер

Если ESP32-CAM печатает IP-адрес в Serial Monitor Arduino IDE, но при попытке открыть веб-сервер в браузере вы видите пустой экран, обычно это означает, что вы пытаетесь получить доступ к веб-серверу ESP32-CAM из нескольких вкладок браузера.

В настоящее время эти скетчи ESP32-CAM работают только с одним подключённым клиентом одновременно.

10. Изображение тормозит / высокая задержка

Наличие некоторой задержки нормально для такой маленькой и дешёвой камеры. Некоторые читатели предложили следующее для уменьшения задержки:

  • Питайте ESP32-CAM от отдельного блока питания 5V

  • Уменьшите размер кадра, добавив в код следующее:

    config.frame_size = FRAMESIZE_SVGA или config.frame_size = FRAMESIZE_VGA

  • Используйте внешнюю антенну.

11. esp_camera_fb_get(): Failed to get the frame on time!

Мы лично никогда не сталкивались с этой проблемой. Однако многие читатели получают эту ошибку со своими платами ESP32-CAM.

Один из наших читателей (Fibula) предложил следующее для решения этой проблемы:

«Я использую модуль ESP32-CAM Module 2MP OV2640 Camera sensor Module Type-C USB от Aliexpress. Хотя это не упоминается, у него нет дополнительной PSRAM, как у других моделей M5, и у камеры изменён один IO-пин.

Подробнее здесь: https://github.com/m5stack/m5stack-cam-psram/blob/master/README.md — прокрутите до Interface Comparison.

В примере CameraWebServer для Arduino, который мы все, вероятно, используем, нет определения этой модели ESP32-CAM.

Вам нужно добавить его самостоятельно. В главной вкладке добавьте:

#define CAMERA_MODEL_M5STACK_NO_PSRAM

А во вкладке camera_pins.h добавьте следующее:

#elif defined(CAMERA_MODEL_M5STACK_NO_PSRAM)
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM 15
#define XCLK_GPIO_NUM 27
#define SIOD_GPIO_NUM 25
#define SIOC_GPIO_NUM 23
#define Y9_GPIO_NUM 19
#define Y8_GPIO_NUM 36
#define Y7_GPIO_NUM 18
#define Y6_GPIO_NUM 39
#define Y5_GPIO_NUM 5
#define Y4_GPIO_NUM 34
#define Y3_GPIO_NUM 35
#define Y2_GPIO_NUM 17
#define VSYNC_GPIO_NUM 22
#define HREF_GPIO_NUM 26
#define PCLK_GPIO_NUM 21

И всё готово.

Также обратите внимание, что максимальное разрешение модуля ESP32-CAM без PSRAM — XGA 1024×768, предположительно из-за отсутствия PSRAM.»

Надеемся, что это предложение решит вашу проблему. Сообщите нам в комментариях.

Использование MicroSD-карт большого объёма

Согласно даташиту, ESP32-CAM должна поддерживать только карты MicroSD ёмкостью 4 ГБ.

Однако мы тестировали с MicroSD-картой 16 ГБ и она работает нормально.

Возможно, вы не сможете хранить более 4 ГБ, даже если у вас карта на 16 ГБ. Мы не тестировали хранение более 4 ГБ, поэтому не уверены в этом.

Совместимы ли эти проекты с платой M5Stack?

Да, плата M5Stack ESP32 совместима с нашими проектами. Однако вам необходимо проверить распиновку камеры, чтобы убедиться в правильном назначении пинов в коде.

Вы можете проверить подключения камеры M5Stack здесь.

Как установить фиксированный IP-адрес

Чтобы установить статический/фиксированный IP-адрес, вы можете следовать этому руководству:

Настройка ESP32-CAM в режиме точки доступа (AP)

Вы можете настроить ESP32-CAM в качестве точки доступа (AP). Это означает, что вы сможете подключаться к ESP32-CAM напрямую, без необходимости подключения к роутеру. Вы можете использовать следующий код для настройки веб-сервера видеостриминга в качестве точки доступа:

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp32-cam-video-streaming-web-server-camera-home-assistant/

  IMPORTANT!!!
   - Select Board "AI Thinker ESP32-CAM"
   - GPIO 0 must be connected to GND to upload a sketch
   - After connecting GPIO 0 to GND, press the ESP32-CAM on-board RESET button to put your board in flashing mode

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*********/

#include "esp_camera.h"
#include <WiFi.h>
#include "esp_timer.h"
#include "img_converters.h"
#include "Arduino.h"
#include "fb_gfx.h"
#include "soc/soc.h" //disable brownout problems
#include "soc/rtc_cntl_reg.h"  //disable brownout problems
#include "esp_http_server.h"

// Replace with your network credentials
const char* ssid     = "ESP32-Access-Point";
const char* password = "123456789";

#define PART_BOUNDARY "123456789000000000000987654321"

// This project was tested with the AI Thinker Model, M5STACK PSRAM Model and M5STACK WITHOUT PSRAM
#define CAMERA_MODEL_AI_THINKER
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WITHOUT_PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE

// Not tested with this model
//#define CAMERA_MODEL_WROVER_KIT

#if defined(CAMERA_MODEL_WROVER_KIT)
  #define PWDN_GPIO_NUM    -1
  #define RESET_GPIO_NUM   -1
  #define XCLK_GPIO_NUM    21
  #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      19
  #define Y4_GPIO_NUM      18
  #define Y3_GPIO_NUM       5
  #define Y2_GPIO_NUM       4
  #define VSYNC_GPIO_NUM   25
  #define HREF_GPIO_NUM    23
  #define PCLK_GPIO_NUM    22

#elif defined(CAMERA_MODEL_M5STACK_WIDE)
  #define PWDN_GPIO_NUM     -1
  #define RESET_GPIO_NUM    15
  #define XCLK_GPIO_NUM     27
  #define SIOD_GPIO_NUM     22
  #define SIOC_GPIO_NUM     23

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

#elif defined(CAMERA_MODEL_M5STACK_PSRAM)
  #define PWDN_GPIO_NUM     -1
  #define RESET_GPIO_NUM    15
  #define XCLK_GPIO_NUM     27
  #define SIOD_GPIO_NUM     25
  #define SIOC_GPIO_NUM     23

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

#elif defined(CAMERA_MODEL_M5STACK_WITHOUT_PSRAM)
  #define PWDN_GPIO_NUM     -1
  #define RESET_GPIO_NUM    15
  #define XCLK_GPIO_NUM     27
  #define SIOD_GPIO_NUM     25
  #define SIOC_GPIO_NUM     23

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

#elif defined(CAMERA_MODEL_AI_THINKER)
  #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
#else
  #error "Camera model not selected"
#endif

static const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n";

httpd_handle_t stream_httpd = NULL;

static esp_err_t stream_handler(httpd_req_t *req){
  camera_fb_t * fb = NULL;
  esp_err_t res = ESP_OK;
  size_t _jpg_buf_len = 0;
  uint8_t * _jpg_buf = NULL;
  char * part_buf[64];

  res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);
  if(res != ESP_OK){
    return res;
  }

  while(true){
    fb = esp_camera_fb_get();
    if (!fb) {
      Serial.println("Camera capture failed");
      res = ESP_FAIL;
    } else {
      if(fb->width > 400){
        if(fb->format != PIXFORMAT_JPEG){
          bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);
          esp_camera_fb_return(fb);
          fb = NULL;
          if(!jpeg_converted){
            Serial.println("JPEG compression failed");
            res = ESP_FAIL;
          }
        } else {
          _jpg_buf_len = fb->len;
          _jpg_buf = fb->buf;
        }
      }
    }
    if(res == ESP_OK){
      size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);
      res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);
    }
    if(res == ESP_OK){
      res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
    }
    if(res == ESP_OK){
      res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
    }
    if(fb){
      esp_camera_fb_return(fb);
      fb = NULL;
      _jpg_buf = NULL;
    } else if(_jpg_buf){
      free(_jpg_buf);
      _jpg_buf = NULL;
    }
    if(res != ESP_OK){
      break;
    }
    //Serial.printf("MJPG: %uB\n",(uint32_t)(_jpg_buf_len));
  }
  return res;
}

void startCameraServer(){
  httpd_config_t config = HTTPD_DEFAULT_CONFIG();
  config.server_port = 80;

  httpd_uri_t index_uri = {
    .uri       = "/",
    .method    = HTTP_GET,
    .handler   = stream_handler,
    .user_ctx  = NULL
  };

  //Serial.printf("Starting web server on port: '%d'\n", config.server_port);
  if (httpd_start(&stream_httpd, &config) == ESP_OK) {
    httpd_register_uri_handler(stream_httpd, &index_uri);
  }
}

void setup() {
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector

  Serial.begin(115200);
  Serial.setDebugOutput(false);

  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.pixel_format = PIXFORMAT_JPEG;

  if(psramFound()){
    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }

  // 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;
  }
  // Connect to Wi-Fi network with SSID and password
  Serial.print("Setting AP (Access Point)…");
  // Remove the password parameter, if you want the AP (Access Point) to be open
  WiFi.softAP(ssid, password);

  IPAddress IP = WiFi.softAPIP();
  Serial.print("Camera Stream Ready! Connect to the ESP32 AP and go to: http://");
  Serial.println(IP);

  // Start streaming web server
  startCameraServer();
}

void loop() {
  delay(1);
}

Скачать исходный код

Для лучшего понимания работы вы можете прочитать следующее руководство:

Заключение

Надеемся, что это руководство по устранению неполадок оказалось полезным и вы смогли заставить вашу ESP32-CAM работать с нашими проектами.

Если у вас есть другие проблемы или предложения по их устранению, пожалуйста, напишите комментарий ниже.

Если вам понравился этот проект, вам также могут быть интересны другие проекты с ESP32-CAM:

P.S. Очень сложно понять, что не так с вашим проектом, когда мы не можем воспроизвести ошибку на нашей стороне. Однако, если вы опишете ошибку, другие читатели с такой же проблемой/решением могут помочь, поэтому мы рекомендуем участвовать в обсуждении в разделе комментариев.