kopia lustrzana https://github.com/alanesq/esp32cam-demo
Add files via upload
rodzic
5972960f65
commit
e3849bf9c3
|
@ -10,10 +10,8 @@
|
||||||
* flash led is still available for use on pin 4 and does not flash when accessing sd card
|
* flash led is still available for use on pin 4 and does not flash when accessing sd card
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* - created using the Arduino IDE with ESP32 module installed (https://dl.espressif.com/dl/package_esp32_index.json)
|
* Created using the Arduino IDE with ESP32 module installed, no additional libraries required
|
||||||
* No additional libraries required
|
* ESP32 support for Arduino IDE: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
|
||||||
*
|
|
||||||
* ESP32 support for Arduino IDE: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
|
|
||||||
*
|
*
|
||||||
* Info on the esp32cam board: https://randomnerdtutorials.com/esp32-cam-video-streaming-face-recognition-arduino-ide/
|
* Info on the esp32cam board: https://randomnerdtutorials.com/esp32-cam-video-streaming-face-recognition-arduino-ide/
|
||||||
*
|
*
|
||||||
|
@ -31,7 +29,6 @@
|
||||||
#include "esp_camera.h" // https://github.com/espressif/esp32-camera
|
#include "esp_camera.h" // https://github.com/espressif/esp32-camera
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
#include <WebServer.h>
|
#include <WebServer.h>
|
||||||
#include "fd_forward.h" // required for converting frame to RGB?
|
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------
|
// ---------------------------------------------------------------
|
||||||
|
@ -42,7 +39,7 @@
|
||||||
const char* ssid = "<your wifi network name here>";
|
const char* ssid = "<your wifi network name here>";
|
||||||
const char* password = "<your wifi password here>";
|
const char* password = "<your wifi password here>";
|
||||||
|
|
||||||
const char* stitle = "ESP32Cam-demo"; // title of this sketch
|
const char* stitle = "ESP32Cam-demo"; // title of this sketch
|
||||||
const char* sversion = "13Nov20"; // Sketch version
|
const char* sversion = "13Nov20"; // Sketch version
|
||||||
|
|
||||||
const bool debugInfo = 1; // show additional debug info. on serial port (1=enabled)
|
const bool debugInfo = 1; // show additional debug info. on serial port (1=enabled)
|
||||||
|
@ -50,21 +47,21 @@
|
||||||
// Camera related
|
// Camera related
|
||||||
const bool flashRequired = 1; // If flash to be used when capturing image (1 = yes)
|
const bool flashRequired = 1; // If flash to be used when capturing image (1 = yes)
|
||||||
const framesize_t FRAME_SIZE_IMAGE = FRAMESIZE_VGA; // Image resolution:
|
const framesize_t FRAME_SIZE_IMAGE = FRAMESIZE_VGA; // Image resolution:
|
||||||
// default = "const framesize_t FRAME_SIZE_IMAGE = FRAMESIZE_XGA"
|
// default = "const framesize_t FRAME_SIZE_IMAGE = FRAMESIZE_VGA"
|
||||||
// 160x120 (QQVGA), 128x160 (QQVGA2), 176x144 (QCIF), 240x176 (HQVGA),
|
// 160x120 (QQVGA), 128x160 (QQVGA2), 176x144 (QCIF), 240x176 (HQVGA),
|
||||||
// 320x240 (QVGA), 400x296 (CIF), 640x480 (VGA, default), 800x600 (SVGA),
|
// 320x240 (QVGA), 400x296 (CIF), 640x480 (VGA, default), 800x600 (SVGA),
|
||||||
// 1024x768 (XGA), 1280x1024 (SXGA), 1600x1200 (UXGA)
|
// 1024x768 (XGA), 1280x1024 (SXGA), 1600x1200 (UXGA)
|
||||||
int cameraImageExposure = 0; // Camera exposure (0 - 1200), if gain and exposure set to zero then auto adjust is enabled
|
int cameraImageExposure = 0; // Camera exposure (0 - 1200) If gain and exposure both set to zero then auto adjust is enabled
|
||||||
int cameraImageGain = 0; // Image gain (0 - 30)
|
int cameraImageGain = 0; // Image gain (0 - 30)
|
||||||
|
|
||||||
const int TimeBetweenStatus = 600; // speed of flashing system running ok status light (milliseconds)
|
const int TimeBetweenStatus = 600; // speed of system running ok status light (milliseconds)
|
||||||
|
|
||||||
const int indicatorLED = 33; // onboard status LED pin (33)
|
const int indicatorLED = 33; // onboard status LED pin (33)
|
||||||
|
|
||||||
const int brightLED = 4; // onboard flash LED pin (4)
|
const int brightLED = 4; // onboard flash LED pin (4)
|
||||||
|
|
||||||
const int iopinA = 13; // general io pin
|
const int iopinA = 13; // general io pin 13
|
||||||
const int iopinB = 12; // general io pin (must be low at boot)
|
const int iopinB = 12; // general io pin 12 (must not be high at boot)
|
||||||
|
|
||||||
const int serialSpeed = 115200; // Serial data speed to use
|
const int serialSpeed = 115200; // Serial data speed to use
|
||||||
|
|
||||||
|
@ -88,12 +85,11 @@ WebServer server(80); // serve web pages on port 80
|
||||||
uint32_t lastCamera = millis(); // timer for periodic image capture
|
uint32_t lastCamera = millis(); // timer for periodic image capture
|
||||||
bool sdcardPresent; // flag if an sd card is detected
|
bool sdcardPresent; // flag if an sd card is detected
|
||||||
int imageCounter; // image file name on sd card counter
|
int imageCounter; // image file name on sd card counter
|
||||||
String tReply; // temp text store
|
|
||||||
|
|
||||||
// camera settings (for the standard - OV2640 - CAMERA_MODEL_AI_THINKER)
|
// camera settings (for the standard - OV2640 - CAMERA_MODEL_AI_THINKER)
|
||||||
// see: https://randomnerdtutorials.com/esp32-cam-camera-pin-gpios/
|
// see: https://randomnerdtutorials.com/esp32-cam-camera-pin-gpios/
|
||||||
#define CAMERA_MODEL_AI_THINKER
|
#define CAMERA_MODEL_AI_THINKER
|
||||||
#define PWDN_GPIO_NUM 32 // power to camera on/off
|
#define PWDN_GPIO_NUM 32 // power to camera (on/off)
|
||||||
#define RESET_GPIO_NUM -1 // -1 = not used
|
#define RESET_GPIO_NUM -1 // -1 = not used
|
||||||
#define XCLK_GPIO_NUM 0
|
#define XCLK_GPIO_NUM 0
|
||||||
#define SIOD_GPIO_NUM 26 // i2c sda
|
#define SIOD_GPIO_NUM 26 // i2c sda
|
||||||
|
@ -148,7 +144,7 @@ void setup() {
|
||||||
Serial.print("\nWiFi connected, ");
|
Serial.print("\nWiFi connected, ");
|
||||||
Serial.print("IP address: ");
|
Serial.print("IP address: ");
|
||||||
Serial.println(WiFi.localIP());
|
Serial.println(WiFi.localIP());
|
||||||
server.begin();
|
server.begin(); // start web server
|
||||||
digitalWrite(indicatorLED,HIGH); // small indicator led off
|
digitalWrite(indicatorLED,HIGH); // small indicator led off
|
||||||
|
|
||||||
// define the web pages (i.e. call these procedures when url is requested)
|
// define the web pages (i.e. call these procedures when url is requested)
|
||||||
|
@ -156,7 +152,7 @@ void setup() {
|
||||||
server.on("/stream", handleStream); // stream live video
|
server.on("/stream", handleStream); // stream live video
|
||||||
server.on("/photo", handlePhoto); // save image to sd card
|
server.on("/photo", handlePhoto); // save image to sd card
|
||||||
server.on("/img", handleImg); // show image from sd card
|
server.on("/img", handleImg); // show image from sd card
|
||||||
server.on("/rgb", readRGBImage); // capture image and convert to RGB
|
server.on("/rgb", readRGBImage); // demo converting image to RGB
|
||||||
server.onNotFound(handleNotFound); // invalid url requested
|
server.onNotFound(handleNotFound); // invalid url requested
|
||||||
|
|
||||||
// set up camera
|
// set up camera
|
||||||
|
@ -247,14 +243,14 @@ void loop() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// // Capture an image and save to sd card every 5 seconds
|
// // Capture an image and save to sd card every 5 seconds (i.e. time lapse)
|
||||||
// if ((unsigned long)(millis() - lastCamera) >= 5000) {
|
// if ((unsigned long)(millis() - lastCamera) >= 5000) {
|
||||||
// lastCamera = millis(); // reset timer
|
// lastCamera = millis(); // reset timer
|
||||||
// storeImage(); // save an image to sd card
|
// storeImage(); // save an image to sd card
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
// flash status LED to show sketch is running
|
// flash status LED to show sketch is running ok
|
||||||
if ((unsigned long)(millis() - lastStatus) >= TimeBetweenStatus) {
|
if ((unsigned long)(millis() - lastStatus) >= TimeBetweenStatus) {
|
||||||
lastStatus = millis(); // reset timer
|
lastStatus = millis(); // reset timer
|
||||||
digitalWrite(indicatorLED,!digitalRead(indicatorLED)); // flip indicator led status
|
digitalWrite(indicatorLED,!digitalRead(indicatorLED)); // flip indicator led status
|
||||||
|
@ -465,6 +461,7 @@ bool storeImage() {
|
||||||
// ----------------------------------------------------------------
|
// ----------------------------------------------------------------
|
||||||
// -root web page requested i.e. http://x.x.x.x/
|
// -root web page requested i.e. http://x.x.x.x/
|
||||||
// ----------------------------------------------------------------
|
// ----------------------------------------------------------------
|
||||||
|
// Control buttons, links etc.
|
||||||
|
|
||||||
void handleRoot() {
|
void handleRoot() {
|
||||||
|
|
||||||
|
@ -632,7 +629,7 @@ void handlePhoto() {
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------
|
// ----------------------------------------------------------------
|
||||||
// -show image from sd card i.e. http://x.x.x.x/img?img=x
|
// -show images stored on sd card i.e. http://x.x.x.x/img?img=x
|
||||||
// ----------------------------------------------------------------
|
// ----------------------------------------------------------------
|
||||||
// default image = most recent
|
// default image = most recent
|
||||||
// returns 1 if image displayed ok
|
// returns 1 if image displayed ok
|
||||||
|
@ -683,9 +680,12 @@ bool handleImg() {
|
||||||
// ----------------------------------------------------------------
|
// ----------------------------------------------------------------
|
||||||
// -invalid web page requested
|
// -invalid web page requested
|
||||||
// ----------------------------------------------------------------
|
// ----------------------------------------------------------------
|
||||||
|
// Note: shows a different way to send the HTML reply
|
||||||
|
|
||||||
void handleNotFound() {
|
void handleNotFound() {
|
||||||
|
|
||||||
|
String tReply;
|
||||||
|
|
||||||
// log page request
|
// log page request
|
||||||
if (debugInfo) {
|
if (debugInfo) {
|
||||||
Serial.print("Invalid page requested");
|
Serial.print("Invalid page requested");
|
||||||
|
@ -714,7 +714,7 @@ void handleNotFound() {
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------
|
// ----------------------------------------------------------------
|
||||||
// Access image data as RGB - i.e. http://x.x.x.x/rgb
|
// -access image data as RGB - i.e. http://x.x.x.x/rgb
|
||||||
// ----------------------------------------------------------------
|
// ----------------------------------------------------------------
|
||||||
// Info. from: https://github.com/Makerfabs/Project_Touch-Screen-Camera/blob/master/Camera_v2/Camera_v2.ino
|
// Info. from: https://github.com/Makerfabs/Project_Touch-Screen-Camera/blob/master/Camera_v2/Camera_v2.ino
|
||||||
// note: Will fail on the highest resolution as it requires more than 4mb to store the data (in psram)
|
// note: Will fail on the highest resolution as it requires more than 4mb to store the data (in psram)
|
||||||
|
@ -732,8 +732,8 @@ void readRGBImage() {
|
||||||
// html header
|
// html header
|
||||||
client.write("<!DOCTYPE html> <html lang='en'> <head> <title>photo</title> </head> <body>\n"); // basic html header
|
client.write("<!DOCTYPE html> <html lang='en'> <head> <title>photo</title> </head> <body>\n"); // basic html header
|
||||||
|
|
||||||
MessageRGB(client,"LIVE IMAGE AS RGB DATA"); // reply to send to web client and serial port
|
MessageRGB(client,"LIVE IMAGE AS RGB DATA"); // 'MessageRGB' sends the String to both serial port and web page
|
||||||
MessageRGB(client,"Starting RGB procedure at millis=" + String(millis()));
|
MessageRGB(client,"Starting RGB procedure at millis=" + String(millis())); // so you can see how long it takes to execute this code
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -765,9 +765,12 @@ void readRGBImage() {
|
||||||
|
|
||||||
// ****** examples of reading the resulting RGB data *****
|
// ****** examples of reading the resulting RGB data *****
|
||||||
|
|
||||||
uint32_t resultsToShow = 50; // how much data to display
|
// Note: You can send the entire image with the command: client.write(rgb, ARRAY_LENGTH);
|
||||||
|
// If this is all that is sent then it will download to the client as a raw RGB file which you can then view using this
|
||||||
|
// Processing sketch: https://github.com/alanesq/esp32cam-demo/blob/master/Misc/displayRGB.pde
|
||||||
|
|
||||||
// display some of the resulting data
|
// display some of the resulting data
|
||||||
|
uint32_t resultsToShow = 50; // how much data to display
|
||||||
MessageRGB(client,"R , G , B");
|
MessageRGB(client,"R , G , B");
|
||||||
for (uint32_t i = 0; i < resultsToShow-2; i+=3) {
|
for (uint32_t i = 0; i < resultsToShow-2; i+=3) {
|
||||||
MessageRGB(client,String(rgb[i+2]) + "," + String(rgb[i+1]) + "," + String(rgb[i+0])); // Red , Green , Blue
|
MessageRGB(client,String(rgb[i+2]) + "," + String(rgb[i+1]) + "," + String(rgb[i+0])); // Red , Green , Blue
|
||||||
|
@ -814,7 +817,7 @@ void readRGBImage() {
|
||||||
// send line of text to both serial port and web page
|
// send line of text to both serial port and web page
|
||||||
void MessageRGB(WiFiClient &client, String theText) {
|
void MessageRGB(WiFiClient &client, String theText) {
|
||||||
client.print(theText + "<br>\n");
|
client.print(theText + "<br>\n");
|
||||||
if (debugInfo || theText.indexOf('error') > 0) Serial.println (theText);
|
if (debugInfo || theText.indexOf('error') > 0) Serial.println(theText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue