Free Shipping over ₹1199

ESP32-S3 WROOM N16R8 Camera Web Server (AP Mode)

Introduction

The ESP32-S3 WROOM N16R8 is a powerful board with built-in support for high-quality camera streaming.
It can work as a Wi-Fi camera server, allowing you to view live video directly in your browser.
Normally, when you connect the ESP32 to your Wi-Fi router, distance or weak signal can make the video feed laggy or less smooth.
In AP Mode, the ESP32 itself creates a Wi-Fi hotspot, so your phone or laptop connects directly to the board.
This makes the video stream more stable, smoother, and independent of your router’s range.

What You’ll Need

  • ESP32-S3 WROOM N16R8 Board with OV2640 or any camera support
  • USB-C cable

How AP Mode Works

In Access Point (AP) mode, the ESP32-S3 creates its own Wi-Fi network. Devices connect directly to it, and you can view the live camera feed through a browser without internet access.

  • Ideal for offline surveillance, portable camera projects, or field monitoring.

Connect

Connect ESP32-S3 to the computer using the USB cable.

Install the ESP32 board package version 3.3.0, as older versions may cause errors and might not work properly.

Select Your Board:

  • Tools > Board > ESP32S3 Dev Module

Now, connect the ESP32S3 Dev Module to your computer using a USB cable. Then, go to Tools > Port and select the COM port that the ESP32S3 Dev Module is connected to.

Go to Tools menu and apply the following settings:

Open: File > Examples > ESP32 > Camera > CameraWebServer

Next you will see a similar example as shown in the image below. The red mark highlights CameraWebServer. Open this example, and in the code, paste the changes shown below.”

Code



#include "esp_camera.h"
#include <WiFi.h>

// ===================
// 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
// ** 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"

// ===========================
// Enter your WiFi credentials
// ===========================
const char* ssid = "ESP32-CAM-S3";
const char* password = "12345678";


void startCameraServer();

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.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(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;
}

// 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
s->set_vflip(s, 1); // flip it back
s->set_brightness(s, 1); // up the brightness just a bit
s->set_saturation(s, 0); // lower the saturation

// WiFi.begin(ssid, password);
// WiFi.setSleep(false);

// while (WiFi.status() != WL_CONNECTED) {
//     delay(500);
//     Serial.print(".");
// }
// while (WiFi.STA.hasIP() != true) {
//     Serial.print(".");
//     delay(500);
// }
// Serial.println("");
// Serial.println("WiFi connected");

// startCameraServer();

// Serial.print("Camera Ready! Use 'http://");
// Serial.print(WiFi.localIP());
// Serial.println("' to connect");


  WiFi.softAP(ssid, password);

  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);

  startCameraServer();

  Serial.print("Camera Ready! Use 'http://");
  Serial.print(IP);
  Serial.println("' to connect");


}

void loop() {
// Do nothing. Everything is done in another task by the web server
delay(10000);
}

After uploading the code, open the Wi-Fi settings on your phone or laptop. Connect to the Wi-Fi network ESP32-CAM-S3 (as shown in the image below) using the password 12345678. Once connected, open your browser and type the IP address 192.168.4.1 (you can also copy this IP from the Serial Monitor). Press Enter, and you will see the live camera stream.

    Leave a Reply

    Your email address will not be published. Required fields are marked *


    Need Help?