OPEN_ROBO_HUB ← Back to Dashboard
Project Blueprint 04 // Expert IoT

ESP32-CAM Live Wireless Surveillance Server

Transforms an AI-Thinker ESP32-CAM module into a functional standalone IP video camera streaming localized MJPEG network packets over Wi-Fi.

📋 FTDI Programmer Serial Flash Topology

ESP32-CAM Node Pin Data Vector FTDI USB Adapter Pin
VCC (5V) <====> VCC (5V Out)
GND <====> GND
U0R (RX) <====> TXD
U0T (TX) <====> RXD
GPIO 0 (Flash Mode) --- Short Loop --- GND (Disconnect after flash)

💻 Standalone Stream Firmware

#include "esp_camera.h"
#include 
#include "esp_http_server.h"

const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";

#define PART_BOUNDARY "123456789000000000000987654321"
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: %getLength%\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) { 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; }
    if(res != ESP_OK) break;
  }
  return res;
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) { delay(500); }
  
  // Start server on Port 80
  httpd_config_t config = HTTPD_DEFAULT_CONFIG();
  config.server_port = 80;
  httpd_uri_t main_uri = { .uri="/", .method=HTTP_GET, .handler=stream_handler, .user_ctx=NULL };
  if (httpd_start(&stream_httpd, &config) == ESP_OK) { httpd_register_uri_handler(stream_httpd, &main_uri); }
}

void loop() { delay(1); }