ESP32 WebSocket Camera.
ESP32 WebSocket Camera.
h"
#include <WebSockets.h>
#include <WebSocketsClient.h>
#include <WebSocketsServer.h>
#include <ArduinoJson.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <WiFiClient.h>
#include "canvas_htm.h"
String header;
// Current time
unsigned long currentTime = millis();
// Previous time
unsigned long previousTime = 0;
// Define timeout time in milliseconds (example: 2000ms = 2s)
const long timeoutTime = 2000;
OV7670 *camera;
WiFiMulti wifiMulti;
WiFiServer server(80);
void forward() {
digitalWrite(19,HIGH);
digitalWrite(18,LOW);
digitalWrite(23,HIGH);
digitalWrite(2,LOW);
}
void backward() {
digitalWrite(19,LOW);
digitalWrite(18,HIGH);
digitalWrite(23,LOW);
digitalWrite(2,HIGH);
}
void right() {
digitalWrite(19,HIGH);
digitalWrite(18,LOW);
digitalWrite(23,LOW);
digitalWrite(2,LOW);
}
void left() {
digitalWrite(19,HIGH);
digitalWrite(18,LOW);
digitalWrite(23,HIGH);
digitalWrite(2,LOW);
}
void startWebServer()
{
server.begin();
Serial.println("Http web server started.");
}
void serve() {
WiFiClient client = server.available();
if (client)
{
//Serial.println("New Client.");
String currentLine = "";
while (client.connected())
{
if (client.available())
{
char c = client.read();
//Serial.write(c);
if (c == '\n')
{
if (currentLine.length() == 0)
{
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
client.print(canvas_htm);
client.println();
break;
}
else
{
currentLine = "";
}
}
else if (c != '\r')
{
currentLine += c;
}
}
}
// close the connection:
client.stop();
}
}
int blk_count = 0;
switch (type) {
case WStype_DISCONNECTED: // if the websocket is disconnected
Serial.printf("[%u] Disconnected!\n", num);
break;
case WStype_CONNECTED: { // if a new websocket connection is
established
IPAddress ip = webSocket.remoteIP(num);
Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0],
ip[1], ip[2], ip[3], payload);
webSocket.sendBIN(0, &ip_flag, 1);
localip = WiFi.localIP();
sprintf(ipaddr, "%d.%d.%d.%d", localip[0], localip[1], localip[2],
localip[3]);
webSocket.sendTXT(0, (const char *)ipaddr);
}
break;
case WStype_TEXT:
// if new text data is received
}
} else if (payloadlength == sizeof(canvas_QQ_VGA)-1) {
if (memcmp(canvas_QQ_VGA, payload, payloadlength) == 0) {
Serial.printf("canvas_QQ_VGA");
webSocket.sendBIN(0, &end_flag, 1);
camera = new OV7670(OV7670::Mode::QQVGA_RGB565, SIOD, SIOC, VSYNC,
HREF, XCLK, PCLK, D0, D1, D2, D3, D4, D5, D6, D7);
}
} else if (payloadlength == sizeof(canvas_Q_VGA)-1) {
if (memcmp(canvas_Q_VGA, payload, payloadlength) == 0) {
Serial.printf("canvas_Q_VGA");
webSocket.sendBIN(0, &end_flag, 1);
camera = new OV7670(OV7670::Mode::QVGA_RGB565, SIOD, SIOC, VSYNC,
HREF, XCLK, PCLK, D0, D1, D2, D3, D4, D5, D6, D7);
}
} else if (payloadlength == sizeof(canvas_VGA)-1) {
if (memcmp(canvas_VGA, payload, payloadlength) == 0) {
Serial.printf("canvas_VGA");
webSocket.sendBIN(0, &end_flag, 1);
camera = new OV7670(OV7670::Mode::VGA_RGB565, SIOD, SIOC, VSYNC,
HREF, XCLK, PCLK, D0, D1, D2, D3, D4, D5, D6, D7);
}
if (i == 0) {
camera->startBlock = 1;
camera->endBlock = I2SCamera::blockSlice;
webSocket.sendBIN(0, &start_flag, 1);
}
if (i == blk_count-1) {
webSocket.sendBIN(0, &end_flag, 1);
}
camera->oneFrame();
webSocket.sendBIN(0, camera->frame, camera->xres * I2SCamera::blockSlice
* 2);
camera->startBlock += I2SCamera::blockSlice;
camera->endBlock += I2SCamera::blockSlice;
}
break;
case WStype_ERROR: // if new text data is received
Serial.printf("Error \n");
default:
Serial.printf("WStype %x not handled \n", type);
}
}
void initWifiStation() {
WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid, password);
Serial.print("\nConnecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println(String("\nConnected to the WiFi network (") + ssid + ")" );
void initWifiMulti()
{
wifiMulti.addAP(ssid_AP_1, pwd_AP_1);
//wifiMulti.addAP(ssid_AP_2, pwd_AP_2);
//wifiMulti.addAP(ssid_AP_3, pwd_AP_3);
Serial.println("Connecting Wifi...");
while(wifiMulti.run() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.print("\n");
Serial.print("WiFi connected : ");
Serial.print("IP address : ");
Serial.println(WiFi.localIP());
}
void initWifiAP() {
WiFi.mode(WIFI_AP_STA);
WiFi.softAP(ap_ssid, ap_password);
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP);
}
void setup() {
pinMode(19, OUTPUT);
pinMode(18, OUTPUT);
pinMode(23, OUTPUT);
pinMode(2, OUTPUT);
Serial.begin(115200);
initWifiMulti();
initWifiAP();
startWebSocket();
startWebServer();
void loop()
{
webSocket.loop();
serve();
if (info_available == 1) {
info_available = 0;
webSocket.sendTXT(websock_num, info_buffer, strlen(info_buffer));
}