kopia lustrzana https://github.com/alanesq/esp32cam-demo
rodzic
b4b99a90fe
commit
b8549d62cb
|
@ -101,7 +101,7 @@
|
||||||
// -SETTINGS
|
// -SETTINGS
|
||||||
// ---------------------------------------------------------------
|
// ---------------------------------------------------------------
|
||||||
|
|
||||||
char* stitle = "ESP32CamDemo"; // title of this sketch
|
char* stitle = "BackCam"; // title of this sketch
|
||||||
char* sversion = "01Apr25"; // Sketch version
|
char* sversion = "01Apr25"; // Sketch version
|
||||||
|
|
||||||
framesize_t FRAME_SIZE_IMAGE = FRAMESIZE_SVGA; // default camera resolution
|
framesize_t FRAME_SIZE_IMAGE = FRAMESIZE_SVGA; // default camera resolution
|
||||||
|
@ -510,11 +510,14 @@ if (reset) {
|
||||||
|
|
||||||
// check the esp32cam board has a psram chip installed (extra memory used for storing captured images)
|
// check the esp32cam board has a psram chip installed (extra memory used for storing captured images)
|
||||||
// Note: if not using "AI thinker esp32 cam" in the Arduino IDE, PSRAM must be enabled
|
// Note: if not using "AI thinker esp32 cam" in the Arduino IDE, PSRAM must be enabled
|
||||||
if (!psramFound()) {
|
if (!psramFound()) {
|
||||||
if (serialDebug) Serial.println("Warning: No PSRam found so defaulting to image size 'CIF'");
|
if (serialDebug) Serial.println("Warning: No PSRam found so defaulting to smaller image size 'VGA' in DRAM");
|
||||||
config.frame_size = FRAMESIZE_SVGA;
|
config.frame_size = FRAMESIZE_VGA;
|
||||||
config.fb_location = CAMERA_FB_IN_DRAM;
|
config.fb_location = CAMERA_FB_IN_DRAM;
|
||||||
}
|
} else {
|
||||||
|
// If PSRAM IS found, explicitly set fb_location
|
||||||
|
config.fb_location = CAMERA_FB_IN_PSRAM;
|
||||||
|
}
|
||||||
|
|
||||||
esp_err_t camerr = esp_camera_init(&config); // initialise the camera
|
esp_err_t camerr = esp_camera_init(&config); // initialise the camera
|
||||||
if (camerr != ESP_OK) {
|
if (camerr != ESP_OK) {
|
||||||
|
@ -783,10 +786,12 @@ byte storeImage() {
|
||||||
if (serialDebug) Serial.println("Failed to create file in Spiffs - will format and try again");
|
if (serialDebug) Serial.println("Failed to create file in Spiffs - will format and try again");
|
||||||
if (!SPIFFS.format()) { // format spiffs
|
if (!SPIFFS.format()) { // format spiffs
|
||||||
if (serialDebug) Serial.println("Spiffs format failed");
|
if (serialDebug) Serial.println("Spiffs format failed");
|
||||||
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
file = SPIFFS.open(spiffsFilename, FILE_WRITE); // try again to create new file
|
file = SPIFFS.open(spiffsFilename, FILE_WRITE); // try again to create new file
|
||||||
if (!file) {
|
if (!file) {
|
||||||
if (serialDebug) Serial.println("Still unable to create file in spiffs");
|
if (serialDebug) Serial.println("Still unable to create file in spiffs");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -795,6 +800,8 @@ byte storeImage() {
|
||||||
sRes = 1; // flag as saved ok
|
sRes = 1; // flag as saved ok
|
||||||
} else {
|
} else {
|
||||||
if (serialDebug) Serial.println("Error: failed to write image data to spiffs file");
|
if (serialDebug) Serial.println("Error: failed to write image data to spiffs file");
|
||||||
|
file.close();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
esp_camera_fb_return(fb); // return camera frame buffer
|
esp_camera_fb_return(fb); // return camera frame buffer
|
||||||
|
@ -1097,43 +1104,45 @@ void handleData(){
|
||||||
SDtotalSpace = SD_MMC.totalBytes() / (1024 * 1024);
|
SDtotalSpace = SD_MMC.totalBytes() / (1024 * 1024);
|
||||||
SDfreeSpace = SDtotalSpace - SDusedSpace;
|
SDfreeSpace = SDtotalSpace - SDusedSpace;
|
||||||
}
|
}
|
||||||
String reply = "";
|
|
||||||
|
server.setContentLength(CONTENT_LENGTH_UNKNOWN);
|
||||||
|
server.send(200, "text/plain", "");
|
||||||
|
|
||||||
// line1 - sd card
|
// line1 - sd card
|
||||||
if (!sdcardPresent) {
|
if (!sdcardPresent) {
|
||||||
reply += "<span style='color:blue;'>NO SD CARD DETECTED</span>";
|
server.sendContent("<span style='color:blue;'>NO SD CARD DETECTED</span>");
|
||||||
} else {
|
} else {
|
||||||
reply += "SD Card: " + String(SDusedSpace) + "MB used - " + String(SDfreeSpace) + "MB free";
|
server.sendContent("SD Card: " + String(SDusedSpace) + "MB used - " + String(SDfreeSpace) + "MB free");
|
||||||
}
|
}
|
||||||
reply += ",";
|
server.sendContent(",");
|
||||||
|
|
||||||
// line2 - illumination/flash led
|
// line2 - illumination/flash led
|
||||||
reply += "Illumination led brightness=" + String(brightLEDbrightness);
|
server.sendContent("Illumination led brightness=" + String(brightLEDbrightness));
|
||||||
reply += "   Flash is "; // Note: ' ' leaves a gap
|
server.sendContent("   Flash is "); // Note: ' ' leaves a gap
|
||||||
reply += (flashRequired) ? "Enabled" : "Off";
|
server.sendContent( (flashRequired) ? "Enabled" : "Off" );
|
||||||
reply += ",";
|
server.sendContent(",");
|
||||||
|
|
||||||
// line3 - Current real time
|
// line3 - Current real time
|
||||||
reply += "Current time: " + localTime();
|
server.sendContent("Current time: " + localTime());
|
||||||
reply += ",";
|
server.sendContent(",");
|
||||||
|
|
||||||
// line4 - gpio pin status
|
// line4 - gpio pin status
|
||||||
reply += "GPIO output pin 12 is: ";
|
server.sendContent("GPIO output pin 12 is: ");
|
||||||
reply += (digitalRead(iopinB)==1) ? "ON" : "OFF";
|
server.sendContent( (digitalRead(iopinB)==1) ? "ON" : "OFF" );
|
||||||
reply += "   GPIO input pin 13 is: ";
|
server.sendContent("   GPIO input pin 13 is: ");
|
||||||
reply += (digitalRead(iopinA)==1) ? "ON" : "OFF";
|
server.sendContent( (digitalRead(iopinA)==1) ? "ON" : "OFF" );
|
||||||
reply += ",";
|
server.sendContent(",");
|
||||||
|
|
||||||
// line5 - image resolution
|
// line5 - image resolution
|
||||||
reply += "Image size: " + ImageResDetails;
|
server.sendContent("Image size: " + ImageResDetails);
|
||||||
reply += ",";
|
server.sendContent(",");
|
||||||
|
|
||||||
// line6 - memory - wifi
|
// line6 - memory - wifi
|
||||||
reply += "Free memory: " + String(ESP.getFreeHeap() /1000) + "K";
|
server.sendContent("Free memory: " + String(ESP.getFreeHeap() /1000) + "K");
|
||||||
if (!psramFound()) reply += " (No PSRAM found!)";
|
if (!psramFound()) server.sendContent(" (No PSRAM found!)");
|
||||||
reply += "  Wifi strength: " + String(WiFi.RSSI()) + "dBm";
|
server.sendContent("  Wifi strength: " + String(WiFi.RSSI()) + "dBm");
|
||||||
|
|
||||||
server.send(200, "text/plane", reply); //Send millis value only to client ajax request
|
// server.client().stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1367,16 +1376,18 @@ void readRGBImage() {
|
||||||
sendText(client,"Free psram after rgb data allocated = " + String(heap_caps_get_free_size(MALLOC_CAP_SPIRAM) / 1024) + "K");
|
sendText(client,"Free psram after rgb data allocated = " + String(heap_caps_get_free_size(MALLOC_CAP_SPIRAM) / 1024) + "K");
|
||||||
|
|
||||||
// convert the captured jpg image (fb) to rgb data (store in 'rgb' array)
|
// convert the captured jpg image (fb) to rgb data (store in 'rgb' array)
|
||||||
tTimer = millis(); // store time that image conversion process started
|
tTimer = millis(); // store time that image conversion process started
|
||||||
bool jpeg_converted = fmt2rgb888(fb->buf, fb->len, PIXFORMAT_JPEG, rgb);
|
bool jpeg_converted = fmt2rgb888(fb->buf, fb->len, PIXFORMAT_JPEG, rgb);
|
||||||
if (!jpeg_converted) {
|
if (!jpeg_converted) {
|
||||||
sendText(client,"error: failed to convert image to RGB data");
|
sendText(client,"error: failed to convert image to RGB data");
|
||||||
if (!sendRGBfile) {
|
heap_caps_free(ptrVal);
|
||||||
client.write("<br><a href='/'>Return</a>\n"); // link back
|
esp_camera_fb_return(fb);
|
||||||
sendFooter(client); // close web page
|
if (!sendRGBfile) {
|
||||||
}
|
client.write("<br><a href='/'>Return</a>\n"); // link back
|
||||||
return;
|
sendFooter(client); // close web page
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
sendText(client, "Conversion from jpg to RGB took " + String(millis() - tTimer) + " milliseconds");// report how long the conversion took
|
sendText(client, "Conversion from jpg to RGB took " + String(millis() - tTimer) + " milliseconds");// report how long the conversion took
|
||||||
|
|
||||||
|
|
||||||
|
@ -1711,7 +1722,15 @@ void readGrayscaleImage() {
|
||||||
delay(100);
|
delay(100);
|
||||||
analogWrite(brightLED, currentBrightness); // change LED brightness back to previous state
|
analogWrite(brightLED, currentBrightness); // change LED brightness back to previous state
|
||||||
}
|
}
|
||||||
if (!fb) client.println("Error: Camera image capture failed");
|
if (!fb) {
|
||||||
|
client.println("Error: Camera image capture failed");
|
||||||
|
// Ensure we switch back even on failure
|
||||||
|
esp_camera_deinit();
|
||||||
|
delay(camChangeDelay);
|
||||||
|
initialiseCamera(1);
|
||||||
|
sendFooter(client); // Close page if needed
|
||||||
|
return; // Exit
|
||||||
|
}
|
||||||
|
|
||||||
// // read image data and calculate average pixel value (as demonstration of reading the image data)
|
// // read image data and calculate average pixel value (as demonstration of reading the image data)
|
||||||
// // note: image x = i % WIDTH, image y = floor(i / WIDTH)
|
// // note: image x = i % WIDTH, image y = floor(i / WIDTH)
|
||||||
|
@ -1729,7 +1748,19 @@ void readGrayscaleImage() {
|
||||||
|
|
||||||
// resize the image
|
// resize the image
|
||||||
int newWidth = 115; int newHeight = 42; // much bigger than this seems to cause problems, possible web page is too large?
|
int newWidth = 115; int newHeight = 42; // much bigger than this seems to cause problems, possible web page is too large?
|
||||||
byte newBuf[newWidth * newHeight];
|
size_t newBufSize = newWidth * newHeight;
|
||||||
|
byte* newBuf = (byte*)malloc(newBufSize);
|
||||||
|
if (!newBuf) {
|
||||||
|
client.println("Error: Failed to allocate memory for resized buffer");
|
||||||
|
esp_camera_fb_return(fb); // Clean up camera buffer
|
||||||
|
// Switch back to JPG before returning
|
||||||
|
esp_camera_deinit();
|
||||||
|
delay(camChangeDelay);
|
||||||
|
initialiseCamera(1);
|
||||||
|
sendFooter(client); // Close page if needed
|
||||||
|
return; // Exit
|
||||||
|
}
|
||||||
|
|
||||||
resize_esp32cam_image_buffer(fb->buf, fb->width, fb->height, newBuf, newWidth, newHeight);
|
resize_esp32cam_image_buffer(fb->buf, fb->width, fb->height, newBuf, newWidth, newHeight);
|
||||||
|
|
||||||
// Get the min and max values in the new resized image
|
// Get the min and max values in the new resized image
|
||||||
|
@ -1764,7 +1795,8 @@ void readGrayscaleImage() {
|
||||||
delay(3);
|
delay(3);
|
||||||
client.stop();
|
client.stop();
|
||||||
|
|
||||||
// return image frame to free up memory
|
// free up memory
|
||||||
|
free(newBuf);
|
||||||
esp_camera_fb_return(fb); // return camera frame buffer
|
esp_camera_fb_return(fb); // return camera frame buffer
|
||||||
|
|
||||||
// change camera back to JPG mode
|
// change camera back to JPG mode
|
||||||
|
|
Ładowanie…
Reference in New Issue