178 lines
3.6 KiB
C++
178 lines
3.6 KiB
C++
#define CAMERA_MODEL_AI_THINKER
|
|
#include <WebServer.h>
|
|
#include <WiFi.h>
|
|
#include <esp32cam.h>
|
|
#include "uTimerLib.h"
|
|
|
|
const char* WIFI_SSID = "CAMAP";
|
|
const char* WIFI_PASS = "camera4okutt*8";
|
|
const uint8_t port = 12;
|
|
const uint16_t pulseTimeout = 4;
|
|
|
|
WebServer server(80);
|
|
|
|
static auto loRes = esp32cam::Resolution::find(320, 240);
|
|
static auto hiRes = esp32cam::Resolution::find(800, 600);
|
|
|
|
void
|
|
handleBmp()
|
|
{
|
|
if (!esp32cam::Camera.changeResolution(loRes)) {
|
|
Serial.println("SET-LO-RES FAIL");
|
|
}
|
|
|
|
auto frame = esp32cam::capture();
|
|
if (frame == nullptr) {
|
|
Serial.println("CAPTURE FAIL");
|
|
server.send(503, "", "");
|
|
return;
|
|
}
|
|
Serial.printf("CAPTURE OK %dx%d %db\n", frame->getWidth(), frame->getHeight(),
|
|
static_cast<int>(frame->size()));
|
|
|
|
if (!frame->toBmp()) {
|
|
Serial.println("CONVERT FAIL");
|
|
server.send(503, "", "");
|
|
return;
|
|
}
|
|
Serial.printf("CONVERT OK %dx%d %db\n", frame->getWidth(), frame->getHeight(),
|
|
static_cast<int>(frame->size()));
|
|
|
|
server.setContentLength(frame->size());
|
|
server.send(200, "image/bmp");
|
|
WiFiClient client = server.client();
|
|
frame->writeTo(client);
|
|
}
|
|
|
|
void
|
|
serveJpg()
|
|
{
|
|
auto frame = esp32cam::capture();
|
|
if (frame == nullptr) {
|
|
Serial.println("CAPTURE FAIL");
|
|
server.send(503, "", "");
|
|
return;
|
|
}
|
|
Serial.printf("CAPTURE OK %dx%d %db\n", frame->getWidth(), frame->getHeight(),
|
|
static_cast<int>(frame->size()));
|
|
|
|
server.setContentLength(frame->size());
|
|
server.send(200, "image/jpeg");
|
|
WiFiClient client = server.client();
|
|
frame->writeTo(client);
|
|
}
|
|
|
|
void
|
|
handleJpgLo()
|
|
{
|
|
if (!esp32cam::Camera.changeResolution(loRes)) {
|
|
Serial.println("SET-LO-RES FAIL");
|
|
}
|
|
serveJpg();
|
|
}
|
|
|
|
void
|
|
handleJpgHi()
|
|
{
|
|
if (!esp32cam::Camera.changeResolution(hiRes)) {
|
|
Serial.println("SET-HI-RES FAIL");
|
|
}
|
|
serveJpg();
|
|
}
|
|
|
|
void
|
|
handleJpg()
|
|
{
|
|
server.sendHeader("Location", "/cam-hi.jpg");
|
|
server.send(302, "", "");
|
|
}
|
|
|
|
void
|
|
handleMjpeg()
|
|
{
|
|
if (!esp32cam::Camera.changeResolution(hiRes)) {
|
|
Serial.println("SET-HI-RES FAIL");
|
|
}
|
|
|
|
Serial.println("STREAM BEGIN");
|
|
WiFiClient client = server.client();
|
|
auto startTime = millis();
|
|
int res = esp32cam::Camera.streamMjpeg(client);
|
|
if (res <= 0) {
|
|
Serial.printf("STREAM ERROR %d\n", res);
|
|
return;
|
|
}
|
|
auto duration = millis() - startTime;
|
|
Serial.printf("STREAM END %dfrm %0.2ffps\n", res, 1000.0 * res / duration);
|
|
}
|
|
|
|
void handleOne()
|
|
{
|
|
digitalWrite(port,1);
|
|
}
|
|
|
|
void handleZero()
|
|
{
|
|
digitalWrite(port,0);
|
|
}
|
|
|
|
void handlePulse()
|
|
{
|
|
handleOne();
|
|
|
|
TimerLib.setTimeout_s(handleZero,pulseTimeout);
|
|
}
|
|
|
|
void
|
|
setup()
|
|
{
|
|
Serial.begin(115200);
|
|
Serial.println();
|
|
|
|
{
|
|
using namespace esp32cam;
|
|
Config cfg;
|
|
cfg.setPins(pins::AiThinker);
|
|
cfg.setResolution(hiRes);
|
|
cfg.setBufferCount(2);
|
|
cfg.setJpeg(80);
|
|
|
|
bool ok = Camera.begin(cfg);
|
|
Serial.println(ok ? "CAMERA OK" : "CAMERA FAIL");
|
|
|
|
pinMode(port, OUTPUT);
|
|
Serial.println("SET PORT OUTPUT\n");
|
|
|
|
}
|
|
|
|
WiFi.persistent(false);
|
|
WiFi.mode(WIFI_STA);
|
|
WiFi.begin(WIFI_SSID, WIFI_PASS);
|
|
while (WiFi.status() != WL_CONNECTED) {
|
|
delay(500);
|
|
}
|
|
|
|
Serial.print("http://");
|
|
Serial.println(WiFi.localIP());
|
|
Serial.println(" /cam.bmp");
|
|
Serial.println(" /cam-lo.jpg");
|
|
Serial.println(" /cam-hi.jpg");
|
|
Serial.println(" /cam.mjpeg");
|
|
|
|
server.on("/cam.bmp", handleBmp);
|
|
server.on("/cam-lo.jpg", handleJpgLo);
|
|
server.on("/cam-hi.jpg", handleJpgHi);
|
|
server.on("/cam.jpg", handleJpg);
|
|
server.on("/cam.mjpeg", handleMjpeg);
|
|
server.on("/send.zero",handleZero);
|
|
server.on("/send.one",handleOne);
|
|
server.on("/send.pulse",handlePulse);
|
|
|
|
server.begin();
|
|
}
|
|
|
|
void
|
|
loop()
|
|
{
|
|
server.handleClient();
|
|
} |