ESP32cam V3
#include <WiFi.h>
#include <WebServer.h>
#include "esp_camera.h"
#include "soc/rtc.h"
#include <esp_mac.h>
const char* WiFi_SSID = "17A-2";
const char* WiFi_Password = "00000000";
WebServer server(80);
// Camera PIN OV2640
#define CAM_PWDN 32
#define CAM_RESET -1
#define CAM_XCLK 0
#define CAM_SIOD 26
#define CAM_SIOC 27
#define CAM_D0 5
#define CAM_D1 18
#define CAM_D2 19
#define CAM_D3 21
#define CAM_D4 36
#define CAM_D5 39
#define CAM_D6 34
#define CAM_D7 35
#define CAM_VSYNC 25
#define CAM_HREF 23
#define CAM_PCLK 22
bool initCamera() // Camera config
{
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = CAM_D0;
config.pin_d1 = CAM_D1;
config.pin_d2 = CAM_D2;
config.pin_d3 = CAM_D3;
config.pin_d4 = CAM_D4;
config.pin_d5 = CAM_D5;
config.pin_d6 = CAM_D6;
config.pin_d7 = CAM_D7;
config.pin_xclk = CAM_XCLK;
config.pin_pclk = CAM_PCLK;
config.pin_vsync = CAM_VSYNC;
config.pin_href = CAM_HREF;
config.pin_sscb_sda = CAM_SIOD;
config.pin_sscb_scl = CAM_SIOC;
config.pin_pwdn = CAM_PWDN;
config.pin_reset = CAM_RESET;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
if (psramFound())
{
config.frame_size = FRAMESIZE_HD;
config.jpeg_quality = 15;
config.fb_count = 2;
config.fb_location = CAMERA_FB_IN_PSRAM;
}
else
{
config.frame_size = FRAMESIZE_QVGA;
config.jpeg_quality = 12;
config.fb_count = 1;
config.fb_location = CAMERA_FB_IN_DRAM;
}
config.grab_mode = CAMERA_GRAB_LATEST;
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK)
{
Serial.printf("Camera init failed: 0x%x\n", err);
return false;
}
return true;
}
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html style="height: 100%;">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ESP32cam</title>
<style>
body
{
margin: 0;
height: 100%;
background-color: rgb(14, 14, 14);
display: flex;
justify-content: center;
align-items: center;
}
img
{
max-width: 100%;
max-height: 100%;
width: auto;
height: auto;
object-fit: contain;
display: block;
user-select: none;
background-color: hsl(0, 0%, 10%);
}
</style>
</head>
<body>
<img id="img" src="/capture">
<script>
setInterval(() => {
document.getElementById('img').src = '/capture?' + Date.now();
}, 300);
</script>
</body>
</html>
)rawliteral";
void handleRoot() // Index
{
server.send_P(200, "text/html", index_html);
}
void handleCapture() // Capture
{
camera_fb_t *fb = esp_camera_fb_get();
if (!fb)
{
server.send(500, "text/plain", "Camera error");
return;
}
server.sendHeader("Cache-Control", "no-store");
server.sendHeader("Pragma", "no-cache");
server.sendHeader("Expires", "-1");
server.send_P(200, "image/jpeg", (const char*)fb->buf, fb->len);
esp_camera_fb_return(fb);
}
void handleStream() // Stream
{
WiFiClient client = server.client();
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: multipart/x-mixed-replace; boundary=frame");
client.println();
while (client.connected())
{
camera_fb_t *fb = esp_camera_fb_get();
if (!fb)
break;
client.println("--frame");
client.println("Content-Type: image/jpeg");
client.println("Content-Length: " + String(fb->len));
client.println();
client.write(fb->buf, fb->len);
client.println();
esp_camera_fb_return(fb);
delay(50);
}
}
void setup()
{
Serial.begin(115200);
delay(1000);
printESP32Info();
if (!initCamera())
{
Serial.println("Camera init failed");
while (true) delay(1000);
}
Serial.println("Camera OK");
WiFi.begin(WiFi_SSID, WiFi_Password);
Serial.println("WiFi_SSID : " + String(WiFi_SSID) );
Serial.println("WiFi_Password : " + String(WiFi_Password) );
Serial.print("Connecting WiFi ");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("IP : ");
Serial.print(WiFi.localIP());
Serial.print(" /capture");
Serial.println(" /stream");
server.on("/", handleRoot);
server.on("/capture", handleCapture);
server.on("/stream", handleStream);
server.begin();
}
void loop()
{
server.handleClient();
}
void printESP32Info()
{
Serial.print("Chip model: ");
Serial.println(ESP.getChipModel());
Serial.print("Revision: ");
Serial.println(ESP.getChipRevision());
Serial.print("Cores: ");
Serial.println(ESP.getChipCores());
Serial.print("CPU freq: ");
Serial.print(ESP.getCpuFreqMHz());
Serial.println(" MHz");
Serial.print("Crystal frequency: ");
Serial.print(rtc_clk_xtal_freq_get());
Serial.println(" MHz");
Serial.print("Flash: ");
Serial.print(ESP.getFlashChipSize() / 1024 / 1024);
Serial.println(" MB");
Serial.print("Heap free: ");
Serial.print(ESP.getFreeHeap());
Serial.println(" bytes");
Serial.print("PSRAM: ");
Serial.print(ESP.getPsramSize());
Serial.println(" bytes");
Serial.print("Free PSRAM: ");
Serial.print(ESP.getFreePsram());
Serial.println(" bytes");
uint8_t mac[6];
esp_read_mac(mac, ESP_MAC_WIFI_STA);
Serial.printf(
"MAC: %02X:%02X:%02X:%02X:%02X:%02X\n",
mac[0], mac[1], mac[2],
mac[3], mac[4], mac[5]
);
}