ESP32-CAM live streaming and LED-control

PyPat2021
Posts: 4
Joined: Sun Jun 12, 2022 12:27 pm

ESP32-CAM live streaming and LED-control

Postby PyPat2021 » Sun Mar 12, 2023 3:11 pm

Hello there,

I could really need some help with one of my projects. I am somewhat experienced with Python but I don't really have experience with C(++).
I am trying to have my ESP32-Cam live streaming via soft access point whilst switching flash LED on and off (later I would like to control this LED via HTTP-request). First of all: The live streaming part with soft access works fine for me. But I don't know at which line of the code I should write the LED control. I would like to switch flash-LED (GPIO4) on and off every second.

My live streaming code via soft AP is:

Code: Untitled.c Select all

#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"; //Name des Arduino-WiFi's
const char* password = "123456789"; //Passwort für das Arduino-WiFi
int max_connection = 1; //maximale Anzahl gleichzeitiger Clients im Arduino-Netzwerk

#define PART_BOUNDARY "123456789000000000000987654321"

#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


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_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_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;
}
// Wi-Fi connection
WiFi.softAP(ssid, password, max_connection);

IPAddress IP(192, 168, 4, 2); //Eine IP-Adresse für den Arduino festlegen
IPAddress NMask(255, 255, 255, 0);
WiFi.softAPConfig(IP, IP, NMask); //Configure ESP32 to apply the defined IP address from above
IPAddress local_IP = WiFi.softAPIP();

Serial.print("Camera Stream Ready! Go to: http://");
Serial.print(local_IP);

// Start streaming web server
startCameraServer();
}

void loop() {
delay(1);
}
Can anybody please help me where to put further code without crashing the working video-stream part?
Thank you so much in advance!

Greetings from Germany.
Last edited by PyPat2021 on Mon Mar 13, 2023 9:05 pm, edited 1 time in total.

noweare
Posts: 96
Joined: Tue Jul 02, 2019 11:35 am

Re: ESP32-CAM live streaming and LED-control

Postby noweare » Mon Mar 13, 2023 1:55 pm

I think most of the example code for the esp-camera includes the flash led with a #define to include the code or not.

Here is the link to the example code. You will have to go through the code and copy paste into your code anything
that has to do with the flash led stuff.

https://github.com/espressif/arduino-es ... _httpd.cpp

Here is a snippit:
// Enable LED FLASH setting
#define CONFIG_LED_ILLUMINATOR_ENABLED 1

// LED FLASH setup
#if CONFIG_LED_ILLUMINATOR_ENABLED

#define LED_LEDC_CHANNEL 2 //Using different ledc channel/timer than camera
#define CONFIG_LED_MAX_INTENSITY 255

int led_duty = 0;
bool isStreaming = false;

#endif

Chirag G Shetty
Posts: 1
Joined: Sun Feb 23, 2025 10:40 am

Re: ESP32-CAM live streaming and LED-control

Postby Chirag G Shetty » Sun Feb 23, 2025 10:45 am

1. This statement in the very beginning (after #include and before the lines of code where you enter your wifi credentials) -
#define LED_FLASH_PIN 4
2. This statement in the last line of setup function -
pinMode(LED_FLASH_PIN, OUTPUT);
3. This statement right after the statement or in loop function -
digitalWrite(LED_FLASH_PIN, HIGH);
(change last argument of the above function call to LOW, to turn of the LED)

This has worked for me.

Who is online

Users browsing this forum: Qwantbot and 3 guests