From 1d04aae9e99cfebf895e1a54221223c16da6418e Mon Sep 17 00:00:00 2001 From: biver Date: Sun, 30 Apr 2023 21:30:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D0=B5=D0=BC=20esp32cam=20=D0=A2=D0=B5=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D1=8C=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=B4=D0=B2=D0=B0=D1=80=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D0=BD=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B5=D0=BA=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=BF=D0=BB=D0=B0=D1=82=20WROVER=5FKIT=20?= =?UTF-8?q?//=20Has=20PSRAM=20ESP=5FEYE=20//=20Has=20PSRAM=20ESP32S3=5FEYE?= =?UTF-8?q?=20//=20Has=20PSRAM=20M5STACK=5FPSRAM=20//=20Has=20PSRAM=20M5ST?= =?UTF-8?q?ACK=5FV2=5FPSRAM=20//=20M5Camera=20version=20B=20Has=20PSRAM=20?= =?UTF-8?q?M5STACK=5FWIDE=20//=20Has=20PSRAM=20M5STACK=5FESP32CAM=20//=20N?= =?UTF-8?q?o=20PSRAM=20M5STACK=5FUNITCAM=20//=20No=20PSRAM=20TTGO=5FT=5FJO?= =?UTF-8?q?URNAL=20//=20No=20PSRAM=20XIAO=5FESP32S3=20//=20Has=20PSRAM=20E?= =?UTF-8?q?SP32=5FCAM=5FBOARD=20ESP32S2=5FCAM=5FBOARD=20ESP32S3=5FCAM=5FLC?= =?UTF-8?q?D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/exec/EspCam/EspCam.cpp | 189 ++++++++++------ src/modules/exec/EspCam/camera_pins.h | 298 ++++++++++++++++++++++++++ src/modules/exec/EspCam/modinfo.json | 22 +- 3 files changed, 434 insertions(+), 75 deletions(-) create mode 100644 src/modules/exec/EspCam/camera_pins.h diff --git a/src/modules/exec/EspCam/EspCam.cpp b/src/modules/exec/EspCam/EspCam.cpp index 6f75ca52..4d609b69 100644 --- a/src/modules/exec/EspCam/EspCam.cpp +++ b/src/modules/exec/EspCam/EspCam.cpp @@ -2,62 +2,61 @@ #include "classes/IoTItem.h" #include "esp_camera.h" -// #include "soc/soc.h" // Disable brownour problems -// #include "soc/rtc_cntl_reg.h" // Disable brownour problems +#include "soc/soc.h" // Disable brownour problems +#include "soc/rtc_cntl_reg.h" // Disable brownour problems + +void handleGetPic(); + +// =================== +// Select camera model +// =================== +//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM +//#define CAMERA_MODEL_ESP_EYE // Has PSRAM +//#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM +//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM +//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM +//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM +//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM +//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM +#define CAMERA_MODEL_AI_THINKER // Has PSRAM +//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM +//#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM +// ** Espressif Internal Boards ** +//#define CAMERA_MODEL_ESP32_CAM_BOARD +//#define CAMERA_MODEL_ESP32S2_CAM_BOARD +//#define CAMERA_MODEL_ESP32S3_CAM_LCD -// Pin definition for CAMERA_MODEL_AI_THINKER -#define PWDN_GPIO_NUM 32 -#define RESET_GPIO_NUM -1 -#define XCLK_GPIO_NUM 0 -#define SIOD_GPIO_NUM 26 -#define SIOC_GPIO_NUM 27 +#define LED_LEDC_CHANNEL 2 //Using different ledc channel/timer than camera +#define CONFIG_LED_MAX_INTENSITY 255 -#define Y9_GPIO_NUM 35 -#define Y8_GPIO_NUM 34 -#define Y7_GPIO_NUM 39 -#define Y6_GPIO_NUM 36 -#define Y5_GPIO_NUM 21 -#define Y4_GPIO_NUM 19 -#define Y3_GPIO_NUM 18 -#define Y2_GPIO_NUM 5 -#define VSYNC_GPIO_NUM 25 -#define HREF_GPIO_NUM 23 -#define PCLK_GPIO_NUM 22 - -#define PICBUF_SIZE 50000 +#include "camera_pins.h" IoTItem* globalItem = nullptr; -bool webTicker = false; -void handleGetCam() { - ////Serial.printf("try send pic by size=%d", lastPhotoBSize); - // if (globalItem && globalItem->value.extBinInfoSize) { - // //Serial.printf("try send pic by size=%d", globalItem->value.extBinInfoSize); - // HTTP.send_P(200, "image/jpeg", (char*)globalItem->value.extBinInfo, globalItem->value.extBinInfoSize); - // if (webTicker) globalItem->regEvent("webAsk", "EspCam"); - // } else HTTP.send(200, "text/json", "Item EspCam not prepared yet or camera hasn't taken a picture yet"); -} class EspCam : public IoTItem { private: - camera_fb_t * fb = NULL; bool _useLed, _ticker, _webTicker; public: + bool isUsedLed() { return _useLed; } + bool isWebTicker() { return _webTicker; } + EspCam(String parameters): IoTItem(parameters) { - //WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector + WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector jsonRead(parameters, "useLed", _useLed); // используем = 1 или нет = 0 подсветку (вспышку) + if (_useLed) { + ledcSetup(LED_LEDC_CHANNEL, 5000, 8); + ledcAttachPin(LED_GPIO_NUM, LED_LEDC_CHANNEL); + } + jsonRead(parameters, "ticker", _ticker); // тикать = 1 - сообщаем всем, что сделали снимок и он готов jsonRead(parameters, "webTicker", _webTicker); // сообщать всем, что через веб попросили отдать картинку с камеры - webTicker = _webTicker; globalItem = this; // выносим адрес переменной экземпляра для доступа к данным из обработчика событий веб - //pinMode(4, OUTPUT); - //digitalWrite(4, LOW); - camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; @@ -78,45 +77,71 @@ class EspCam : public IoTItem { config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; - config.pixel_format = PIXFORMAT_JPEG; - + config.frame_size = FRAMESIZE_UXGA; + config.pixel_format = PIXFORMAT_JPEG; // for streaming + //config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition config.grab_mode = CAMERA_GRAB_WHEN_EMPTY; - - //value.extBinInfo = (uint8_t*)malloc(sizeof(uint8_t) * PICBUF_SIZE); + config.fb_location = CAMERA_FB_IN_PSRAM; + config.jpeg_quality = 12; + config.fb_count = 1; + // if PSRAM IC present, init with UXGA resolution and higher JPEG quality + // for larger pre-allocated frame buffer. + if(psramFound()){ - config.frame_size = FRAMESIZE_QVGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA - config.jpeg_quality = 12; //0-63 lower number means higher quality - config.fb_count = 1; - Serial.printf("Camera psramFound\n"); + config.jpeg_quality = 10; + config.fb_count = 2; + config.grab_mode = CAMERA_GRAB_LATEST; } else { - config.frame_size = FRAMESIZE_QVGA; - config.jpeg_quality = 12; - config.fb_count = 1; + // Limit the frame size when PSRAM is not available + config.frame_size = FRAMESIZE_SVGA; + config.fb_location = CAMERA_FB_IN_DRAM; } - // Init Camera + #if defined(CAMERA_MODEL_ESP_EYE) + pinMode(13, INPUT_PULLUP); + pinMode(14, INPUT_PULLUP); + #endif + + // camera init esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { - Serial.printf("Camera init failed with error 0x%x\n", err); + Serial.printf("Camera init failed with error 0x%x", err); return; } - - HTTP.on("/getcam", HTTP_GET, handleGetCam); + + sensor_t * s = esp_camera_sensor_get(); + // initial sensors are flipped vertically and colors are a bit saturated + if (s->id.PID == OV3660_PID) { + s->set_vflip(s, 1); // flip it back + s->set_brightness(s, 1); // up the brightness just a bit + s->set_saturation(s, -2); // lower the saturation + } + + #if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM) + s->set_vflip(s, 1); + s->set_hmirror(s, 1); + #endif + + #if defined(CAMERA_MODEL_ESP32S3_EYE) + s->set_vflip(s, 1); + #endif + + HTTP.on("/getpic", HTTP_GET, handleGetPic); } - void take_picture() { - if (_useLed) digitalWrite(4, HIGH); //Turn on the flash + void save_picture() { + // if (_useLed) digitalWrite(4, HIGH); //Turn on the flash - // Take Picture with Camera - fb = esp_camera_fb_get(); - if(!fb || fb->len >= PICBUF_SIZE) { - if (fb) { - Serial.printf("Camera capture failed size=%d\n", fb->len); - esp_camera_fb_return(fb); - } else Serial.printf("Camera capture failed\n"); - return; - } + // // Take Picture with Camera + // fb = esp_camera_fb_get(); + // if(!fb || fb->len >= PICBUF_SIZE) { + // if (fb) { + // Serial.printf("Camera capture failed size=%d\n", fb->len); + // esp_camera_fb_return(fb); + // } else Serial.printf("Camera capture failed\n"); + // return; + // } // // if (value.extBinInfoSize < fb->len) { // // if (value.extBinInfo) free(value.extBinInfo); @@ -125,20 +150,26 @@ class EspCam : public IoTItem { // memcpy(value.extBinInfo, fb->buf, fb->len); // value.extBinInfoSize = fb->len; - Serial.printf("try send pic by size=%d", fb->len); + // Serial.printf("try send pic by size=%d", fb->len); - if (_useLed) digitalWrite(4, LOW); - if (_ticker) regEvent("shot", "EspCam"); - esp_camera_fb_return(fb); + // if (_useLed) digitalWrite(4, LOW); + // if (_ticker) regEvent("shot", "EspCam"); + // esp_camera_fb_return(fb); } void doByInterval() { - //take_picture(); + //save_picture(); } IoTValue execute(String command, std::vector ¶m) { - if (command == "shot") { - take_picture(); + if (command == "save") { + save_picture(); + } else if (command == "ledOn" && param.size() == 1) { + ledcSetup(LED_LEDC_CHANNEL, 5000, 8); + ledcAttachPin(LED_GPIO_NUM, LED_LEDC_CHANNEL); + ledcWrite(LED_LEDC_CHANNEL, param[0].valD); + } else if (command == "ledOff") { + ledcWrite(LED_LEDC_CHANNEL, 0); } return {}; @@ -150,6 +181,26 @@ class EspCam : public IoTItem { }; }; +void handleGetPic() { + if (!globalItem) return; + + if (((EspCam*)globalItem)->isUsedLed()) ledcWrite(LED_LEDC_CHANNEL, CONFIG_LED_MAX_INTENSITY); //Turn on the flash + + camera_fb_t* fb = NULL; + fb = esp_camera_fb_get(); + if (!fb) { + HTTP.send(200, "text/json", F("Item EspCam not prepared yet or camera hasn't taken a picture yet")); + return; + } + + HTTP.send_P(200, "image/jpeg", (char *)fb->buf, fb->len); + + if (((EspCam*)globalItem)->isUsedLed()) ledcWrite(LED_LEDC_CHANNEL, 0); + if (((EspCam*)globalItem)->isWebTicker()) globalItem->regEvent("webTakesPhoto", "EspCam"); + esp_camera_fb_return(fb); +} + + void* getAPI_EspCam(String subtype, String param) { if (subtype == F("EspCam")) { return new EspCam(param); diff --git a/src/modules/exec/EspCam/camera_pins.h b/src/modules/exec/EspCam/camera_pins.h new file mode 100644 index 00000000..48f49093 --- /dev/null +++ b/src/modules/exec/EspCam/camera_pins.h @@ -0,0 +1,298 @@ + +#if defined(CAMERA_MODEL_WROVER_KIT) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 21 +#define SIOD_GPIO_NUM 26 +#define SIOC_GPIO_NUM 27 + +#define Y9_GPIO_NUM 35 +#define Y8_GPIO_NUM 34 +#define Y7_GPIO_NUM 39 +#define Y6_GPIO_NUM 36 +#define Y5_GPIO_NUM 19 +#define Y4_GPIO_NUM 18 +#define Y3_GPIO_NUM 5 +#define Y2_GPIO_NUM 4 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 23 +#define PCLK_GPIO_NUM 22 + +#elif defined(CAMERA_MODEL_ESP_EYE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 4 +#define SIOD_GPIO_NUM 18 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 36 +#define Y8_GPIO_NUM 37 +#define Y7_GPIO_NUM 38 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 35 +#define Y4_GPIO_NUM 14 +#define Y3_GPIO_NUM 13 +#define Y2_GPIO_NUM 34 +#define VSYNC_GPIO_NUM 5 +#define HREF_GPIO_NUM 27 +#define PCLK_GPIO_NUM 25 + +#define LED_GPIO_NUM 22 + +#elif defined(CAMERA_MODEL_M5STACK_PSRAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_V2_PSRAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 22 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_WIDE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 22 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#define LED_GPIO_NUM 2 + +#elif defined(CAMERA_MODEL_M5STACK_ESP32CAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 17 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_M5STACK_UNITCAM) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 32 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_AI_THINKER) +#define PWDN_GPIO_NUM 32 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 0 +#define SIOD_GPIO_NUM 26 +#define SIOC_GPIO_NUM 27 + +#define Y9_GPIO_NUM 35 +#define Y8_GPIO_NUM 34 +#define Y7_GPIO_NUM 39 +#define Y6_GPIO_NUM 36 +#define Y5_GPIO_NUM 21 +#define Y4_GPIO_NUM 19 +#define Y3_GPIO_NUM 18 +#define Y2_GPIO_NUM 5 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 23 +#define PCLK_GPIO_NUM 22 + +// 4 for flash led or 33 for normal led +#define LED_GPIO_NUM 4 + +#elif defined(CAMERA_MODEL_TTGO_T_JOURNAL) +#define PWDN_GPIO_NUM 0 +#define RESET_GPIO_NUM 15 +#define XCLK_GPIO_NUM 27 +#define SIOD_GPIO_NUM 25 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 19 +#define Y8_GPIO_NUM 36 +#define Y7_GPIO_NUM 18 +#define Y6_GPIO_NUM 39 +#define Y5_GPIO_NUM 5 +#define Y4_GPIO_NUM 34 +#define Y3_GPIO_NUM 35 +#define Y2_GPIO_NUM 17 +#define VSYNC_GPIO_NUM 22 +#define HREF_GPIO_NUM 26 +#define PCLK_GPIO_NUM 21 + +#elif defined(CAMERA_MODEL_XIAO_ESP32S3) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 10 +#define SIOD_GPIO_NUM 40 +#define SIOC_GPIO_NUM 39 + +#define Y9_GPIO_NUM 48 +#define Y8_GPIO_NUM 11 +#define Y7_GPIO_NUM 12 +#define Y6_GPIO_NUM 14 +#define Y5_GPIO_NUM 16 +#define Y4_GPIO_NUM 18 +#define Y3_GPIO_NUM 17 +#define Y2_GPIO_NUM 15 +#define VSYNC_GPIO_NUM 38 +#define HREF_GPIO_NUM 47 +#define PCLK_GPIO_NUM 13 + +#elif defined(CAMERA_MODEL_ESP32_CAM_BOARD) +// The 18 pin header on the board has Y5 and Y3 swapped +#define USE_BOARD_HEADER 0 +#define PWDN_GPIO_NUM 32 +#define RESET_GPIO_NUM 33 +#define XCLK_GPIO_NUM 4 +#define SIOD_GPIO_NUM 18 +#define SIOC_GPIO_NUM 23 + +#define Y9_GPIO_NUM 36 +#define Y8_GPIO_NUM 19 +#define Y7_GPIO_NUM 21 +#define Y6_GPIO_NUM 39 +#if USE_BOARD_HEADER +#define Y5_GPIO_NUM 13 +#else +#define Y5_GPIO_NUM 35 +#endif +#define Y4_GPIO_NUM 14 +#if USE_BOARD_HEADER +#define Y3_GPIO_NUM 35 +#else +#define Y3_GPIO_NUM 13 +#endif +#define Y2_GPIO_NUM 34 +#define VSYNC_GPIO_NUM 5 +#define HREF_GPIO_NUM 27 +#define PCLK_GPIO_NUM 25 + +#elif defined(CAMERA_MODEL_ESP32S3_CAM_LCD) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 40 +#define SIOD_GPIO_NUM 17 +#define SIOC_GPIO_NUM 18 + +#define Y9_GPIO_NUM 39 +#define Y8_GPIO_NUM 41 +#define Y7_GPIO_NUM 42 +#define Y6_GPIO_NUM 12 +#define Y5_GPIO_NUM 3 +#define Y4_GPIO_NUM 14 +#define Y3_GPIO_NUM 47 +#define Y2_GPIO_NUM 13 +#define VSYNC_GPIO_NUM 21 +#define HREF_GPIO_NUM 38 +#define PCLK_GPIO_NUM 11 + +#elif defined(CAMERA_MODEL_ESP32S2_CAM_BOARD) +// The 18 pin header on the board has Y5 and Y3 swapped +#define USE_BOARD_HEADER 0 +#define PWDN_GPIO_NUM 1 +#define RESET_GPIO_NUM 2 +#define XCLK_GPIO_NUM 42 +#define SIOD_GPIO_NUM 41 +#define SIOC_GPIO_NUM 18 + +#define Y9_GPIO_NUM 16 +#define Y8_GPIO_NUM 39 +#define Y7_GPIO_NUM 40 +#define Y6_GPIO_NUM 15 +#if USE_BOARD_HEADER +#define Y5_GPIO_NUM 12 +#else +#define Y5_GPIO_NUM 13 +#endif +#define Y4_GPIO_NUM 5 +#if USE_BOARD_HEADER +#define Y3_GPIO_NUM 13 +#else +#define Y3_GPIO_NUM 12 +#endif +#define Y2_GPIO_NUM 14 +#define VSYNC_GPIO_NUM 38 +#define HREF_GPIO_NUM 4 +#define PCLK_GPIO_NUM 3 + +#elif defined(CAMERA_MODEL_ESP32S3_EYE) +#define PWDN_GPIO_NUM -1 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 15 +#define SIOD_GPIO_NUM 4 +#define SIOC_GPIO_NUM 5 + +#define Y2_GPIO_NUM 11 +#define Y3_GPIO_NUM 9 +#define Y4_GPIO_NUM 8 +#define Y5_GPIO_NUM 10 +#define Y6_GPIO_NUM 12 +#define Y7_GPIO_NUM 18 +#define Y8_GPIO_NUM 17 +#define Y9_GPIO_NUM 16 + +#define VSYNC_GPIO_NUM 6 +#define HREF_GPIO_NUM 7 +#define PCLK_GPIO_NUM 13 + +#else +#error "Camera model not selected" +#endif \ No newline at end of file diff --git a/src/modules/exec/EspCam/modinfo.json b/src/modules/exec/EspCam/modinfo.json index ec35a2a2..429beddf 100644 --- a/src/modules/exec/EspCam/modinfo.json +++ b/src/modules/exec/EspCam/modinfo.json @@ -23,23 +23,33 @@ "authorGit": "https://github.com/biveraxe", "specialThanks": "", "moduleName": "EspCam", - "moduleVersion": "1.0", + "moduleVersion": "2.1", "usedRam": { "esp32_4mb": 15, "esp8266_4mb": 15 }, "title": "Camera OV2640 (ESPcam)", - "moduleDesc": "Предназначен для специальной платы esp32 со встроенной камерой. Добавляет в прошивку функцию создания фото и сохранения в оперативную память. Для сброса на флешкарту необходимо использовать парный модуль SDcard. Это экспериментальные модули и в будущем планируется пересобрать их.", + "moduleDesc": "Предназначен для специальной платы esp32 со встроенной камерой. Добавляет в прошивку функцию создания фото и сохранения на SD при наличии. По адресу /getpic можно получить текущее фото (работает в том числе без SD карты).", "propInfo": { - "int": "Пауза в секундах во время постоянной съемки.", + "int": "Пауза в секундах во время постоянной фотосъемки.", "useLed": "использовать диод подсветки при съемке.", "ticker": "Генерировать(1) или нет(0) событие с интервалом int", - "webTicker": "Генерировать(1) или нет(0) событие при обращении через веб-страницу с текущим фото в памяти." + "webTicker": "Генерировать(1) или нет(0) событие при обращении через веб-страницу по адресу /getpic." }, "funcInfo": [ { - "name": "shot", - "descr": "Сделать снимок", + "name": "save", + "descr": "Сохранить снимок на SD", + "params": [] + }, + { + "name": "ledOn", + "descr": "Включить подсветку", + "params": ["Яркость 0-255"] + }, + { + "name": "ledOff", + "descr": "Отключить подсветку", "params": [] } ]