Is it possibly to use the ESP32 CAM and Blynk Edgent together?

Your cam setup is already using GPIO 32, but you’ve told Edgent to use that same pin as the Blynk reset button.
As I’ve said numerous times already, you can’t do that. You need to change the Blynk Edgent reset button in Settings.h to something else.


Okay in setting.h I tried changing it and test it with:

#define BOARD_BUTTON_PIN 2 // Pin where user button is attached
#define BOARD_BUTTON_PIN 10 // Pin where user button is attached
#define BOARD_BUTTON_PIN 15 // Pin where user button is attached
#define BOARD_BUTTON_PIN 35 // Pin where user button is attached

The only pin there didn’t cause a bootloop was PIN 2
It would connect to Blynk but
E (471) gpio: gpio_install_isr_service(450): GPIO isr service already installed
would still be there.

Are you leaving this setting unchanged…

Are you physically connecting a switch between the pin in question and VCC ?

It’s difficult to help if you don’t provide useable info on what you’re doing, and what serial messages you see when you experience these “boot loops”.


No I don’t connect a switch, also I tried both ACTIVE_LOW true and false.

What the Serial message say is the same as the first one I posted in this thread.
Anyway I found a work around and now I don’t have the GPIO Error any more.

    ___  __          __
   / _ )/ /_ _____  / /__
  / _  / / // / _ \/  '_/
 /____/_/\_, /_//_/_/\_\
        /___/ v1.3.2 on ESP32


 Device:    Blynk Webcam-P3RA
 Firmware:  0.1.0 (build Jun 12 2024 08:32:29)
 Token:     kFJx - •••• - •••• - ••••
 Platform:  ESP32 @ 240MHz
 Chip rev:  3
 SDK:       v4.4.7-dirty
 Flash:     4096K
 Free mem:  224924

[718] Connecting to WiFi: ****
[1726] Using Dynamic IP:
[1737] Connecting to
[3295] Certificate OK
[3357] Redirecting to
[3368] Connecting to
[4898] Certificate OK
[4950] Ready (ping: 51ms).

I went to ResetButton.h and disabled the command saying:

attachInterrupt(BOARD_BUTTON_PIN, button_change, CHANGE);

So now that I don’t have that problem anymore we can move on to actually get the cam server working.

Because typing into the web browser just give me:
ERR_CONNECTION_REFUSED (There is no connection to the web site)

You’ll need to reinstate the webserver part of your original sketch, but take care not to add back any code that creates a WiFi connection, as Edgent handles this.
However, you won’t be able to start your webserver until the point in the sketch where Edgent has done this,Manx created teg WiFi object for you to use as the transport layer for your webserver.



Okay here is the current sketch.

I have uncommented all WiFi functions in the setup.

There is also mentioned something about WiFiClient in the void handle_jpg which I don’t know if I should do anything about.

#define BLYNK_TEMPLATE_ID           "TMPL5s-dGSebs"
#define BLYNK_TEMPLATE_NAME         "Webcam"

#define BLYNK_FIRMWARE_VERSION        "0.1.0"

#define BLYNK_PRINT Serial
//#define BLYNK_DEBUG

#define APP_DEBUG

// Uncomment your board, or configure a custom board in Settings.h
//#define USE_ESP32_DEV_MODULE
//#define USE_ESP32C3_DEV_MODULE
//#define USE_ESP32S2_DEV_KIT
//#define USE_TTGO_T7
//#define USE_TTGO_T_OI

#include "OV2640.h"
//#include <WiFi.h>
//#include <WebServer.h>
//#include <WiFiClient.h>
//#include <BlynkSimpleEsp32.h>
#include "BlynkEdgent.h"

// Uncomment your board, or configure a custom board in camera_pins.h

#include "camera_pins.h"

OV2640 cam;

const char HEADER[] = "HTTP/1.1 200 OK\r\n" \
                      "Access-Control-Allow-Origin: *\r\n" \
                      "Content-Type: multipart/x-mixed-replace; boundary=123456789000000000000987654321\r\n";
const char BOUNDARY[] = "\r\n--123456789000000000000987654321\r\n";
const char CTNTTYPE[] = "Content-Type: image/jpeg\r\nContent-Length: ";
const int hdrLen = strlen(HEADER);
const int bdrLen = strlen(BOUNDARY);
const int cntLen = strlen(CTNTTYPE);

void handle_jpg_stream(void)
  char buf[32];
  int s;

  WiFiClient client = server.client();

  client.write(HEADER, hdrLen);
  client.write(BOUNDARY, bdrLen);

  while (true)
    if (!client.connected()) break;;
    s = cam.getSize();
    client.write(CTNTTYPE, cntLen);
    sprintf( buf, "%d\r\n\r\n", s );
    client.write(buf, strlen(buf));
    client.write((char *)cam.getfb(), s);
    client.write(BOUNDARY, bdrLen);

const char JHEADER[] = "HTTP/1.1 200 OK\r\n" \
                       "Content-disposition: inline; filename=capture.jpg\r\n" \
                       "Content-type: image/jpeg\r\n\r\n";
const int jhdLen = strlen(JHEADER);

void handle_jpg(void)
  WiFiClient client = server.client();;
  if (!client.connected()) return;

  client.write(JHEADER, jhdLen);
  client.write((char *)cam.getfb(), cam.getSize());

void handleNotFound()
  String message = "Server is running!\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  server.send(200, "text / plain", message);

void setup()

    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;

  // Frame parameters
  //  config.frame_size = FRAMESIZE_UXGA;
  config.frame_size = FRAMESIZE_QVGA;
  config.jpeg_quality = 12;
  config.fb_count = 2;

  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);

/*  IPAddress ip;

 // WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  ip = WiFi.localIP();
  Serial.println(F("WiFi connected"));
    // Configure Blynk
 // Blynk.config(auth);
  Serial.println("Connecting to Blynk");
  while (Blynk.connect() == false) {
  Serial.println("\nConnected to Blynk");

  Serial.print("Stream Link: http://");
  server.on("/mjpeg/1", HTTP_GET, handle_jpg_stream);
  server.on("/jpg", HTTP_GET, handle_jpg);

void loop() {