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]
  );
}

Популярные сообщения из этого блога

C# Console Application FolderBrowserDialog and OpenFileDialog TopMost

C# CRC32

C# Windows Form - CefSharpBrowser - Authentication Required