@@ -150,6 +150,20 @@ void handle_root()
150150 web_server.send (200 , " text/html" , html);
151151}
152152
153+ #ifdef FLASH_LED_GPIO
154+ void handle_flash ()
155+ {
156+ log_v (" handle_flash" );
157+ // If no value present, use off, otherwise convert v to integer. Depends on analog resolution for max value
158+ auto v = web_server.hasArg (" v" ) ? web_server.arg (" v" ).toInt () : 0 ;
159+ // If conversion fails, v = 0
160+ analogWrite (FLASH_LED_GPIO, v);
161+
162+ web_server.sendHeader (" Cache-Control" , " no-cache, no-store, must-revalidate" );
163+ web_server.send (200 );
164+ }
165+ #endif
166+
153167void handle_snapshot ()
154168{
155169 log_v (" handle_snapshot" );
@@ -219,35 +233,35 @@ esp_err_t initialize_camera()
219233 auto jpeg_quality = param_jpg_quality.value ();
220234 log_i (" Frame duration: %d ms" , param_frame_duration.value ());
221235 const camera_config_t camera_config = {
222- .pin_pwdn = CAMERA_CONFIG_PIN_PWDN, // GPIO pin for camera power down line
223- .pin_reset = CAMERA_CONFIG_PIN_RESET, // GPIO pin for camera reset line
224- .pin_xclk = CAMERA_CONFIG_PIN_XCLK, // GPIO pin for camera XCLK line
225- .pin_sccb_sda = CAMERA_CONFIG_PIN_SCCB_SDA, // GPIO pin for camera SDA line
226- .pin_sccb_scl = CAMERA_CONFIG_PIN_SCCB_SCL, // GPIO pin for camera SCL line
227- .pin_d7 = CAMERA_CONFIG_PIN_Y9, // GPIO pin for camera D7 line
228- .pin_d6 = CAMERA_CONFIG_PIN_Y8, // GPIO pin for camera D6 line
229- .pin_d5 = CAMERA_CONFIG_PIN_Y7, // GPIO pin for camera D5 line
230- .pin_d4 = CAMERA_CONFIG_PIN_Y6, // GPIO pin for camera D4 line
231- .pin_d3 = CAMERA_CONFIG_PIN_Y5, // GPIO pin for camera D3 line
232- .pin_d2 = CAMERA_CONFIG_PIN_Y4, // GPIO pin for camera D2 line
233- .pin_d1 = CAMERA_CONFIG_PIN_Y3, // GPIO pin for camera D1 line
234- .pin_d0 = CAMERA_CONFIG_PIN_Y2, // GPIO pin for camera D0 line
235- .pin_vsync = CAMERA_CONFIG_PIN_VSYNC, // GPIO pin for camera VSYNC line
236- .pin_href = CAMERA_CONFIG_PIN_HREF, // GPIO pin for camera HREF line
237- .pin_pclk = CAMERA_CONFIG_PIN_PCLK, // GPIO pin for camera PCLK line
238- .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
239- .ledc_timer = CAMERA_CONFIG_LEDC_TIMER, // LEDC timer to be used for generating XCLK
240- .ledc_channel = CAMERA_CONFIG_LEDC_CHANNEL, // LEDC channel to be used for generating XCLK
241- .pixel_format = PIXFORMAT_JPEG, // Format of the pixel data: PIXFORMAT_ + YUV422|GRAYSCALE|RGB565|JPEG
242- .frame_size = frame_size, // Size of the output image: FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
243- .jpeg_quality = jpeg_quality, // Quality of JPEG output. 0-63 lower means higher quality
244- .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)
245- .fb_location = CAMERA_CONFIG_FB_LOCATION, // The location where the frame buffer will be allocated
246- .grab_mode = CAMERA_GRAB_LATEST, // When buffers should be filled
236+ .pin_pwdn = CAMERA_CONFIG_PIN_PWDN, // GPIO pin for camera power down line
237+ .pin_reset = CAMERA_CONFIG_PIN_RESET, // GPIO pin for camera reset line
238+ .pin_xclk = CAMERA_CONFIG_PIN_XCLK, // GPIO pin for camera XCLK line
239+ .pin_sccb_sda = CAMERA_CONFIG_PIN_SCCB_SDA, // GPIO pin for camera SDA line
240+ .pin_sccb_scl = CAMERA_CONFIG_PIN_SCCB_SCL, // GPIO pin for camera SCL line
241+ .pin_d7 = CAMERA_CONFIG_PIN_Y9, // GPIO pin for camera D7 line
242+ .pin_d6 = CAMERA_CONFIG_PIN_Y8, // GPIO pin for camera D6 line
243+ .pin_d5 = CAMERA_CONFIG_PIN_Y7, // GPIO pin for camera D5 line
244+ .pin_d4 = CAMERA_CONFIG_PIN_Y6, // GPIO pin for camera D4 line
245+ .pin_d3 = CAMERA_CONFIG_PIN_Y5, // GPIO pin for camera D3 line
246+ .pin_d2 = CAMERA_CONFIG_PIN_Y4, // GPIO pin for camera D2 line
247+ .pin_d1 = CAMERA_CONFIG_PIN_Y3, // GPIO pin for camera D1 line
248+ .pin_d0 = CAMERA_CONFIG_PIN_Y2, // GPIO pin for camera D0 line
249+ .pin_vsync = CAMERA_CONFIG_PIN_VSYNC, // GPIO pin for camera VSYNC line
250+ .pin_href = CAMERA_CONFIG_PIN_HREF, // GPIO pin for camera HREF line
251+ .pin_pclk = CAMERA_CONFIG_PIN_PCLK, // GPIO pin for camera PCLK line
252+ .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
253+ .ledc_timer = CAMERA_CONFIG_LEDC_TIMER, // LEDC timer to be used for generating XCLK
254+ .ledc_channel = CAMERA_CONFIG_LEDC_CHANNEL, // LEDC channel to be used for generating XCLK
255+ .pixel_format = PIXFORMAT_JPEG, // Format of the pixel data: PIXFORMAT_ + YUV422|GRAYSCALE|RGB565|JPEG
256+ .frame_size = frame_size, // Size of the output image: FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
257+ .jpeg_quality = jpeg_quality, // Quality of JPEG output. 0-63 lower means higher quality
258+ .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)
259+ .fb_location = CAMERA_CONFIG_FB_LOCATION, // The location where the frame buffer will be allocated
260+ .grab_mode = CAMERA_GRAB_LATEST, // When buffers should be filled
247261#if CONFIG_CAMERA_CONVERTER_ENABLED
248- conv_mode = CONV_DISABLE, // RGB<->YUV Conversion mode
262+ conv_mode = CONV_DISABLE, // RGB<->YUV Conversion mode
249263#endif
250- .sccb_i2c_port = SCCB_I2C_PORT // If pin_sccb_sda is -1, use the already configured I2C bus by number
264+ .sccb_i2c_port = SCCB_I2C_PORT // If pin_sccb_sda is -1, use the already configured I2C bus by number
251265 };
252266
253267 return cam.init (camera_config);
@@ -316,13 +330,21 @@ void setup()
316330 // Disable brownout
317331 WRITE_PERI_REG (RTC_CNTL_BROWN_OUT_REG, 0 );
318332
333+ Serial.begin (115200 );
334+ Serial.setDebugOutput (true );
335+
319336#ifdef USER_LED_GPIO
320337 pinMode (USER_LED_GPIO, OUTPUT);
321338 digitalWrite (USER_LED_GPIO, !USER_LED_ON_LEVEL);
322339#endif
323340
324- Serial.begin (115200 );
325- Serial.setDebugOutput (true );
341+ #ifdef FLASH_LED_GPIO
342+ pinMode (FLASH_LED_GPIO, OUTPUT);
343+ // Set resolution to 8 bits
344+ analogWriteResolution (8 );
345+ // Turn flash led off
346+ analogWrite (FLASH_LED_GPIO, 0 );
347+ #endif
326348
327349#ifdef ARDUINO_USB_CDC_ON_BOOT
328350 // Delay for USB to connect/settle
@@ -397,7 +419,10 @@ void setup()
397419 web_server.on (" /snapshot" , HTTP_GET, handle_snapshot);
398420 // Camera stream
399421 web_server.on (" /stream" , HTTP_GET, handle_stream);
400-
422+ #ifdef FLASH_LED_GPIO
423+ // Flash led
424+ web_server.on (" /flash" , HTTP_GET, handle_flash);
425+ #endif
401426 web_server.onNotFound ([]()
402427 { iotWebConf.handleNotFound (); });
403428}
0 commit comments