diff --git a/README.md b/README.md index edcd053..3655d8d 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,8 @@ This software supports the following ESP32-CAM (and alike) modules: - M5STACK_V2_PSRAM - M5STACK_PSRAM - M5STACK_WIDE +- M5STACK M5PoECAM-W +- M5STACK Timer CAM (Original and X) - M5STACK - Seeed Studio XIAO ESP32S3 SENSE - TTGO T-CAMERA @@ -310,22 +312,23 @@ The availability of PSRAM can be seen in the HTML status overview. Not all the boards are equipped with PSRAM: -| Board | PSRAM | -|--- |--- | -| WROVER_KIT | 8Mb | -| ESP_EYE | 8Mb | -| ESP32S3_EYE | 8Mb | -| M5STACK_PSRAM | 8Mb | -| M5STACK_V2_PSRAM | Version B only | -| M5STACK_WIDE | 8Mb | -| M5STACK_ESP32CAM | No | -| M5STACK_UNITCAM | No | -| M5STACK_UNITCAMS3 | 8Mb | -| AI_THINKER | 8Mb | -| TTGO_T_JOURNAL | No | -| ESP32_CAM_BOARD | ? | -| ESP32S2_CAM_BOARD | ? | -| ESP32S3_CAM_LCD | ? | +| Board | PSRAM | +|--------------------|----------------| +| WROVER_KIT | 8Mb | +| ESP_EYE | 8Mb | +| ESP32S3_EYE | 8Mb | +| M5STACK_PSRAM | 8Mb | +| M5STACK_V2_PSRAM | Version B only | +| M5STACK_WIDE | 8Mb | +| M5STACK_ESP32CAM | No | +| M5STACK_UNITCAM | No | +| M5STACK_UNITCAMS3 | 8Mb | +| M5STACK_M5PoECAM-W | 8MB | +| AI_THINKER | 8Mb | +| TTGO_T_JOURNAL | No | +| ESP32_CAM_BOARD | ? | +| ESP32S2_CAM_BOARD | ? | +| ESP32S3_CAM_LCD | ? | Depending on the image resolution, framerate and quality, the PSRAM must be enabled and/or the number of frame buffers increased to keep up with the data generated by the sensor. There are (a lot of?) boards around with faulty PSRAM. If the camera fails to initialize, this might be a reason. See on [Reddit](https://www.reddit.com/r/esp32/comments/z2hyns/i_have_a_faulty_psram_on_my_esp32cam_what_should/). @@ -357,6 +360,8 @@ esp32cam-rtsp depends on PlatformIO, Bootstrap 5 and Micro-RTSP by Kevin Hester. ## Change history +- August 2024 + - Added support for M5Stack M5PoECAM-W - January 2024 - Moved settings to board definitions - Added new boards diff --git a/assets/boards/m5stack_m5poecam-w_back.webp b/assets/boards/m5stack_m5poecam-w_back.webp new file mode 100644 index 0000000..bf2088b Binary files /dev/null and b/assets/boards/m5stack_m5poecam-w_back.webp differ diff --git a/assets/boards/m5stack_m5poecam-w_front.webp b/assets/boards/m5stack_m5poecam-w_front.webp new file mode 100644 index 0000000..888b2fc Binary files /dev/null and b/assets/boards/m5stack_m5poecam-w_front.webp differ diff --git a/boards/esp32cam_ai_thinker.json b/boards/esp32cam_ai_thinker.json index 5c5fa8c..3f7802d 100644 --- a/boards/esp32cam_ai_thinker.json +++ b/boards/esp32cam_ai_thinker.json @@ -9,6 +9,7 @@ "'-D ESP32CAM_AI_THINKER'", "'-D BOARD_HAS_PSRAM'", "'-mfix-esp32-psram-cache-issue'", + "'-D FLASH_LED_GPIO=4'", "'-D USER_LED_GPIO=33'", "'-D USER_LED_ON_LEVEL=LOW'", "'-D CAMERA_CONFIG_PIN_PWDN=32'", diff --git a/boards/esp32cam_m5stack_m5poecam_w.json b/boards/esp32cam_m5stack_m5poecam_w.json new file mode 100644 index 0000000..9b2e6ea --- /dev/null +++ b/boards/esp32cam_m5stack_m5poecam_w.json @@ -0,0 +1,68 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32_out.ld", + "partitions": "default_8MB.csv" + }, + "core": "esp32", + "extra_flags": [ + "'-D ESP32CAM_M5STACK_M5POECAM'", + "'-D BOARD_HAS_PSRAM'", + "'-D USER_LED_GPIO=0'", + "'-D USER_LED_ON_LEVEL=LOW'", + "'-mfix-esp32-psram-cache-issue'", + "'-D CAMERA_CONFIG_PIN_PWDN=GPIO_NUM_NC'", + "'-D CAMERA_CONFIG_PIN_RESET=15'", + "'-D CAMERA_CONFIG_PIN_XCLK=27'", + "'-D CAMERA_CONFIG_PIN_SCCB_SDA=14'", + "'-D CAMERA_CONFIG_PIN_SCCB_SCL=12'", + "'-D CAMERA_CONFIG_PIN_Y9=19'", + "'-D CAMERA_CONFIG_PIN_Y8=36'", + "'-D CAMERA_CONFIG_PIN_Y7=18'", + "'-D CAMERA_CONFIG_PIN_Y6=39'", + "'-D CAMERA_CONFIG_PIN_Y5=5'", + "'-D CAMERA_CONFIG_PIN_Y4=34'", + "'-D CAMERA_CONFIG_PIN_Y3=35'", + "'-D CAMERA_CONFIG_PIN_Y2=32'", + "'-D CAMERA_CONFIG_PIN_VSYNC=22'", + "'-D CAMERA_CONFIG_PIN_HREF=26'", + "'-D CAMERA_CONFIG_PIN_PCLK=21'", + "'-D CAMERA_CONFIG_CLK_FREQ_HZ=20000000'", + "'-D CAMERA_CONFIG_LEDC_TIMER=LEDC_TIMER_0'", + "'-D CAMERA_CONFIG_LEDC_CHANNEL=LEDC_CHANNEL_0'", + "'-D CAMERA_CONFIG_FB_COUNT=2'", + "'-D CAMERA_CONFIG_FB_LOCATION=CAMERA_FB_IN_PSRAM'", + "'-D SCCB_I2C_PORT=I2C_NUM_0'", + "'-D GROVE_SDA=25'", + "'-D GROVE_SCL=33'" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "dio", + "mcu": "esp32", + "variant": "esp32" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet", + "can" + ], + "debug": { + "openocd_board": "esp-wroom-32.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "ESP32-CAM M5STACK M5PoECAM-W", + "upload": { + "flash_size": "16MB", + "maximum_ram_size": 327680, + "maximum_size": 16777216, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://docs.m5stack.com/en/unit/poecam-w", + "vendor": "M5STACK" +} \ No newline at end of file diff --git a/boards/esp32cam_m5stack_unitcams3.json b/boards/esp32cam_m5stack_unitcams3.json index c29cc6c..897b52d 100644 --- a/boards/esp32cam_m5stack_unitcams3.json +++ b/boards/esp32cam_m5stack_unitcams3.json @@ -20,25 +20,25 @@ "'-D CAMERA_CONFIG_PIN_XCLK=11'", "'-D CAMERA_CONFIG_PIN_SCCB_SDA=17'", "'-D CAMERA_CONFIG_PIN_SCCB_SCL=41'", - "'-D CAMERA_CONFIG_PIN_Y9=35'", - "'-D CAMERA_CONFIG_PIN_Y8=34'", - "'-D CAMERA_CONFIG_PIN_Y7=39'", - "'-D CAMERA_CONFIG_PIN_Y6=36'", - "'-D CAMERA_CONFIG_PIN_Y5=19'", - "'-D CAMERA_CONFIG_PIN_Y4=18'", - "'-D CAMERA_CONFIG_PIN_Y3=5'", - "'-D CAMERA_CONFIG_PIN_Y2=4'", - "'-D CAMERA_CONFIG_PIN_VSYNC=25'", - "'-D CAMERA_CONFIG_PIN_HREF=23'", - "'-D CAMERA_CONFIG_PIN_PCLK=22'", + "'-D CAMERA_CONFIG_PIN_Y9=13'", + "'-D CAMERA_CONFIG_PIN_Y8=4'", + "'-D CAMERA_CONFIG_PIN_Y7=10'", + "'-D CAMERA_CONFIG_PIN_Y6=5'", + "'-D CAMERA_CONFIG_PIN_Y5=7'", + "'-D CAMERA_CONFIG_PIN_Y4=16'", + "'-D CAMERA_CONFIG_PIN_Y3=15'", + "'-D CAMERA_CONFIG_PIN_Y2=6'", + "'-D CAMERA_CONFIG_PIN_VSYNC=42'", + "'-D CAMERA_CONFIG_PIN_HREF=18'", + "'-D CAMERA_CONFIG_PIN_PCLK=12'", "'-D CAMERA_CONFIG_CLK_FREQ_HZ=20000000'", "'-D CAMERA_CONFIG_LEDC_TIMER=LEDC_TIMER_0'", "'-D CAMERA_CONFIG_LEDC_CHANNEL=LEDC_CHANNEL_0'", "'-D CAMERA_CONFIG_FB_COUNT=2'", "'-D CAMERA_CONFIG_FB_LOCATION=CAMERA_FB_IN_DRAM'", "'-D SCCB_I2C_PORT=I2C_NUM_0'", - "'-D I2C_MEMS_SDA=48'", - "'-D I2C_MEMS_SCL=47'", + "'-D I2C_MEMS_SDA=17'", + "'-D I2C_MEMS_SCL=41'", "'-D TF_CS=9'", "'-D TF_MOSI=38'", "'-D TF_CLK=39'", diff --git a/boards/esp32cam_s3_wroom_n16r8.json b/boards/esp32cam_s3_wroom_n16r8.json new file mode 100644 index 0000000..2fac77b --- /dev/null +++ b/boards/esp32cam_s3_wroom_n16r8.json @@ -0,0 +1,72 @@ +{ + "build": { + "arduino": { + "ldscript": "esp32s3_out.ld", + "partitions": "default_16MB.csv", + "memory_type": "qio_opi" + }, + "core": "esp32", + "extra_flags": [ + "'-D ARDUINO_ESP32S3_DEV'", + "'-D ARDUINO_USB_MODE=1'", + "'-D BOARD_HAS_PSRAM'", + "'-D ARDUINO_RUNNING_CORE=1'", + "'-D ARDUINO_EVENT_RUNNING_CORE=1'", + "'-D ARDUINO_USB_CDC_ON_BOOT=1'", + "'-D CAMERA_CONFIG_PIN_PWDN=GPIO_NUM_NC'", + "'-D CAMERA_CONFIG_PIN_RESET=GPIO_NUM_NC'", + "'-D CAMERA_CONFIG_PIN_XCLK=15'", + "'-D CAMERA_CONFIG_PIN_SCCB_SDA=4'", + "'-D CAMERA_CONFIG_PIN_SCCB_SCL=5'", + "'-D CAMERA_CONFIG_PIN_Y9=16'", + "'-D CAMERA_CONFIG_PIN_Y8=17'", + "'-D CAMERA_CONFIG_PIN_Y7=18'", + "'-D CAMERA_CONFIG_PIN_Y6=12'", + "'-D CAMERA_CONFIG_PIN_Y5=10'", + "'-D CAMERA_CONFIG_PIN_Y4=8'", + "'-D CAMERA_CONFIG_PIN_Y3=9'", + "'-D CAMERA_CONFIG_PIN_Y2=11'", + "'-D CAMERA_CONFIG_PIN_VSYNC=6'", + "'-D CAMERA_CONFIG_PIN_HREF=7'", + "'-D CAMERA_CONFIG_PIN_PCLK=13'", + "'-D CAMERA_CONFIG_CLK_FREQ_HZ=20000000'", + "'-D CAMERA_CONFIG_LEDC_TIMER=LEDC_TIMER_0'", + "'-D CAMERA_CONFIG_LEDC_CHANNEL=LEDC_CHANNEL_0'", + "'-D CAMERA_CONFIG_FB_COUNT=2'", + "'-D CAMERA_CONFIG_FB_LOCATION=CAMERA_FB_IN_PSRAM'", + "'-D SCCB_I2C_PORT=I2C_NUM_0'" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "dio", + "psram_type": "opi", + "hwids": [ + [ + "0x303A", + "0x1001" + ] + ], + "mcu": "esp32s3", + "variant": "esp32s3" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32s3.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "ESP32 S3 WROOM n16r8", + "upload": { + "flash_size": "16MB", + "maximum_ram_size": 327680, + "maximum_size": 16777216, + "require_upload_port": true, + "speed": 921600 + }, + "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/user-guide-devkitc-1.html", + "vendor": "Espressif" +} diff --git a/boards/m5stack-timer-cam.json b/boards/m5stack-timer-cam.json new file mode 100644 index 0000000..a8cb2d8 --- /dev/null +++ b/boards/m5stack-timer-cam.json @@ -0,0 +1,69 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32_out.ld", + "partitions": "huge_app.csv" + }, + "core": "esp32", + "extra_flags": [ + "'-D ARDUINO_M5Stack_Timer_CAM'", + "'-D BOARD_HAS_PSRAM'", + "'-mfix-esp32-psram-cache-issue'", + "'-mfix-esp32-psram-cache-strategy=memw'", + "'-D USER_LED_GPIO=2'", + "'-D USER_LED_ON_LEVEL=HIGH'", + "'-D CAMERA_CONFIG_PIN_PWDN=GPIO_NUM_NC'", + "'-D CAMERA_CONFIG_PIN_RESET=15'", + "'-D CAMERA_CONFIG_PIN_XCLK=27'", + "'-D CAMERA_CONFIG_PIN_SCCB_SDA=25'", + "'-D CAMERA_CONFIG_PIN_SCCB_SCL=23'", + "'-D CAMERA_CONFIG_PIN_Y9=19'", + "'-D CAMERA_CONFIG_PIN_Y8=36'", + "'-D CAMERA_CONFIG_PIN_Y7=18'", + "'-D CAMERA_CONFIG_PIN_Y6=39'", + "'-D CAMERA_CONFIG_PIN_Y5=5'", + "'-D CAMERA_CONFIG_PIN_Y4=34'", + "'-D CAMERA_CONFIG_PIN_Y3=35'", + "'-D CAMERA_CONFIG_PIN_Y2=32'", + "'-D CAMERA_CONFIG_PIN_VSYNC=22'", + "'-D CAMERA_CONFIG_PIN_HREF=26'", + "'-D CAMERA_CONFIG_PIN_PCLK=21'", + "'-D CAMERA_CONFIG_CLK_FREQ_HZ=20000000'", + "'-D CAMERA_CONFIG_LEDC_TIMER=LEDC_TIMER_0'", + "'-D CAMERA_CONFIG_LEDC_CHANNEL=LEDC_CHANNEL_0'", + "'-D CAMERA_CONFIG_FB_COUNT=2'", + "'-D CAMERA_CONFIG_FB_LOCATION=CAMERA_FB_IN_PSRAM'", + "'-D SCCB_I2C_PORT=I2C_NUM_0'", + "'-D GROVE_SDA=4'", + "'-D GROVE_SCL=13'" + ], + "f_cpu": "240000000L", + "f_flash": "40000000L", + "flash_mode": "dio", + "mcu": "esp32", + "variant": "m5stack_timer_cam" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet", + "can" + ], + "debug": { + "openocd_board": "esp-wroom-32.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "M5Stack Timer CAM", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 115200 + }, + "url": "https://docs.m5stack.com/en/unit/timercam", + "vendor": "M5STACK" +} diff --git a/platformio.ini b/platformio.ini index a1635ba..ec70aff 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,6 +10,7 @@ ############################################################################### [platformio] +#default_envs = esp32cam_s3_wroom_n16r8 #default_envs = esp32cam_ai_thinker #default_envs = esp32cam_espressif_esp_eye #default_envs = esp32cam_espressif_esp32s2_cam_board @@ -20,18 +21,19 @@ #default_envs = esp32cam_m5stack_camera_psram #default_envs = esp32cam_m5stack_camera #default_envs = esp32cam_m5stack_esp32cam - #default_envs = esp32cam_m5stack_unitcam #default_envs = esp32cam_m5stack_unitcams3 #default_envs = esp32cam_m5stack_wide +#default_envs = esp32cam_m5stack_m5poecam_w #default_envs = esp32cam_seeed_xiao_esp32s3_sense #default_envs = esp32cam_ttgo_t_camera #default_envs = esp32cam_ttgo_t_journal [env] -platform = espressif32 +platform = espressif32@6.9.0 framework = arduino +#upload_port = /dev/tty.usbmodem* #upload_protocol = espota #upload_port = 192.168.178.223 #upload_flags = --auth='ESP32CAM-RTSP' @@ -104,6 +106,9 @@ board = esp32cam_m5stack_unitcams3 [env:esp32cam_m5stack_wide] board = esp32cam_m5stack_wide +[env:esp32cam_m5stack_m5poecam_w] +board = esp32cam_m5stack_m5poecam_w + [env:esp32cam_seeed_xiao_esp32s3_sense] board = esp32cam_seeed_xiao_esp32s3_sense @@ -111,4 +116,10 @@ board = esp32cam_seeed_xiao_esp32s3_sense board = esp32cam_ttgo_t_camera [env:esp32cam_ttgo_t_journal] -board = esp32cam_ttgo_t_journal \ No newline at end of file +board = esp32cam_ttgo_t_journal + +[env:m5stack-timer-cam] +board = m5stack-timer-cam + +[env:esp32cam_s3_wroom_n16r8] +board = esp32cam_s3_wroom_n16r8 \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 2d205cd..5086281 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -150,6 +150,20 @@ void handle_root() web_server.send(200, "text/html", html); } +#ifdef FLASH_LED_GPIO +void handle_flash() +{ + log_v("handle_flash"); + // If no value present, use off, otherwise convert v to integer. Depends on analog resolution for max value + auto v = web_server.hasArg("v") ? web_server.arg("v").toInt() : 0; + // If conversion fails, v = 0 + analogWrite(FLASH_LED_GPIO, v); + + web_server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + web_server.send(200); +} +#endif + void handle_snapshot() { log_v("handle_snapshot"); @@ -219,35 +233,35 @@ esp_err_t initialize_camera() auto jpeg_quality = param_jpg_quality.value(); log_i("Frame duration: %d ms", param_frame_duration.value()); const camera_config_t camera_config = { - .pin_pwdn = CAMERA_CONFIG_PIN_PWDN, // GPIO pin for camera power down line - .pin_reset = CAMERA_CONFIG_PIN_RESET, // GPIO pin for camera reset line - .pin_xclk = CAMERA_CONFIG_PIN_XCLK, // GPIO pin for camera XCLK line - .pin_sccb_sda = CAMERA_CONFIG_PIN_SCCB_SDA, // GPIO pin for camera SDA line - .pin_sccb_scl = CAMERA_CONFIG_PIN_SCCB_SCL, // GPIO pin for camera SCL line - .pin_d7 = CAMERA_CONFIG_PIN_Y9, // GPIO pin for camera D7 line - .pin_d6 = CAMERA_CONFIG_PIN_Y8, // GPIO pin for camera D6 line - .pin_d5 = CAMERA_CONFIG_PIN_Y7, // GPIO pin for camera D5 line - .pin_d4 = CAMERA_CONFIG_PIN_Y6, // GPIO pin for camera D4 line - .pin_d3 = CAMERA_CONFIG_PIN_Y5, // GPIO pin for camera D3 line - .pin_d2 = CAMERA_CONFIG_PIN_Y4, // GPIO pin for camera D2 line - .pin_d1 = CAMERA_CONFIG_PIN_Y3, // GPIO pin for camera D1 line - .pin_d0 = CAMERA_CONFIG_PIN_Y2, // GPIO pin for camera D0 line - .pin_vsync = CAMERA_CONFIG_PIN_VSYNC, // GPIO pin for camera VSYNC line - .pin_href = CAMERA_CONFIG_PIN_HREF, // GPIO pin for camera HREF line - .pin_pclk = CAMERA_CONFIG_PIN_PCLK, // GPIO pin for camera PCLK line - .xclk_freq_hz = CAMERA_CONFIG_CLK_FREQ_HZ, // Frequency of XCLK signal, in Hz. EXPERIMENTAL: Set to 16MHz on ESP32-S2 or ESP32-S3 to enable EDMA mode - .ledc_timer = CAMERA_CONFIG_LEDC_TIMER, // LEDC timer to be used for generating XCLK - .ledc_channel = CAMERA_CONFIG_LEDC_CHANNEL, // LEDC channel to be used for generating XCLK - .pixel_format = PIXFORMAT_JPEG, // Format of the pixel data: PIXFORMAT_ + YUV422|GRAYSCALE|RGB565|JPEG - .frame_size = frame_size, // Size of the output image: FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA - .jpeg_quality = jpeg_quality, // Quality of JPEG output. 0-63 lower means higher quality - .fb_count = CAMERA_CONFIG_FB_COUNT, // Number of frame buffers to be allocated. If more than one, then each frame will be acquired (double speed) - .fb_location = CAMERA_CONFIG_FB_LOCATION, // The location where the frame buffer will be allocated - .grab_mode = CAMERA_GRAB_LATEST, // When buffers should be filled + .pin_pwdn = CAMERA_CONFIG_PIN_PWDN, // GPIO pin for camera power down line + .pin_reset = CAMERA_CONFIG_PIN_RESET, // GPIO pin for camera reset line + .pin_xclk = CAMERA_CONFIG_PIN_XCLK, // GPIO pin for camera XCLK line + .pin_sccb_sda = CAMERA_CONFIG_PIN_SCCB_SDA, // GPIO pin for camera SDA line + .pin_sccb_scl = CAMERA_CONFIG_PIN_SCCB_SCL, // GPIO pin for camera SCL line + .pin_d7 = CAMERA_CONFIG_PIN_Y9, // GPIO pin for camera D7 line + .pin_d6 = CAMERA_CONFIG_PIN_Y8, // GPIO pin for camera D6 line + .pin_d5 = CAMERA_CONFIG_PIN_Y7, // GPIO pin for camera D5 line + .pin_d4 = CAMERA_CONFIG_PIN_Y6, // GPIO pin for camera D4 line + .pin_d3 = CAMERA_CONFIG_PIN_Y5, // GPIO pin for camera D3 line + .pin_d2 = CAMERA_CONFIG_PIN_Y4, // GPIO pin for camera D2 line + .pin_d1 = CAMERA_CONFIG_PIN_Y3, // GPIO pin for camera D1 line + .pin_d0 = CAMERA_CONFIG_PIN_Y2, // GPIO pin for camera D0 line + .pin_vsync = CAMERA_CONFIG_PIN_VSYNC, // GPIO pin for camera VSYNC line + .pin_href = CAMERA_CONFIG_PIN_HREF, // GPIO pin for camera HREF line + .pin_pclk = CAMERA_CONFIG_PIN_PCLK, // GPIO pin for camera PCLK line + .xclk_freq_hz = CAMERA_CONFIG_CLK_FREQ_HZ, // Frequency of XCLK signal, in Hz. EXPERIMENTAL: Set to 16MHz on ESP32-S2 or ESP32-S3 to enable EDMA mode + .ledc_timer = CAMERA_CONFIG_LEDC_TIMER, // LEDC timer to be used for generating XCLK + .ledc_channel = CAMERA_CONFIG_LEDC_CHANNEL, // LEDC channel to be used for generating XCLK + .pixel_format = PIXFORMAT_JPEG, // Format of the pixel data: PIXFORMAT_ + YUV422|GRAYSCALE|RGB565|JPEG + .frame_size = frame_size, // Size of the output image: FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA + .jpeg_quality = jpeg_quality, // Quality of JPEG output. 0-63 lower means higher quality + .fb_count = CAMERA_CONFIG_FB_COUNT, // Number of frame buffers to be allocated. If more than one, then each frame will be acquired (double speed) + .fb_location = CAMERA_CONFIG_FB_LOCATION, // The location where the frame buffer will be allocated + .grab_mode = CAMERA_GRAB_LATEST, // When buffers should be filled #if CONFIG_CAMERA_CONVERTER_ENABLED - conv_mode = CONV_DISABLE, // RGB<->YUV Conversion mode + conv_mode = CONV_DISABLE, // RGB<->YUV Conversion mode #endif - .sccb_i2c_port = SCCB_I2C_PORT // If pin_sccb_sda is -1, use the already configured I2C bus by number + .sccb_i2c_port = SCCB_I2C_PORT // If pin_sccb_sda is -1, use the already configured I2C bus by number }; return cam.init(camera_config); @@ -316,6 +330,8 @@ void setup() // Disable brownout WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); + Serial.begin(115200); + Serial.setDebugOutput(true); #ifdef CAMERA_POWER_GPIO pinMode(CAMERA_POWER_GPIO, OUTPUT); digitalWrite(CAMERA_POWER_GPIO, CAMERA_POWER_ON_LEVEL); @@ -326,8 +342,13 @@ void setup() digitalWrite(USER_LED_GPIO, !USER_LED_ON_LEVEL); #endif - Serial.begin(115200); - Serial.setDebugOutput(true); +#ifdef FLASH_LED_GPIO + pinMode(FLASH_LED_GPIO, OUTPUT); + // Set resolution to 8 bits + analogWriteResolution(8); + // Turn flash led off + analogWrite(FLASH_LED_GPIO, 0); +#endif #ifdef ARDUINO_USB_CDC_ON_BOOT // Delay for USB to connect/settle @@ -402,7 +423,10 @@ void setup() web_server.on("/snapshot", HTTP_GET, handle_snapshot); // Camera stream web_server.on("/stream", HTTP_GET, handle_stream); - +#ifdef FLASH_LED_GPIO + // Flash led + web_server.on("/flash", HTTP_GET, handle_flash); +#endif web_server.onNotFound([]() { iotWebConf.handleNotFound(); }); }