Develop (#108)
* Added seeed_xiao_esp32s3 * Fixed typo * Updating build system * Fixed typos * Renamed envirnment name to seeed_xiao_esp32s3 * Update README.md * Updated platformio definitions * Added cache * Updated README.md * - Default value for initResult if initialzation fails * constexpr camera_config_t m5stack_camera_settings * Added M5Stack UnitCamS3 * Work in progress * WIP * Work in progress * Removed OTA * Added unitcams3 * UnitcamS3 * Corrected HTML for ipv4 fixed Sewrial issue esp32s2 * USER_LED_ON_LEVEL=LOW * Added documentation pins for Mems/grove/led * Typo * Removed non required depencency * Removed non required depencency * Readded
21
.github/workflows/main.yml
vendored
@@ -5,18 +5,25 @@ jobs:
|
|||||||
name: Build
|
name: Build
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: Set up python
|
|
||||||
uses: actions/setup-python@v3
|
|
||||||
with:
|
with:
|
||||||
python-version: '3.x'
|
submodules: 'true'
|
||||||
architecture: 'x64'
|
- uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.cache/pip
|
||||||
|
~/.platformio/.cache
|
||||||
|
key: ${{ runner.os }}-pio
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: '3.9'
|
||||||
- name: Install PlatformIO
|
- name: Install PlatformIO
|
||||||
run: python -m pip install platformio
|
run: python -m pip install platformio
|
||||||
- name: Build firmware
|
- name: Build firmware
|
||||||
run: platformio run
|
run: platformio run
|
||||||
- name: Archive
|
- name: Archive
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: firmware.bin
|
name: firmwares.zip
|
||||||
path: .pio/build/*/firmware.bin
|
path: .pio/build/*/firmware.bin
|
||||||
|
|||||||
108
README.md
@@ -9,34 +9,43 @@ Simple [RTSP](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol), [HTTP
|
|||||||
> This branch supports all the current devices and the Seeed Studio Xiao esp32s3!
|
> This branch supports all the current devices and the Seeed Studio Xiao esp32s3!
|
||||||
> Please use this and let me know if this works for you!
|
> Please use this and let me know if this works for you!
|
||||||
|
|
||||||
|
|
||||||
Flashing this software on a ESP32CAM module will make it a **RTSP streaming camera** server, a **HTTP Motion JPEG streamer** and a **HTTP image server**.
|
Flashing this software on a ESP32CAM module will make it a **RTSP streaming camera** server, a **HTTP Motion JPEG streamer** and a **HTTP image server**.
|
||||||
|
|
||||||
Supported protocols
|
Supported protocols
|
||||||
|
|
||||||
- :white_check_mark: RTSP
|
- RTSP
|
||||||
The RTSP protocol is an industry standard and allows many CCTV systems and applications (like for example [VLC](https://www.videolan.org/vlc/)) to connect directly to the ESP32CAM camera stream.
|
The RTSP protocol is an industry standard and allows many CCTV systems and applications (like for example [VLC](https://www.videolan.org/vlc/)) to connect directly to the ESP32CAM camera stream.
|
||||||
It is also possible to stream directly to a server using [ffmpeg](https://ffmpeg.org).
|
It is also possible to stream directly to a server using [ffmpeg](https://ffmpeg.org).
|
||||||
This makes the module a camera server allowing recording and the stream can be stored on a disk and replayed later.
|
This makes the module a camera server allowing recording and the stream can be stored on a disk and replayed later.
|
||||||
The URL is rtsp://<ip address>:554/mjpeg/1
|
The URL is rtsp://<ip address>:554/mjpeg/1
|
||||||
|
|
||||||
- :white_check_mark: HTTP Motion JPEG
|
- HTTP Motion JPEG
|
||||||
The HTTP JPEG streamer makes it possible to watch the camera stream directly in your browser.
|
The HTTP JPEG streamer makes it possible to watch the camera stream directly in your browser.
|
||||||
The URL is http://<ip address>/stream
|
The URL is http://<ip address>/stream
|
||||||
|
|
||||||
- :white_check_mark: HTTP image
|
- HTTP image
|
||||||
The HTTP Image returns an HTTP JPEG image of the camera.
|
The HTTP Image returns an HTTP JPEG image of the camera.
|
||||||
The URL is http://<ip address>/snapshot
|
The URL is http://<ip address>/snapshot
|
||||||
|
|
||||||
This software supports the following ESP32-CAM (and alike) modules:
|
This software supports the following ESP32-CAM (and alike) modules:
|
||||||
|
|
||||||
- ESP32CAM
|
|
||||||
- AI THINKER
|
- AI THINKER
|
||||||
- TTGO T-CAM
|
- EspressIf ESP-EYE
|
||||||
- WROVER-KIT
|
- EspressIf ESP32S2-CAM
|
||||||
|
- EspressIf ESP32S3-CAM-LCD
|
||||||
|
- EspressIf ESP32S3-EYE
|
||||||
|
- Freenove WROVER KIT
|
||||||
|
- M5STACK ESP32CAM
|
||||||
|
- M5STACK_PSRAM
|
||||||
|
- M5STACK_UNITCAM
|
||||||
|
- M5STACK_UNITCAMS3
|
||||||
|
- M5STACK_V2_PSRAM
|
||||||
|
- M5STACK_PSRAM
|
||||||
|
- M5STACK_WIDE
|
||||||
- M5STACK
|
- M5STACK
|
||||||
|
- Seeed Studio XIAO ESP32S3 SENSE
|
||||||

|
- TTGO T-CAMERA
|
||||||
|
- TTGO T-JOURNAL
|
||||||
|
|
||||||
The software provides a **configuration web server**, that can be used to:
|
The software provides a **configuration web server**, that can be used to:
|
||||||
|
|
||||||
@@ -44,7 +53,6 @@ The software provides a **configuration web server**, that can be used to:
|
|||||||
- Set the WiFi parameters,
|
- Set the WiFi parameters,
|
||||||
- Set the timeout for connecting to the access point,
|
- Set the timeout for connecting to the access point,
|
||||||
- Set an access password,
|
- Set an access password,
|
||||||
- Select the board type,
|
|
||||||
- Select the image size,
|
- Select the image size,
|
||||||
- Select the frame rate,
|
- Select the frame rate,
|
||||||
- Select the JPEG quality
|
- Select the JPEG quality
|
||||||
@@ -54,7 +62,7 @@ The software provides a **configuration web server**, that can be used to:
|
|||||||
- Brightness
|
- Brightness
|
||||||
- Contrast
|
- Contrast
|
||||||
- Saturation
|
- Saturation
|
||||||
- Special effect (Normal, Negative, Grayscale, Red/Green/Blue tint, Sepia)
|
- Special effect (Normal, Negative, Gray-scale, Red/Green/Blue tint, Sepia)
|
||||||
- White balance
|
- White balance
|
||||||
- Automatic White Balance gain
|
- Automatic White Balance gain
|
||||||
- Wite Balance mode
|
- Wite Balance mode
|
||||||
@@ -83,25 +91,34 @@ It advertises HTTP (port 80) and RTSP (port 554)
|
|||||||
- USB to Serial (TTL level) converter, piggyback board ESP32-CAM-MB or other way to connect to the device,
|
- USB to Serial (TTL level) converter, piggyback board ESP32-CAM-MB or other way to connect to the device,
|
||||||
- [**PlatformIO**](https://platformio.org/) software (free download)
|
- [**PlatformIO**](https://platformio.org/) software (free download)
|
||||||
|
|
||||||
|
## Boards
|
||||||
|
|
||||||
|
There are a lot of boards available that are all called ESP32-CAM.
|
||||||
|
However, there are differences in CPU (type/speed/cores), how the camera is connected, presence of PSRAM or not...
|
||||||
|
To select the right board use the table below and use the configuration that is listed below for your board:
|
||||||
|
|
||||||
|
| Board | Image | CPU | SRAM | Flash | PSRAM | Camera | | Site |
|
||||||
|
|--- |--- |--- |--- |--- | --- |--- |--- |--- |
|
||||||
|
| Espressif ESP32-Wrover CAM |  | ESP32 | 520KB | 4Mb | 4MB | OV2640 | | |
|
||||||
|
| AI-Thinker ESP32-CAM |   | ESP32-S | 520KB | 4Mb | 4MB | OV2640 | | https://docs.ai-thinker.com/esp32-cam |
|
||||||
|
| Espressif ESP-EYE |  | ESP32 | 520KB | 4Mb | 4MB | OV2640 | | |
|
||||||
|
| Espressif ESP-S3-EYE |  | ESP32-S3 | 520KB | 4Mb | 4MB | OV2640 | | https://www.espressif.com/en/products/devkits/esp-eye/overview |
|
||||||
|
| LilyGo camera module |  | ESP32 Wrover | 520KB | 4Mb | 4MB | OV2640 / OV5640 | | |
|
||||||
|
| LilyGo Simcam |  | | | | | OV2640 | | |
|
||||||
|
| LilyGo TTGO-T Camera |  | | | | | OV2640 | | |
|
||||||
|
| M5Stack ESP32CAM |  | ESP32 | 520Kb | 4Mb | - | OV2640 | Microphone | https://docs.m5stack.com/en/unit/esp32cam |
|
||||||
|
| M5Stack UnitCam |   | ESP32-WROOM-32E | 520KB | 4Mb | - | OV2640 | | https://docs.m5stack.com/en/unit/unit_cam |
|
||||||
|
| M5Stack Camera |  | ESP32 | 520Kb | 4Mb | - | OV2640 | | https://docs.m5stack.com/en/unit/m5camera |
|
||||||
|
| M5Stack Camera PSRAM |  | ESP32 | 520Kb | 4Mb | 4Mb | OV2640 | | https://docs.m5stack.com/en/unit/m5camera |
|
||||||
|
| M5Stack UnitCamS3 |   | ESP32-S3-WROOM-1-N16R8 | 520Kb | 16Mb | 8Mb | OV2640 | | https://docs.m5stack.com/en/unit/Unit-CamS3 |
|
||||||
|
| Seeed studio Xiao ESP32S3 Sense |  | ESP32-S3R8 | 520KB | 8Mb | 8MB | OV2640 | Microphone | https://www.seeedstudio.com/XIAO-ESP32S3-Sense-p-5639.html |
|
||||||
|
|
||||||
## Installing and running PlatformIO
|
## Installing and running PlatformIO
|
||||||
|
|
||||||
PlatformIO is available for all major operating systems: Windows, Linux and MacOS. It is also provided as a plugin to [Visual Studio Code](https://visualstudio.microsoft.com).
|
PlatformIO is available for all major operating systems: Windows, Linux and MacOS. It is also provided as a plugin to [Visual Studio Code](https://visualstudio.microsoft.com).
|
||||||
More information can be found at: [https://docs.platformio.org/en/latest/installation.html](https://docs.platformio.org/en/latest/installation.html) below the basics.
|
More information can be found at: [https://docs.platformio.org/en/latest/installation.html](https://docs.platformio.org/en/latest/installation.html) below the basics.
|
||||||
|
|
||||||
### Debian based systems command-line install
|
Install [Visual Studio Code](https://code.visualstudio.com) and install the PlatformIO plugin.
|
||||||
|
|
||||||
Install platformIO
|
|
||||||
|
|
||||||
```sh
|
|
||||||
sudo apt-get install python-pip
|
|
||||||
sudo pip install platformio
|
|
||||||
pio upgrade
|
|
||||||
```
|
|
||||||
|
|
||||||
### Windows, Linux and MacOS
|
|
||||||
|
|
||||||
Install [**Visual Studio code**](https://code.visualstudio.com) and install the PlatformIO plugin.
|
|
||||||
For command line usage Python and PlatformIO-Core is sufficient.
|
|
||||||
|
|
||||||
## Putting the ESP32-CAM in download mode
|
## Putting the ESP32-CAM in download mode
|
||||||
|
|
||||||
@@ -135,7 +152,6 @@ cd esp32cam-rtsp
|
|||||||
|
|
||||||
Next, the firmware has to be build and deployed to the ESP32.
|
Next, the firmware has to be build and deployed to the ESP32.
|
||||||
There are to flavours to do this; using the command line or the graphical interface of Visual Studio Code.
|
There are to flavours to do this; using the command line or the graphical interface of Visual Studio Code.
|
||||||
I recommend to use VIsual Studio Code as it is free to use and offers more insight.
|
|
||||||
|
|
||||||
### Using the command line
|
### Using the command line
|
||||||
|
|
||||||
@@ -240,16 +256,8 @@ Calling this URL will start the form for configuring the device in the browser.
|
|||||||
### GET: /snapshot
|
### GET: /snapshot
|
||||||
|
|
||||||
Calling this URL will return a JPEG snapshot of the camera in the browser.
|
Calling this URL will return a JPEG snapshot of the camera in the browser.
|
||||||
|
|
||||||
This request can also be used (for example using cURL) to save the snapshot to a file.
|
This request can also be used (for example using cURL) to save the snapshot to a file.
|
||||||
|
|
||||||
### GET: /flash?v={intensity}
|
|
||||||
|
|
||||||
Calling this URL will set the intensity of the flash LED. Authentication is required.
|
|
||||||
|
|
||||||
The parameter v for the intensity must be between 0 (off) and 255 (max).
|
|
||||||
If no v parameter is present, it will be set to the value of the flash LED intensity from configuration.
|
|
||||||
|
|
||||||
## Issues / Nice to know
|
## Issues / Nice to know
|
||||||
|
|
||||||
- The red LED on the back of the device indicates the device is not connected.
|
- The red LED on the back of the device indicates the device is not connected.
|
||||||
@@ -284,14 +292,22 @@ The availability of PSRAM can be seen in the HTML status overview.
|
|||||||
|
|
||||||
Not all the boards are equipped with PSRAM:
|
Not all the boards are equipped with PSRAM:
|
||||||
|
|
||||||
| Board | PSRAM |
|
| Board | PSRAM |
|
||||||
|--- |--- |
|
|--- |--- |
|
||||||
| ESP32CAM | Yes |
|
| WROVER_KIT | 8Mb |
|
||||||
| ESP32CAM (USB-C) | No |
|
| ESP_EYE | 8Mb |
|
||||||
| AI THINKER | Yes |
|
| ESP32S3_EYE | 8Mb |
|
||||||
| TTGO T-CAM | No |
|
| M5STACK_PSRAM | 8Mb |
|
||||||
| M5 STACK| | No |
|
| M5STACK_V2_PSRAM | Version B only |
|
||||||
| WROVER KIT | Yes |
|
| 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 | ? |
|
||||||
|
|
||||||
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.
|
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/).
|
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/).
|
||||||
@@ -323,6 +339,14 @@ esp32cam-rtsp depends on PlatformIO, Bootstrap 5 and Micro-RTSP by Kevin Hester.
|
|||||||
|
|
||||||
## Change history
|
## Change history
|
||||||
|
|
||||||
|
- January 2024
|
||||||
|
- Moved settings to board definitions
|
||||||
|
- Added new boards
|
||||||
|
- Removed OTA to increase performance
|
||||||
|
- Oktober 2023
|
||||||
|
- Added support for Seeed Xiao esp32s3
|
||||||
|
- New build system
|
||||||
|
- Updated documentation
|
||||||
- March 2023
|
- March 2023
|
||||||
- Added options to set PSRAM / Frame buffers
|
- Added options to set PSRAM / Frame buffers
|
||||||
- Added JPEG Motion streaming
|
- Added JPEG Motion streaming
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 152 KiB |
BIN
assets/boards/ai-thinker-esp32-cam-ipex.jpg
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
assets/boards/ai-thinker-esp32-cam-mb.jpg
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
assets/boards/ai-thinker-esp32-cam.jpg
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
assets/boards/ai_thinker_esp32-cam.jpg
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
assets/boards/datasheets/ov2640_ds_1.8_.pdf
Normal file
BIN
assets/boards/esp-lyrap-cam-v1.0-3d.png
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
assets/boards/esp32-wrover-cam.jpg
Normal file
|
After Width: | Height: | Size: 151 KiB |
BIN
assets/boards/espressif-esp-eye.jpg
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
assets/boards/espressif-esps3-eye.jpg
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
assets/boards/lilygo-camera-module.jpg
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
assets/boards/lilygo-simcam.jpg
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
assets/boards/lilygo-ttgo-t-camera.jpg
Normal file
|
After Width: | Height: | Size: 141 KiB |
BIN
assets/boards/m5stack-esp32-camera.jpg
Normal file
|
After Width: | Height: | Size: 180 KiB |
BIN
assets/boards/m5stack_Unitcams3.webp
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
assets/boards/m5stack_Unitcams32.webp
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
assets/boards/m5stack_Unitcams33webp.webp
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
assets/boards/m5stack_esp32cam_02.webp
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
assets/boards/m5stack_unit_cam_02.webp
Normal file
|
After Width: | Height: | Size: 79 KiB |
BIN
assets/boards/m5stack_unit_cam_03.webp
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
assets/boards/schematics/ESP-LyraP-CAM_V1.1_SCH_20200511A.pdf
Normal file
BIN
assets/boards/schematics/UnitCamS3.png
Normal file
|
After Width: | Height: | Size: 432 KiB |
BIN
assets/boards/schematics/XIAO_ESP32S3_ExpBoard_v1.0_SCH.pdf
Normal file
BIN
assets/boards/schematics/ai_thinker_esp32cam.pdf
Normal file
BIN
assets/boards/schematics/m5stack_unit_cam_sch_01.webp
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
assets/boards/seeed-studio-xiao-esp32s3-sense.jpg
Normal file
|
After Width: | Height: | Size: 156 KiB |
65
boards/esp32cam_ai_thinker.json
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino":{
|
||||||
|
"ldscript": "esp32_out.ld",
|
||||||
|
"partitions": "huge_app.csv"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_AI_THINKER'",
|
||||||
|
"'-D BOARD_HAS_PSRAM'",
|
||||||
|
"'-mfix-esp32-psram-cache-issue'",
|
||||||
|
"'-D USER_LED_GPIO=33'",
|
||||||
|
"'-D USER_LED_ON_LEVEL=LOW'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PWDN=32'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_RESET=GPIO_NUM_NC'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_XCLK=0'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_SCCB_SDA=26'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_SCCB_SCL=27'",
|
||||||
|
"'-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=21'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y4=19'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y3=18'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y2=5'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_VSYNC=25'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_HREF=23'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PCLK=22'",
|
||||||
|
"'-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'"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "40000000L",
|
||||||
|
"flash_mode": "dio",
|
||||||
|
"mcu": "esp32",
|
||||||
|
"variant": "esp32"
|
||||||
|
},
|
||||||
|
"connectivity": [
|
||||||
|
"wifi",
|
||||||
|
"bluetooth",
|
||||||
|
"ethernet",
|
||||||
|
"can"
|
||||||
|
],
|
||||||
|
"debug": {
|
||||||
|
"openocd_board": "esp-wroom-32.cfg"
|
||||||
|
},
|
||||||
|
"frameworks": [
|
||||||
|
"arduino",
|
||||||
|
"espidf"
|
||||||
|
],
|
||||||
|
"name": "ESP32CAM AI Thinker",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://docs.ai-thinker.com/esp32-cam",
|
||||||
|
"vendor": "Anxinke"
|
||||||
|
}
|
||||||
61
boards/esp32cam_espressif_esp32s2_cam_board.json
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino":{
|
||||||
|
"ldscript": "esp32s2_out.ld"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_ESPRESSIF_ESP32S2_CAM_BOARD'",
|
||||||
|
"'-D BOARD_HAS_PSRAM'",
|
||||||
|
"'-D ARDUINO_USB_MODE=0'",
|
||||||
|
"'-D ARDUINO_USB_CDC_ON_BOOT=1'",
|
||||||
|
"'-D ARDUINO_RUNNING_CORE=1'",
|
||||||
|
"'-D ARDUINO_EVENT_RUNNING_CORE=1'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PWDN=1'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_RESET=2'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_XCLK=42'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_SCCB_SDA=41'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_SCCB_SCL=18'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y9=16'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y8=39'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y7=40'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y6=15'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y5=12'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y4=5'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y3=13'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y2=14'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_VSYNC=38'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_HREF=4'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PCLK=3'",
|
||||||
|
"'-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'" ],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "80000000L",
|
||||||
|
"flash_mode": "qio",
|
||||||
|
"mcu": "esp32s2",
|
||||||
|
"variant": "esp32s2"
|
||||||
|
},
|
||||||
|
"connectivity": [
|
||||||
|
"wifi"
|
||||||
|
],
|
||||||
|
"debug": {
|
||||||
|
"openocd_target": "esp32s2.cfg"
|
||||||
|
},
|
||||||
|
"frameworks": [
|
||||||
|
"arduino",
|
||||||
|
"espidf"
|
||||||
|
],
|
||||||
|
"name": "Espressif ESP32-S2-Saola-1",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/hw-reference/esp32s2/user-guide-esp-lyrap-cam-v1.1.html",
|
||||||
|
"vendor": "Espressif"
|
||||||
|
}
|
||||||
61
boards/esp32cam_espressif_esp32s2_cam_header.json
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino":{
|
||||||
|
"ldscript": "esp32s2_out.ld"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_ESPRESSIF_ESP32S2_CAM_BOARD'",
|
||||||
|
"'-D BOARD_HAS_PSRAM'",
|
||||||
|
"'-D ARDUINO_USB_MODE=0'",
|
||||||
|
"'-D ARDUINO_USB_CDC_ON_BOOT=1'",
|
||||||
|
"'-D ARDUINO_RUNNING_CORE=1'",
|
||||||
|
"'-D ARDUINO_EVENT_RUNNING_CORE=1'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PWDN=1'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_RESET=2'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_XCLK=42'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_SCCB_SDA=41'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_SCCB_SCL=18'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y9=16'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y8=39'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y7=40'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y6=15'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y5=13'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y4=5'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y3=12'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y2=14'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_VSYNC=38'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_HREF=4'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PCLK=3'",
|
||||||
|
"'-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'" ],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "80000000L",
|
||||||
|
"flash_mode": "qio",
|
||||||
|
"mcu": "esp32s2",
|
||||||
|
"variant": "esp32s2"
|
||||||
|
},
|
||||||
|
"connectivity": [
|
||||||
|
"wifi"
|
||||||
|
],
|
||||||
|
"debug": {
|
||||||
|
"openocd_target": "esp32s2.cfg"
|
||||||
|
},
|
||||||
|
"frameworks": [
|
||||||
|
"arduino",
|
||||||
|
"espidf"
|
||||||
|
],
|
||||||
|
"name": "Espressif ESP32-S2-Saola-1",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/hw-reference/esp32s2/user-guide-esp-lyrap-cam-v1.1.html",
|
||||||
|
"vendor": "Espressif"
|
||||||
|
}
|
||||||
71
boards/esp32cam_espressif_esp32s3_cam_lcd.json
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino": {
|
||||||
|
"ldscript": "esp32s3_out.ld",
|
||||||
|
"partitions": "default_8MB.csv",
|
||||||
|
"memory_type": "opi_opi"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_ESP32S3_CAM_LCD'",
|
||||||
|
"'-D BOARD_HAS_PSRAM'",
|
||||||
|
"'-D ARDUINO_USB_MODE=1'",
|
||||||
|
"'-D ARDUINO_USB_CDC_ON_BOOT=1'",
|
||||||
|
"'-D ARDUINO_RUNNING_CORE=1'",
|
||||||
|
"'-D ARDUINO_EVENT_RUNNING_CORE=1'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PWDN=GPIO_NUM_NC'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_RESET=GPIO_NUM_NC'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_XCLK=40'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_SCCB_SDA=17'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_SCCB_SCL=18'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y9=39'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y8=41'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y7=42'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y6=12'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y5=3'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y4=14'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y3=47'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y2=13'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_VSYNC=21'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_HREF=38'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PCLK=11'",
|
||||||
|
"'-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'"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "80000000L",
|
||||||
|
"flash_mode": "dout",
|
||||||
|
"hwids": [
|
||||||
|
[
|
||||||
|
"0X303A",
|
||||||
|
"0x1001"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"mcu": "esp32s3",
|
||||||
|
"variant": "esp32s3camlcd"
|
||||||
|
},
|
||||||
|
"connectivity": [
|
||||||
|
"bluetooth",
|
||||||
|
"wifi"
|
||||||
|
],
|
||||||
|
"debug": {
|
||||||
|
"openocd_target": "esp32s3.cfg"
|
||||||
|
},
|
||||||
|
"frameworks": [
|
||||||
|
"arduino",
|
||||||
|
"espidf"
|
||||||
|
],
|
||||||
|
"name": "ESP32S3-CAM LCD",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "8MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 8388608,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://www.espressif.com/en/news/Maple_Eye_ESP32-S3",
|
||||||
|
"vendor": "Espressif"
|
||||||
|
}
|
||||||
75
boards/esp32cam_espressif_esp32s3_eye.json
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino": {
|
||||||
|
"ldscript": "esp32s3_out.ld",
|
||||||
|
"partitions": "default_8MB.csv",
|
||||||
|
"memory_type": "qio_opi"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_ESPRESSIF_ESP32S3_EYE'",
|
||||||
|
"'-D BOARD_HAS_PSRAM'",
|
||||||
|
"'-D ARDUINO_USB_MODE=1'",
|
||||||
|
"'-D ARDUINO_USB_CDC_ON_BOOT=1'",
|
||||||
|
"'-D ARDUINO_RUNNING_CORE=1'",
|
||||||
|
"'-D ARDUINO_EVENT_RUNNING_CORE=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'"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "80000000L",
|
||||||
|
"flash_mode": "qio",
|
||||||
|
"hwids": [
|
||||||
|
[
|
||||||
|
"0x2886",
|
||||||
|
"0x0056"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"0x2886",
|
||||||
|
"0x8056"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"mcu": "esp32s3",
|
||||||
|
"variant": "esp32s3"
|
||||||
|
},
|
||||||
|
"connectivity": [
|
||||||
|
"bluetooth",
|
||||||
|
"wifi"
|
||||||
|
],
|
||||||
|
"debug": {
|
||||||
|
"openocd_target": "esp32s3.cfg"
|
||||||
|
},
|
||||||
|
"frameworks": [
|
||||||
|
"arduino",
|
||||||
|
"espidf"
|
||||||
|
],
|
||||||
|
"name": "ESP32S3_EYE",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "8MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 8388608,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://www.espressif.com/en/products/devkits/esp-eye/overview",
|
||||||
|
"vendor": "Espressif"
|
||||||
|
}
|
||||||
65
boards/esp32cam_espressif_esp_eye.json
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino":{
|
||||||
|
"ldscript": "esp32_out.ld",
|
||||||
|
"partitions": "huge_app.csv"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_ESPRESSIF_ESP_EYE'",
|
||||||
|
"'-D BOARD_HAS_PSRAM'",
|
||||||
|
"'-mfix-esp32-psram-cache-issue'",
|
||||||
|
"'-D USER_LED_GPIO=14'",
|
||||||
|
"'-D USER_LED_ON_LEVEL=HIGH'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PWDN=GPIO_NUM_NC'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_RESET=GPIO_NUM_NC'",
|
||||||
|
"'-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=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=1'",
|
||||||
|
"'-D CAMERA_CONFIG_FB_LOCATION=CAMERA_FB_IN_PSRAM'"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "40000000L",
|
||||||
|
"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 AI Thinker",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://www.espressif.com/en/products/devkits/esp-eye/overview",
|
||||||
|
"vendor": "Espressif"
|
||||||
|
}
|
||||||
65
boards/esp32cam_freenove_wrover_kit.json
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino":{
|
||||||
|
"ldscript": "esp32_out.ld",
|
||||||
|
"partitions": "huge_app.csv"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_WROVER_KIT'",
|
||||||
|
"'-D BOARD_HAS_PSRAM'",
|
||||||
|
"'-mfix-esp32-psram-cache-issue'",
|
||||||
|
"'-D USER_LED_GPIO=2'",
|
||||||
|
"'-D USER_LED_ON_LEVEL=HIGH'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PWDN=GPIO_NUM_NC'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_RESET=GPIO_NUM_NC'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_XCLK=21'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_SCCB_SDA=26'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_SCCB_SCL=27'",
|
||||||
|
"'-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_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'"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "40000000L",
|
||||||
|
"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 WROVER kit",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://www.aliexpress.com/item/1005004960637276.html",
|
||||||
|
"vendor": "Freenove"
|
||||||
|
}
|
||||||
63
boards/esp32cam_m5stack_camera.json
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino":{
|
||||||
|
"ldscript": "esp32_out.ld",
|
||||||
|
"partitions": "huge_app.csv"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_M5STACK'",
|
||||||
|
"'-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=25'",
|
||||||
|
"'-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=1'",
|
||||||
|
"'-D CAMERA_CONFIG_FB_LOCATION=CAMERA_FB_IN_DRAM'",
|
||||||
|
"'-D GROVE_SDA=13'",
|
||||||
|
"'-D GROVE_SCL=4'"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "40000000L",
|
||||||
|
"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 M5 STACK",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://docs.m5stack.com/en/unit/m5camera",
|
||||||
|
"vendor": "M5STACK"
|
||||||
|
}
|
||||||
65
boards/esp32cam_m5stack_camera_psram.json
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino":{
|
||||||
|
"ldscript": "esp32_out.ld",
|
||||||
|
"partitions": "huge_app.csv"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_M5STACK_CAMERA_PSRAM'",
|
||||||
|
"'-D BOARD_HAS_PSRAM'",
|
||||||
|
"'-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=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 GROVE_SDA=13'",
|
||||||
|
"'-D GROVE_SCL=4'"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "40000000L",
|
||||||
|
"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 M5 STACK",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://docs.m5stack.com/en/unit/m5camera",
|
||||||
|
"vendor": "M5STACK"
|
||||||
|
}
|
||||||
68
boards/esp32cam_m5stack_esp32cam.json
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino":{
|
||||||
|
"ldscript": "esp32_out.ld",
|
||||||
|
"partitions": "huge_app.csv"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_M5STACK_ESP32CAM'",
|
||||||
|
"'-D BOARD_HAS_PSRAM'",
|
||||||
|
"'-mfix-esp32-psram-cache-issue'",
|
||||||
|
"'-D USER_LED_GPIO=16'",
|
||||||
|
"'-D USER_LED_ON_LEVEL=LOW'",
|
||||||
|
"'-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=17'",
|
||||||
|
"'-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 MICROPHONE_GPIO=32'",
|
||||||
|
"'-D GROVE_SDA=13'",
|
||||||
|
"'-D GROVE_SCL=4'"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "40000000L",
|
||||||
|
"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 ESP32CAM",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://docs.m5stack.com/en/unit/esp32cam",
|
||||||
|
"vendor": "M5STACK"
|
||||||
|
}
|
||||||
63
boards/esp32cam_m5stack_unitcam.json
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino":{
|
||||||
|
"ldscript": "esp32_out.ld",
|
||||||
|
"partitions": "huge_app.csv"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_M5STACK_UNITCAM'",
|
||||||
|
"'-D USER_LED_GPIO=4'",
|
||||||
|
"'-D USER_LED_ON_LEVEL=LOW'",
|
||||||
|
"'-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=1'",
|
||||||
|
"'-D CAMERA_CONFIG_FB_LOCATION=CAMERA_FB_IN_DRAM'"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "40000000L",
|
||||||
|
"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 UNITCAM",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://docs.m5stack.com/en/unit/unit_cam",
|
||||||
|
"vendor": "M5STACK"
|
||||||
|
}
|
||||||
83
boards/esp32cam_m5stack_unitcams3.json
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino": {
|
||||||
|
"ldscript": "esp32s3_out.ld",
|
||||||
|
"partitions": "default_8MB.csv",
|
||||||
|
"memory_type": "qio_opi"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_M5STACK_UNITCAMS3'",
|
||||||
|
"'-D BOARD_HAS_PSRAM'",
|
||||||
|
"'-D ARDUINO_USB_MODE=1'",
|
||||||
|
"'-D ARDUINO_USB_CDC_ON_BOOT=1'",
|
||||||
|
"'-D ARDUINO_RUNNING_CORE=1'",
|
||||||
|
"'-D ARDUINO_EVENT_RUNNING_CORE=1'",
|
||||||
|
"'-D USER_LED_GPIO=14'",
|
||||||
|
"'-D USER_LED_ON_LEVEL=HIGH'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PWDN=GPIO_NUM_NC'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_RESET=21'",
|
||||||
|
"'-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_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 I2C_MEMS_SDA=48'",
|
||||||
|
"'-D I2C_MEMS_SCL=47'",
|
||||||
|
"'-D TF_CS=9'",
|
||||||
|
"'-D TF_MOSI=38'",
|
||||||
|
"'-D TF_CLK=39'",
|
||||||
|
"'-D TF_MISO=40'"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "80000000L",
|
||||||
|
"flash_mode": "qio",
|
||||||
|
"hwids": [
|
||||||
|
[
|
||||||
|
"0x2886",
|
||||||
|
"0x0056"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"0x2886",
|
||||||
|
"0x8056"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"mcu": "esp32s3",
|
||||||
|
"variant": "esp32s3"
|
||||||
|
},
|
||||||
|
"connectivity": [
|
||||||
|
"bluetooth",
|
||||||
|
"wifi"
|
||||||
|
],
|
||||||
|
"debug": {
|
||||||
|
"openocd_target": "esp32s3.cfg"
|
||||||
|
},
|
||||||
|
"frameworks": [
|
||||||
|
"arduino",
|
||||||
|
"espidf"
|
||||||
|
],
|
||||||
|
"name": "ESP32-CAM M5STACK UNITCAMS3",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "16MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 16777216,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://docs.m5stack.com/en/unit/Unit-CamS3",
|
||||||
|
"vendor": "M5STACK"
|
||||||
|
}
|
||||||
63
boards/esp32cam_m5stack_wide.json
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino":{
|
||||||
|
"ldscript": "esp32_out.ld",
|
||||||
|
"partitions": "huge_app.csv"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_M5STACK_WIDE'",
|
||||||
|
"'-D BOARD_HAS_PSRAM'",
|
||||||
|
"'-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=22'",
|
||||||
|
"'-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=25'",
|
||||||
|
"'-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'"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "40000000L",
|
||||||
|
"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 M5 STACK WIDE",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://shop.m5stack.com/collections/m5-cameras",
|
||||||
|
"vendor": "M5STACK"
|
||||||
|
}
|
||||||
83
boards/esp32cam_seeed_xiao_esp32s3_sense.json
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino": {
|
||||||
|
"ldscript": "esp32s3_out.ld",
|
||||||
|
"partitions": "default_8MB.csv",
|
||||||
|
"memory_type": "qio_opi"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_SEEED_XIAO_ESP32S3_SENSE'",
|
||||||
|
"'-D BOARD_HAS_PSRAM'",
|
||||||
|
"'-D ARDUINO_USB_MODE=1'",
|
||||||
|
"'-D ARDUINO_USB_CDC_ON_BOOT=1'",
|
||||||
|
"'-D ARDUINO_RUNNING_CORE=1'",
|
||||||
|
"'-D ARDUINO_EVENT_RUNNING_CORE=1'",
|
||||||
|
"'-D USER_LED_GPIO=21'",
|
||||||
|
"'-D USER_LED_ON_LEVEL=LOW'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PWDN=GPIO_NUM_NC'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_RESET=GPIO_NUM_NC'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_XCLK=10'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_SCCB_SDA=40'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_SCCB_SCL=39'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y9=48'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y8=11'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y7=12'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y6=14'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y5=16'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y4=18'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y3=17'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y2=15'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_VSYNC=38'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_HREF=47'",
|
||||||
|
"'-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 I2C_MEMS_SDA=41'",
|
||||||
|
"'-D I2C_MEMS_SCL=42'",
|
||||||
|
"'-D TF_CS=21'",
|
||||||
|
"'-D TF_MOSI=10'",
|
||||||
|
"'-D TF_CLK=8'",
|
||||||
|
"'-D TF_MISO=9'"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "80000000L",
|
||||||
|
"flash_mode": "qio",
|
||||||
|
"hwids": [
|
||||||
|
[
|
||||||
|
"0x2886",
|
||||||
|
"0x0056"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"0x2886",
|
||||||
|
"0x8056"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"mcu": "esp32s3",
|
||||||
|
"variant": "esp32s3"
|
||||||
|
},
|
||||||
|
"connectivity": [
|
||||||
|
"bluetooth",
|
||||||
|
"wifi"
|
||||||
|
],
|
||||||
|
"debug": {
|
||||||
|
"openocd_target": "esp32s3.cfg"
|
||||||
|
},
|
||||||
|
"frameworks": [
|
||||||
|
"arduino",
|
||||||
|
"espidf"
|
||||||
|
],
|
||||||
|
"name": "Seeed Studio XIAO ESP32S3 Sense",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "8MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 8388608,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://www.seeedstudio.com/XIAO-ESP32S3-p-5627.html",
|
||||||
|
"vendor": "Seeed Studio"
|
||||||
|
}
|
||||||
65
boards/esp32cam_ttgo_t_camera.json
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino": {
|
||||||
|
"ldscript": "esp32_out.ld",
|
||||||
|
"partitions": "huge_app.csv"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_TTGO_T_CAMERA'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PWDN=26'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_RESET=GPIO_NUM_NC'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_XCLK=32'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_SCCB_SDA=13'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_SCCB_SCL=12'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y9=39'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y8=36'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y7=23'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y6=18'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y5=15'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y4=4'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y3=14'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_Y2=5'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_VSYNC=27'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_HREF=25'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PCLK=19'",
|
||||||
|
"'-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=1'",
|
||||||
|
"'-D CAMERA_CONFIG_FB_LOCATION=CAMERA_FB_IN_DRAM'",
|
||||||
|
"'-D LCD_SSD1306_PIN_SDA=21'",
|
||||||
|
"'-D LCD_SSD1306_PIN_SCL=22'",
|
||||||
|
"'-D BUTTON_RIGHT_PIN=34'",
|
||||||
|
"'-D PIR_PIN=33'"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "40000000L",
|
||||||
|
"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 TTGO-T-CAMERA",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://www.lilygo.cc/products/",
|
||||||
|
"vendor": "LILYGO"
|
||||||
|
}
|
||||||
61
boards/esp32cam_ttgo_t_journal.json
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino": {
|
||||||
|
"ldscript": "esp32_out.ld",
|
||||||
|
"partitions": "huge_app.csv"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"'-D ESP32CAM_TTGO_T_JOURNAL'",
|
||||||
|
"'-D CAMERA_CONFIG_PIN_PWDN=0'",
|
||||||
|
"'-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=17'",
|
||||||
|
"'-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=1'",
|
||||||
|
"'-D CAMERA_CONFIG_FB_LOCATION=CAMERA_FB_IN_DRAM'"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "40000000L",
|
||||||
|
"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 TTGO-T-JOURNAL",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://www.lilygo.cc/products/",
|
||||||
|
"vendor": "LILYGO"
|
||||||
|
}
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
. python3 -m pip install --upgrade pip setuptools wheel
|
. python3 -m pip install --upgrade pip setuptools wheel
|
||||||
. python3 -m pip install minify-html
|
. python3 -m pip install minify-html
|
||||||
|
|
||||||
. python3 ./minify.py ./html/index.html ./html/index.min.html
|
. python3 ./minify.py ./html/index.html ./html/index.min.html
|
||||||
. python3 ./minify.py ./html/restart.html ./html/restart.min.html
|
|
||||||
@@ -3,5 +3,4 @@
|
|||||||
python3 -m pip install --upgrade pip setuptools wheel
|
python3 -m pip install --upgrade pip setuptools wheel
|
||||||
python3 -m pip install minify-html
|
python3 -m pip install minify-html
|
||||||
|
|
||||||
python3 ./minify.py ./html/index.html ./html/index.min.html
|
python3 ./minify.py ./html/index.html ./html/index.min.html
|
||||||
python3 ./minify.py ./html/restart.html ./html/restart.min.html
|
|
||||||
@@ -104,17 +104,11 @@
|
|||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{#ConfigChanged}}
|
|
||||||
<div class="alert alert-danger">
|
|
||||||
<h3 class="text-center">
|
|
||||||
The configuration has been changed.<br>
|
|
||||||
It is recommended to restart the device.<br><br>
|
|
||||||
<button type="button" class="btn btn-danger" onclick="location.href='restart'">Restart</button>
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
{{/ConfigChanged}}
|
|
||||||
<h2 class="text-center">ESP32</h2>
|
<h2 class="text-center">ESP32</h2>
|
||||||
<div class="flex-table">
|
<div class="flex-table">
|
||||||
|
<div class="row">Board type:</div>
|
||||||
|
<div>{{BoardType}}</div>
|
||||||
<div class="row">SDK Version:</div>
|
<div class="row">SDK Version:</div>
|
||||||
<div>{{SDKVersion}}</div>
|
<div>{{SDKVersion}}</div>
|
||||||
<div class="row">CPU model:</div>
|
<div class="row">CPU model:</div>
|
||||||
@@ -135,8 +129,6 @@
|
|||||||
<div class="flex-table">
|
<div class="flex-table">
|
||||||
<div class="row">Uptime:</div>
|
<div class="row">Uptime:</div>
|
||||||
<div>{{Uptime}}</div>
|
<div>{{Uptime}}</div>
|
||||||
<div class="row">Chip temperature:</div>
|
|
||||||
<div>{{Temperature}} °C</div>
|
|
||||||
<div class="row">RTSP sessions:</div>
|
<div class="row">RTSP sessions:</div>
|
||||||
<div>{{NumRTSPSessions}}</div>
|
<div>{{NumRTSPSessions}}</div>
|
||||||
<div class="row">Free heap:</div>
|
<div class="row">Free heap:</div>
|
||||||
@@ -145,14 +137,6 @@
|
|||||||
<div>{{MaxAllocHeap}}</div>
|
<div>{{MaxAllocHeap}}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2 class="text-center">Peripheral</h2>
|
|
||||||
<div class="flex-table">
|
|
||||||
<div class="row">Board type:</div>
|
|
||||||
<div>{{BoardType}}</div>
|
|
||||||
<div class="row">LED intensity:</div>
|
|
||||||
<div>{{LedIntensity}} [0-100]</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h2 class="text-center">Network</h2>
|
<h2 class="text-center">Network</h2>
|
||||||
<div class="flex-table">
|
<div class="flex-table">
|
||||||
<div class="row">Host name:</div>
|
<div class="row">Host name:</div>
|
||||||
@@ -166,9 +150,9 @@
|
|||||||
<div class="row">Signal strength:</div>
|
<div class="row">Signal strength:</div>
|
||||||
<div>{{SignalStrength}} dbm</div>
|
<div>{{SignalStrength}} dbm</div>
|
||||||
<div class="row">IPv4 address:</div>
|
<div class="row">IPv4 address:</div>
|
||||||
<div>{{IpV4}}</div>
|
<div>{{IPv4}}</div>
|
||||||
<div class="row">IPv6 address:</div>
|
<div class="row">IPv6 address:</div>
|
||||||
<div>{{IpV6}}</div>
|
<div>{{IPv6}}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{#NetworkState.ApMode}}
|
{{#NetworkState.ApMode}}
|
||||||
@@ -191,10 +175,6 @@
|
|||||||
<div>{{FrameSize}}</div>
|
<div>{{FrameSize}}</div>
|
||||||
<div class="row">JPEG quality:</div>
|
<div class="row">JPEG quality:</div>
|
||||||
<div>{{JpegQuality}} [1-100]</div>
|
<div>{{JpegQuality}} [1-100]</div>
|
||||||
<div class="row">Enable PSRAM:</div>
|
|
||||||
<div>{{#EnablePSRAM}}Enabled{{/EnablePSRAM}}{{^EnablePSRAM}}Disabled{{/EnablePSRAM}}</div>
|
|
||||||
<div class="row">Number of frame buffers:</div>
|
|
||||||
<div>{{FrameBuffers}}</div>
|
|
||||||
<div class="row">Brightness:</div>
|
<div class="row">Brightness:</div>
|
||||||
<div>{{Brightness}} [-2,2]</div>
|
<div>{{Brightness}} [-2,2]</div>
|
||||||
<div class="row">Contrast:</div>
|
<div class="row">Contrast:</div>
|
||||||
@@ -260,15 +240,11 @@
|
|||||||
<h2 class="text-center">Special URLs / API</h2>
|
<h2 class="text-center">Special URLs / API</h2>
|
||||||
<div class="flex-table">
|
<div class="flex-table">
|
||||||
<div class="row">RTSP camera stream:</div>
|
<div class="row">RTSP camera stream:</div>
|
||||||
<div><a href="rtsp://{{IpV4}}:{{RtspPort}}/mjpeg/1">rtsp://{{IpV4}}:{{RtspPort}}/mjpeg/1</a></div>
|
<div><a href="rtsp://{{IPv4}}:{{RtspPort}}/mjpeg/1">rtsp://{{IPv4}}:{{RtspPort}}/mjpeg/1</a></div>
|
||||||
<div class="row">JPEG Motion stream:</div>
|
<div class="row">JPEG Motion stream:</div>
|
||||||
<div><a href="http://{{IpV4}}/stream" target="_blank">http://{{IpV4}}/stream</a></div>
|
<div><a href="http://{{IPv4}}/stream" target="_blank" rel="noopener">http://{{IPv4}}/stream</a></div>
|
||||||
<div class="row">Snapshot of the camera:</div>
|
<div class="row">Snapshot of the camera:</div>
|
||||||
<div><a href="http://{{IpV4}}/snapshot " target="_blank">http://{{IpV4}}/snapshot</a> </div>
|
<div><a href="http://{{IPv4}}/snapshot " target="_blank" rel="noopener">http://{{IPv4}}/snapshot</a> </div>
|
||||||
<div class="row">Intensity of the flash led (0-255):</div>
|
|
||||||
<div><a href="http://{{IpV4}}/flash?v=0">http://{{IpV4}}/flash?v=0</a> (Authentication required)</div>
|
|
||||||
<div class="row">Restart the camera:</div>
|
|
||||||
<div><a href="http://{{IpV4}}/restart">http://{{IpV4}}/restart</a> (Authentication required)</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
||||||
<meta http-equiv="refresh" content="10;url=/index.html">
|
|
||||||
<style>
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
color: #222;
|
|
||||||
font-size: 16px;
|
|
||||||
font-family: Arial, Verdana, Helvetica, sans-serif;
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-center {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert-info {
|
|
||||||
color: #31708f;
|
|
||||||
background-color: #d9edf7;
|
|
||||||
border-color: #bce8f1;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<title>{{AppTitle}} v{{AppVersion}}</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h1 class="text-center">{{ThingName}}</h1>
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<div class="alert-info">
|
|
||||||
<h3 class="text-center">Restarting</h3>
|
|
||||||
<h4 class="text-center">
|
|
||||||
The device is restarting...<br><br>
|
|
||||||
If this page takes longer than a minute, consider performing a power cycle.
|
|
||||||
</h4>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<!doctypehtml><html lang=en><meta charset=utf-8><meta content=width=device-width,initial-scale=1,shrink-to-fit=no name=viewport><meta content=10;url=/index.html http-equiv=refresh><style>body,html{color:#222;font:16px Arial,Verdana,Helvetica,sans-serif;min-height:100%}.text-center{text-align:center}.alert-info{color:#31708f;background:#d9edf7;border:#bce8f1}</style><title>{{AppTitle}} v{{AppVersion}}</title><body><h1 class=text-center>{{ThingName}}</h1><hr><div class=alert-info><h3 class=text-center>Restarting</h3><h4 class=text-center>The device is restarting...<br><br> If this page takes longer than a minute, consider performing a power cycle.</h4></div>
|
|
||||||
@@ -1,152 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <esp_camera.h>
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
const char name[11];
|
|
||||||
const camera_config_t config;
|
|
||||||
} camera_config_entry_t;
|
|
||||||
|
|
||||||
constexpr camera_config_t esp32cam_settings = {
|
|
||||||
.pin_pwdn = -1,
|
|
||||||
.pin_reset = 15,
|
|
||||||
.pin_xclk = 27,
|
|
||||||
.pin_sscb_sda = 25,
|
|
||||||
.pin_sscb_scl = 23,
|
|
||||||
.pin_d7 = 19,
|
|
||||||
.pin_d6 = 36,
|
|
||||||
.pin_d5 = 18,
|
|
||||||
.pin_d4 = 39,
|
|
||||||
.pin_d3 = 5,
|
|
||||||
.pin_d2 = 34,
|
|
||||||
.pin_d1 = 35,
|
|
||||||
.pin_d0 = 17,
|
|
||||||
.pin_vsync = 22,
|
|
||||||
.pin_href = 26,
|
|
||||||
.pin_pclk = 21,
|
|
||||||
.xclk_freq_hz = 20000000,
|
|
||||||
.ledc_timer = LEDC_TIMER_0,
|
|
||||||
.ledc_channel = LEDC_CHANNEL_0,
|
|
||||||
.pixel_format = PIXFORMAT_JPEG,
|
|
||||||
.frame_size = FRAMESIZE_SVGA,
|
|
||||||
.jpeg_quality = 12,
|
|
||||||
.fb_count = 2};
|
|
||||||
|
|
||||||
constexpr camera_config_t esp32cam_aithinker_settings = {
|
|
||||||
.pin_pwdn = 32,
|
|
||||||
.pin_reset = -1,
|
|
||||||
.pin_xclk = 0,
|
|
||||||
.pin_sscb_sda = 26,
|
|
||||||
.pin_sscb_scl = 27,
|
|
||||||
.pin_d7 = 35,
|
|
||||||
.pin_d6 = 34,
|
|
||||||
.pin_d5 = 39,
|
|
||||||
.pin_d4 = 36,
|
|
||||||
.pin_d3 = 21,
|
|
||||||
.pin_d2 = 19,
|
|
||||||
.pin_d1 = 18,
|
|
||||||
.pin_d0 = 5,
|
|
||||||
.pin_vsync = 25,
|
|
||||||
.pin_href = 23,
|
|
||||||
.pin_pclk = 22,
|
|
||||||
.xclk_freq_hz = 20000000,
|
|
||||||
.ledc_timer = LEDC_TIMER_1,
|
|
||||||
.ledc_channel = LEDC_CHANNEL_1,
|
|
||||||
.pixel_format = PIXFORMAT_JPEG,
|
|
||||||
.frame_size = FRAMESIZE_SVGA,
|
|
||||||
.jpeg_quality = 12,
|
|
||||||
.fb_count = 2};
|
|
||||||
|
|
||||||
constexpr camera_config_t esp32cam_ttgo_t_settings = {
|
|
||||||
.pin_pwdn = 26,
|
|
||||||
.pin_reset = -1,
|
|
||||||
.pin_xclk = 32,
|
|
||||||
.pin_sscb_sda = 13,
|
|
||||||
.pin_sscb_scl = 12,
|
|
||||||
.pin_d7 = 39,
|
|
||||||
.pin_d6 = 36,
|
|
||||||
.pin_d5 = 23,
|
|
||||||
.pin_d4 = 18,
|
|
||||||
.pin_d3 = 15,
|
|
||||||
.pin_d2 = 4,
|
|
||||||
.pin_d1 = 14,
|
|
||||||
.pin_d0 = 5,
|
|
||||||
.pin_vsync = 27,
|
|
||||||
.pin_href = 25,
|
|
||||||
.pin_pclk = 19,
|
|
||||||
.xclk_freq_hz = 20000000,
|
|
||||||
.ledc_timer = LEDC_TIMER_0,
|
|
||||||
.ledc_channel = LEDC_CHANNEL_0,
|
|
||||||
.pixel_format = PIXFORMAT_JPEG,
|
|
||||||
.frame_size = FRAMESIZE_SVGA,
|
|
||||||
.jpeg_quality = 12,
|
|
||||||
.fb_count = 2};
|
|
||||||
|
|
||||||
constexpr camera_config_t esp32cam_m5stack_settings = {
|
|
||||||
.pin_pwdn = -1,
|
|
||||||
.pin_reset = 15,
|
|
||||||
.pin_xclk = 27,
|
|
||||||
.pin_sscb_sda = 25,
|
|
||||||
.pin_sscb_scl = 23,
|
|
||||||
.pin_d7 = 19,
|
|
||||||
.pin_d6 = 36,
|
|
||||||
.pin_d5 = 18,
|
|
||||||
.pin_d4 = 39,
|
|
||||||
.pin_d3 = 5,
|
|
||||||
.pin_d2 = 34,
|
|
||||||
.pin_d1 = 35,
|
|
||||||
.pin_d0 = 32,
|
|
||||||
.pin_vsync = 22,
|
|
||||||
.pin_href = 26,
|
|
||||||
.pin_pclk = 21,
|
|
||||||
.xclk_freq_hz = 20000000,
|
|
||||||
.ledc_timer = LEDC_TIMER_0,
|
|
||||||
.ledc_channel = LEDC_CHANNEL_0,
|
|
||||||
.pixel_format = PIXFORMAT_JPEG,
|
|
||||||
.frame_size = FRAMESIZE_SVGA,
|
|
||||||
.jpeg_quality = 12,
|
|
||||||
.fb_count = 2};
|
|
||||||
|
|
||||||
constexpr camera_config_t esp32cam_wrover_kit_settings = {
|
|
||||||
.pin_pwdn = -1,
|
|
||||||
.pin_reset = -1,
|
|
||||||
.pin_xclk = 21,
|
|
||||||
.pin_sscb_sda = 26,
|
|
||||||
.pin_sscb_scl = 27,
|
|
||||||
.pin_d7 = 35,
|
|
||||||
.pin_d6 = 34,
|
|
||||||
.pin_d5 = 39,
|
|
||||||
.pin_d4 = 36,
|
|
||||||
.pin_d3 = 19,
|
|
||||||
.pin_d2 = 18,
|
|
||||||
.pin_d1 = 5,
|
|
||||||
.pin_d0 = 4,
|
|
||||||
.pin_vsync = 25,
|
|
||||||
.pin_href = 23,
|
|
||||||
.pin_pclk = 22,
|
|
||||||
.xclk_freq_hz = 20000000,
|
|
||||||
.ledc_timer = LEDC_TIMER_0,
|
|
||||||
.ledc_channel = LEDC_CHANNEL_0,
|
|
||||||
.pixel_format = PIXFORMAT_JPEG,
|
|
||||||
.frame_size = FRAMESIZE_SVGA,
|
|
||||||
.jpeg_quality = 12,
|
|
||||||
.fb_count = 2};
|
|
||||||
|
|
||||||
constexpr const camera_config_entry_t camera_configs[] = {
|
|
||||||
{"ESP32CAM", esp32cam_settings},
|
|
||||||
{"AI THINKER", esp32cam_aithinker_settings},
|
|
||||||
{"TTGO T-CAM", esp32cam_ttgo_t_settings},
|
|
||||||
{"M5 STACK", esp32cam_m5stack_settings},
|
|
||||||
{"WROVER KIT", esp32cam_wrover_kit_settings}};
|
|
||||||
|
|
||||||
const camera_config_t lookup_camera_config(const char *name)
|
|
||||||
{
|
|
||||||
// Lookup table for the frame name to framesize_t
|
|
||||||
for (const auto &entry : camera_configs)
|
|
||||||
if (strncmp(entry.name, name, sizeof(entry.name)) == 0)
|
|
||||||
return entry.config;
|
|
||||||
|
|
||||||
return camera_config_t{};
|
|
||||||
}
|
|
||||||
@@ -5,23 +5,20 @@
|
|||||||
|
|
||||||
#define WIFI_SSID "ESP32CAM-RTSP"
|
#define WIFI_SSID "ESP32CAM-RTSP"
|
||||||
#define WIFI_PASSWORD nullptr
|
#define WIFI_PASSWORD nullptr
|
||||||
#define CONFIG_VERSION "1.5"
|
#define CONFIG_VERSION "1.6"
|
||||||
|
|
||||||
#define OTA_PASSWORD "ESP32CAM-RTSP"
|
#define OTA_PASSWORD "ESP32CAM-RTSP"
|
||||||
|
|
||||||
#define RTSP_PORT 554
|
#define RTSP_PORT 554
|
||||||
|
|
||||||
#define DEFAULT_CAMERA_CONFIG "AI THINKER"
|
|
||||||
#define DEFAULT_ENABLE_PSRAM psramFound()
|
|
||||||
#define DEFAULT_BUFFERS (psramFound() ? 2 : 1)
|
|
||||||
#define DEFAULT_FRAME_DURATION 200
|
#define DEFAULT_FRAME_DURATION 200
|
||||||
#define DEFAULT_FRAME_SIZE "VGA (640x480)"
|
#define DEFAULT_FRAME_SIZE "VGA (640x480)"
|
||||||
#define DEFAULT_JPEG_QUALITY (psramFound() ? 12 : 14)
|
#define DEFAULT_JPEG_QUALITY (psramFound() ? 12 : 14)
|
||||||
|
|
||||||
#define DEFAULT_BRIGHTNESS 0
|
#define DEFAULT_BRIGHTNESS 0
|
||||||
#define DEFAULT_CONTRAST 0
|
#define DEFAULT_CONTRAST 0
|
||||||
#define DEFAULT_SATURATION 0
|
#define DEFAULT_SATURATION 0
|
||||||
#define DEFAULT_EFFECT "Normal"
|
#define DEFAULT_EFFECT "Normal"
|
||||||
#define DEFAULT_WHITE_BALANCE true
|
#define DEFAULT_WHITE_BALANCE true
|
||||||
#define DEFAULT_WHITE_BALANCE_GAIN true
|
#define DEFAULT_WHITE_BALANCE_GAIN true
|
||||||
#define DEFAULT_WHITE_BALANCE_MODE "Auto"
|
#define DEFAULT_WHITE_BALANCE_MODE "Auto"
|
||||||
@@ -41,4 +38,4 @@
|
|||||||
#define DEFAULT_DCW true
|
#define DEFAULT_DCW true
|
||||||
#define DEFAULT_COLORBAR false
|
#define DEFAULT_COLORBAR false
|
||||||
|
|
||||||
#define DEFAULT_LED_INTENSITY 0
|
#define DEFAULT_LED_INTENSITY 0
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "RTSPServer",
|
"name": "RTSPServer",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "RTSP Server",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"contrem/arduino-timer": "^2.3.1"
|
"contrem/arduino-timer": "^2.3.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -29,7 +29,7 @@ private:
|
|||||||
std::shared_ptr<CRtspSession> session;
|
std::shared_ptr<CRtspSession> session;
|
||||||
};
|
};
|
||||||
|
|
||||||
OV2640 cam_;
|
OV2640 cam_;
|
||||||
std::list<std::unique_ptr<rtsp_client>> clients_;
|
std::list<std::unique_ptr<rtsp_client>> clients_;
|
||||||
uintptr_t task_;
|
uintptr_t task_;
|
||||||
Timer<> timer_;
|
Timer<> timer_;
|
||||||
|
|||||||
@@ -8,15 +8,33 @@
|
|||||||
; Please visit documentation for the other options and examples
|
; Please visit documentation for the other options and examples
|
||||||
; https://docs.platformio.org/page/projectconf.html
|
; https://docs.platformio.org/page/projectconf.html
|
||||||
|
|
||||||
[env:esp32cam]
|
###############################################################################
|
||||||
|
[platformio]
|
||||||
|
#default_envs = esp32cam_ai_thinker
|
||||||
|
#default_envs = esp32cam_espressif_esp_eye
|
||||||
|
#default_envs = esp32cam_espressif_esp32s2_cam_board
|
||||||
|
#default_envs = esp32cam_espressif_esp32s2_cam_header
|
||||||
|
#default_envs = esp32cam_espressif_esp32s3_cam_lcd
|
||||||
|
#default_envs = esp32cam_espressif_esp32s3_eye
|
||||||
|
#default_envs = esp32cam_freenove_wrover_kit
|
||||||
|
#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_seeed_xiao_esp32s3_sense
|
||||||
|
#default_envs = esp32cam_ttgo_t_camera
|
||||||
|
#default_envs = esp32cam_ttgo_t_journal
|
||||||
|
|
||||||
|
[env]
|
||||||
platform = espressif32
|
platform = espressif32
|
||||||
board = esp32cam
|
|
||||||
framework = arduino
|
framework = arduino
|
||||||
|
|
||||||
#upload_protocol = espota
|
#upload_protocol = espota
|
||||||
#upload_port = 192.168.50.222
|
#upload_port = 192.168.178.223
|
||||||
#upload_flags =
|
#upload_flags = --auth='ESP32CAM-RTSP'
|
||||||
# --auth='ESP32CAM-RTSP'
|
|
||||||
|
|
||||||
# Partition scheme for OTA
|
# Partition scheme for OTA
|
||||||
board_build.partitions = min_spiffs.csv
|
board_build.partitions = min_spiffs.csv
|
||||||
@@ -27,19 +45,67 @@ monitor_dtr = 0
|
|||||||
monitor_filters = log2file, time, default, esp32_exception_decoder
|
monitor_filters = log2file, time, default, esp32_exception_decoder
|
||||||
|
|
||||||
build_flags =
|
build_flags =
|
||||||
-O2
|
-Ofast
|
||||||
-D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE
|
-D 'BOARD_NAME="${this.board}"'
|
||||||
-D LED_FLASH=4
|
-D 'CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE'
|
||||||
-D LED_BUILTIN=33
|
-D 'IOTWEBCONF_PASSWORD_LEN=64'
|
||||||
-D BOARD_HAS_PSRAM
|
|
||||||
-mfix-esp32-psram-cache-issue
|
|
||||||
-D IOTWEBCONF_PASSWORD_LEN=64
|
|
||||||
|
|
||||||
board_build.embed_txtfiles =
|
board_build.embed_txtfiles =
|
||||||
html/index.min.html
|
html/index.min.html
|
||||||
html/restart.min.html
|
|
||||||
|
|
||||||
lib_deps =
|
lib_deps =
|
||||||
prampec/IotWebConf @ ^3.2.1
|
prampec/IotWebConf@^3.2.1
|
||||||
geeksville/Micro-RTSP @ ^0.1.6
|
geeksville/Micro-RTSP@^0.1.6
|
||||||
rzeldent/micro-moustache@^1.0.1
|
rzeldent/micro-moustache@^1.0.1
|
||||||
|
|
||||||
|
[env:esp32cam_ai_thinker]
|
||||||
|
board = esp32cam_ai_thinker
|
||||||
|
|
||||||
|
[env:esp32cam_espressif_esp_eye]
|
||||||
|
board = esp32cam_espressif_esp_eye
|
||||||
|
|
||||||
|
[env:esp32cam_espressif_esp32s2_cam_board]
|
||||||
|
# Use board connection
|
||||||
|
# The 18 pin header on the board has Y5 and Y3 swapped
|
||||||
|
board = esp32cam_espressif_esp32s2_cam_board
|
||||||
|
|
||||||
|
[env:esp32cam_espressif_esp32s2_cam_header]
|
||||||
|
# Use header connection
|
||||||
|
# The 18 pin header on the board has Y5 and Y3 swapped
|
||||||
|
board = esp32cam_espressif_esp32s2_cam_header
|
||||||
|
|
||||||
|
[env:esp32cam_espressif_esp32s3_cam_lcd]
|
||||||
|
board = esp32cam_espressif_esp32s3_cam_lcd
|
||||||
|
|
||||||
|
[env:esp32cam_espressif_esp32s3_eye]
|
||||||
|
board = esp32cam_espressif_esp32s3_eye
|
||||||
|
|
||||||
|
[env:esp32cam_freenove_wrover_kit]
|
||||||
|
board = esp32cam_freenove_wrover_kit
|
||||||
|
|
||||||
|
[env:esp32cam_m5stack_camera_psram]
|
||||||
|
board = esp32cam_m5stack_camera_psram
|
||||||
|
|
||||||
|
[env:esp32cam_m5stack_camera]
|
||||||
|
board = esp32cam_m5stack_camera
|
||||||
|
|
||||||
|
[env:esp32cam_m5stack_esp32cam]
|
||||||
|
board = esp32cam_m5stack_esp32cam
|
||||||
|
|
||||||
|
[env:esp32cam_m5stack_unitcam]
|
||||||
|
board = esp32cam_m5stack_unitcam
|
||||||
|
|
||||||
|
[env:esp32cam_m5stack_unitcams3]
|
||||||
|
board = esp32cam_m5stack_unitcams3
|
||||||
|
|
||||||
|
[env:esp32cam_m5stack_wide]
|
||||||
|
board = esp32cam_m5stack_wide
|
||||||
|
|
||||||
|
[env:esp32cam_seeed_xiao_esp32s3_sense]
|
||||||
|
board = esp32cam_seeed_xiao_esp32s3_sense
|
||||||
|
|
||||||
|
[env:esp32cam_ttgo_t_camera]
|
||||||
|
board = esp32cam_ttgo_t_camera
|
||||||
|
|
||||||
|
[env:esp32cam_ttgo_t_journal]
|
||||||
|
board = esp32cam_ttgo_t_journal
|
||||||
233
src/main.cpp
@@ -1,13 +1,12 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <ArduinoOTA.h>
|
|
||||||
#include <esp_wifi.h>
|
#include <esp_wifi.h>
|
||||||
#include <soc/rtc_cntl_reg.h>
|
#include <soc/rtc_cntl_reg.h>
|
||||||
|
#include <driver/i2c.h>
|
||||||
#include <IotWebConf.h>
|
#include <IotWebConf.h>
|
||||||
#include <IotWebConfTParameter.h>
|
#include <IotWebConfTParameter.h>
|
||||||
#include <OV2640.h>
|
#include <OV2640.h>
|
||||||
#include <ESPmDNS.h>
|
#include <ESPmDNS.h>
|
||||||
#include <rtsp_server.h>
|
#include <rtsp_server.h>
|
||||||
#include <lookup_camera_config.h>
|
|
||||||
#include <lookup_camera_effect.h>
|
#include <lookup_camera_effect.h>
|
||||||
#include <lookup_camera_frame_size.h>
|
#include <lookup_camera_frame_size.h>
|
||||||
#include <lookup_camera_gainceiling.h>
|
#include <lookup_camera_gainceiling.h>
|
||||||
@@ -17,21 +16,13 @@
|
|||||||
#include <moustache.h>
|
#include <moustache.h>
|
||||||
#include <settings.h>
|
#include <settings.h>
|
||||||
|
|
||||||
extern "C" uint8_t temprature_sens_read();
|
|
||||||
|
|
||||||
// HTML files
|
// HTML files
|
||||||
extern const char index_html_min_start[] asm("_binary_html_index_min_html_start");
|
extern const char index_html_min_start[] asm("_binary_html_index_min_html_start");
|
||||||
extern const char restart_html_min_start[] asm("_binary_html_restart_min_html_start");
|
|
||||||
|
|
||||||
auto param_group_board = iotwebconf::ParameterGroup("board", "Board settings");
|
|
||||||
auto param_board = iotwebconf::Builder<iotwebconf::SelectTParameter<sizeof(camera_configs[0])>>("bt").label("Board").optionValues((const char *)&camera_configs).optionNames((const char *)&camera_configs).optionCount(sizeof(camera_configs) / sizeof(camera_configs[0])).nameLength(sizeof(camera_configs[0])).defaultValue(DEFAULT_CAMERA_CONFIG).build();
|
|
||||||
|
|
||||||
auto param_group_camera = iotwebconf::ParameterGroup("camera", "Camera settings");
|
auto param_group_camera = iotwebconf::ParameterGroup("camera", "Camera settings");
|
||||||
auto param_frame_duration = iotwebconf::Builder<iotwebconf::UIntTParameter<unsigned long>>("fd").label("Frame duration (ms)").defaultValue(DEFAULT_FRAME_DURATION).min(10).build();
|
auto param_frame_duration = iotwebconf::Builder<iotwebconf::UIntTParameter<unsigned long>>("fd").label("Frame duration (ms)").defaultValue(DEFAULT_FRAME_DURATION).min(10).build();
|
||||||
auto param_frame_size = iotwebconf::Builder<iotwebconf::SelectTParameter<sizeof(frame_sizes[0])>>("fs").label("Frame size").optionValues((const char *)&frame_sizes).optionNames((const char *)&frame_sizes).optionCount(sizeof(frame_sizes) / sizeof(frame_sizes[0])).nameLength(sizeof(frame_sizes[0])).defaultValue(DEFAULT_FRAME_SIZE).build();
|
auto param_frame_size = iotwebconf::Builder<iotwebconf::SelectTParameter<sizeof(frame_sizes[0])>>("fs").label("Frame size").optionValues((const char *)&frame_sizes).optionNames((const char *)&frame_sizes).optionCount(sizeof(frame_sizes) / sizeof(frame_sizes[0])).nameLength(sizeof(frame_sizes[0])).defaultValue(DEFAULT_FRAME_SIZE).build();
|
||||||
auto param_jpg_quality = iotwebconf::Builder<iotwebconf::UIntTParameter<byte>>("q").label("JPG quality").defaultValue(DEFAULT_JPEG_QUALITY).min(1).max(100).build();
|
auto param_jpg_quality = iotwebconf::Builder<iotwebconf::UIntTParameter<byte>>("q").label("JPG quality").defaultValue(DEFAULT_JPEG_QUALITY).min(1).max(100).build();
|
||||||
auto param_enable_psram = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("eps").label("Enable PSRAM if available").defaultValue(DEFAULT_ENABLE_PSRAM).build();
|
|
||||||
auto param_frame_buffers = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("fb").label("Buffers").defaultValue(DEFAULT_BUFFERS).min(1).max(4).build();
|
|
||||||
auto param_brightness = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("b").label("Brightness").defaultValue(DEFAULT_BRIGHTNESS).min(-2).max(2).build();
|
auto param_brightness = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("b").label("Brightness").defaultValue(DEFAULT_BRIGHTNESS).min(-2).max(2).build();
|
||||||
auto param_contrast = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("c").label("Contrast").defaultValue(DEFAULT_CONTRAST).min(-2).max(2).build();
|
auto param_contrast = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("c").label("Contrast").defaultValue(DEFAULT_CONTRAST).min(-2).max(2).build();
|
||||||
auto param_saturation = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("s").label("Saturation").defaultValue(DEFAULT_SATURATION).min(-2).max(2).build();
|
auto param_saturation = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("s").label("Saturation").defaultValue(DEFAULT_SATURATION).min(-2).max(2).build();
|
||||||
@@ -55,9 +46,6 @@ auto param_vflip = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("vm").lab
|
|||||||
auto param_dcw = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("dcw").label("Downsize enable").defaultValue(DEFAULT_DCW).build();
|
auto param_dcw = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("dcw").label("Downsize enable").defaultValue(DEFAULT_DCW).build();
|
||||||
auto param_colorbar = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("cb").label("Colorbar").defaultValue(DEFAULT_COLORBAR).build();
|
auto param_colorbar = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("cb").label("Colorbar").defaultValue(DEFAULT_COLORBAR).build();
|
||||||
|
|
||||||
auto param_group_peripheral = iotwebconf::ParameterGroup("io", "peripheral settings");
|
|
||||||
auto param_led_intensity = iotwebconf::Builder<iotwebconf::UIntTParameter<byte>>("li").label("LED intensity").defaultValue(DEFAULT_LED_INTENSITY).min(0).max(100).build();
|
|
||||||
|
|
||||||
// Camera
|
// Camera
|
||||||
OV2640 cam;
|
OV2640 cam;
|
||||||
// DNS Server
|
// DNS Server
|
||||||
@@ -70,21 +58,9 @@ WebServer web_server(80);
|
|||||||
auto thingName = String(WIFI_SSID) + "-" + String(ESP.getEfuseMac(), 16);
|
auto thingName = String(WIFI_SSID) + "-" + String(ESP.getEfuseMac(), 16);
|
||||||
IotWebConf iotWebConf(thingName.c_str(), &dnsServer, &web_server, WIFI_PASSWORD, CONFIG_VERSION);
|
IotWebConf iotWebConf(thingName.c_str(), &dnsServer, &web_server, WIFI_PASSWORD, CONFIG_VERSION);
|
||||||
|
|
||||||
// Keep track of config changes. This will allow a reset of the device
|
|
||||||
bool config_changed = false;
|
|
||||||
// Camera initialization result
|
// Camera initialization result
|
||||||
esp_err_t camera_init_result;
|
esp_err_t camera_init_result;
|
||||||
|
|
||||||
void stream_text_file_gzip(const unsigned char *content, size_t length, const char *mime_type)
|
|
||||||
{
|
|
||||||
// Cache for 86400 seconds (one day)
|
|
||||||
web_server.sendHeader("Cache-Control", "max-age=86400");
|
|
||||||
web_server.sendHeader("Content-encoding", "gzip");
|
|
||||||
web_server.setContentLength(length);
|
|
||||||
web_server.send(200, mime_type, "");
|
|
||||||
web_server.sendContent(reinterpret_cast<const char *>(content), length);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handle_root()
|
void handle_root()
|
||||||
{
|
{
|
||||||
log_v("Handle root");
|
log_v("Handle root");
|
||||||
@@ -102,12 +78,15 @@ void handle_root()
|
|||||||
auto ipv4 = WiFi.getMode() == WIFI_MODE_AP ? WiFi.softAPIP() : WiFi.localIP();
|
auto ipv4 = WiFi.getMode() == WIFI_MODE_AP ? WiFi.softAPIP() : WiFi.localIP();
|
||||||
auto ipv6 = WiFi.getMode() == WIFI_MODE_AP ? WiFi.softAPIPv6() : WiFi.localIPv6();
|
auto ipv6 = WiFi.getMode() == WIFI_MODE_AP ? WiFi.softAPIPv6() : WiFi.localIPv6();
|
||||||
|
|
||||||
|
auto initResult = esp_err_to_name(camera_init_result);
|
||||||
|
if (initResult == nullptr)
|
||||||
|
initResult = "Unknown reason";
|
||||||
|
|
||||||
moustache_variable_t substitutions[] = {
|
moustache_variable_t substitutions[] = {
|
||||||
// Config Changed?
|
|
||||||
{"ConfigChanged", String(config_changed)},
|
|
||||||
// Version / CPU
|
// Version / CPU
|
||||||
{"AppTitle", APP_TITLE},
|
{"AppTitle", APP_TITLE},
|
||||||
{"AppVersion", APP_VERSION},
|
{"AppVersion", APP_VERSION},
|
||||||
|
{"BoardType", BOARD_NAME},
|
||||||
{"ThingName", iotWebConf.getThingName()},
|
{"ThingName", iotWebConf.getThingName()},
|
||||||
{"SDKVersion", ESP.getSdkVersion()},
|
{"SDKVersion", ESP.getSdkVersion()},
|
||||||
{"ChipModel", ESP.getChipModel()},
|
{"ChipModel", ESP.getChipModel()},
|
||||||
@@ -119,7 +98,6 @@ void handle_root()
|
|||||||
{"PsRamSize", format_memory(ESP.getPsramSize(), 0)},
|
{"PsRamSize", format_memory(ESP.getPsramSize(), 0)},
|
||||||
// Diagnostics
|
// Diagnostics
|
||||||
{"Uptime", String(format_duration(millis() / 1000))},
|
{"Uptime", String(format_duration(millis() / 1000))},
|
||||||
{"Temperature", String((temprature_sens_read() - 32) / 1.8)},
|
|
||||||
{"FreeHeap", format_memory(ESP.getFreeHeap())},
|
{"FreeHeap", format_memory(ESP.getFreeHeap())},
|
||||||
{"MaxAllocHeap", format_memory(ESP.getMaxAllocHeap())},
|
{"MaxAllocHeap", format_memory(ESP.getMaxAllocHeap())},
|
||||||
{"NumRTSPSessions", camera_server != nullptr ? String(camera_server->num_connected()) : "RTSP server disabled"},
|
{"NumRTSPSessions", camera_server != nullptr ? String(camera_server->num_connected()) : "RTSP server disabled"},
|
||||||
@@ -129,21 +107,18 @@ void handle_root()
|
|||||||
{"AccessPoint", WiFi.SSID()},
|
{"AccessPoint", WiFi.SSID()},
|
||||||
{"SignalStrength", String(WiFi.RSSI())},
|
{"SignalStrength", String(WiFi.RSSI())},
|
||||||
{"WifiMode", wifi_modes[WiFi.getMode()]},
|
{"WifiMode", wifi_modes[WiFi.getMode()]},
|
||||||
{"IpV4", ipv4.toString()},
|
{"IPv4", ipv4.toString()},
|
||||||
{"IpV6", ipv6.toString()},
|
{"IPv6", ipv6.toString()},
|
||||||
{"NetworkState.ApMode", String(iotWebConf.getState() == iotwebconf::NetworkState::ApMode)},
|
{"NetworkState.ApMode", String(iotWebConf.getState() == iotwebconf::NetworkState::ApMode)},
|
||||||
{"NetworkState.OnLine", String(iotWebConf.getState() == iotwebconf::NetworkState::OnLine)},
|
{"NetworkState.OnLine", String(iotWebConf.getState() == iotwebconf::NetworkState::OnLine)},
|
||||||
// Camera
|
// Camera
|
||||||
{"BoardType", String(param_board.value())},
|
|
||||||
{"FrameSize", String(param_frame_size.value())},
|
{"FrameSize", String(param_frame_size.value())},
|
||||||
{"FrameDuration", String(param_frame_duration.value())},
|
{"FrameDuration", String(param_frame_duration.value())},
|
||||||
{"FrameFrequency", String(1000.0 / param_frame_duration.value(), 1)},
|
{"FrameFrequency", String(1000.0 / param_frame_duration.value(), 1)},
|
||||||
{"JpegQuality", String(param_jpg_quality.value())},
|
{"JpegQuality", String(param_jpg_quality.value())},
|
||||||
{"EnablePSRAM", String(param_enable_psram.value())},
|
|
||||||
{"FrameBuffers", String(param_frame_buffers.value())},
|
|
||||||
{"CameraInitialized", String(camera_init_result == ESP_OK)},
|
{"CameraInitialized", String(camera_init_result == ESP_OK)},
|
||||||
{"CameraInitResult", String(camera_init_result)},
|
{"CameraInitResult", String(camera_init_result)},
|
||||||
{"CameraInitResultText", esp_err_to_name(camera_init_result)},
|
{"CameraInitResultText", initResult},
|
||||||
// Settings
|
// Settings
|
||||||
{"Brightness", String(param_brightness.value())},
|
{"Brightness", String(param_brightness.value())},
|
||||||
{"Contrast", String(param_contrast.value())},
|
{"Contrast", String(param_contrast.value())},
|
||||||
@@ -167,8 +142,6 @@ void handle_root()
|
|||||||
{"VFlip", String(param_vflip.value())},
|
{"VFlip", String(param_vflip.value())},
|
||||||
{"Dcw", String(param_dcw.value())},
|
{"Dcw", String(param_dcw.value())},
|
||||||
{"ColorBar", String(param_colorbar.value())},
|
{"ColorBar", String(param_colorbar.value())},
|
||||||
// LED
|
|
||||||
{"LedIntensity", String(param_led_intensity.value())},
|
|
||||||
// RTSP
|
// RTSP
|
||||||
{"RtspPort", String(RTSP_PORT)}};
|
{"RtspPort", String(RTSP_PORT)}};
|
||||||
|
|
||||||
@@ -177,28 +150,6 @@ void handle_root()
|
|||||||
web_server.send(200, "text/html", html);
|
web_server.send(200, "text/html", html);
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_restart()
|
|
||||||
{
|
|
||||||
log_v("Handle restart");
|
|
||||||
|
|
||||||
if (!web_server.authenticate("admin", iotWebConf.getApPasswordParameter()->valueBuffer))
|
|
||||||
{
|
|
||||||
web_server.requestAuthentication(BASIC_AUTH, APP_TITLE, "401 Unauthorized<br><br>The password is incorrect.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
moustache_variable_t substitutions[] = {
|
|
||||||
{"AppTitle", APP_TITLE},
|
|
||||||
{"AppVersion", APP_VERSION},
|
|
||||||
{"ThingName", iotWebConf.getThingName()}};
|
|
||||||
|
|
||||||
auto html = moustache_render(restart_html_min_start, substitutions);
|
|
||||||
web_server.send(200, "text/html", html);
|
|
||||||
log_v("Restarting... Press refresh to connect again");
|
|
||||||
sleep(100);
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
|
|
||||||
void handle_snapshot()
|
void handle_snapshot()
|
||||||
{
|
{
|
||||||
log_v("handle_snapshot");
|
log_v("handle_snapshot");
|
||||||
@@ -209,7 +160,7 @@ void handle_snapshot()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remove old images stored in the frame buffer
|
// Remove old images stored in the frame buffer
|
||||||
auto frame_buffers = param_frame_buffers.value();
|
auto frame_buffers = CAMERA_CONFIG_FB_COUNT;
|
||||||
while (frame_buffers--)
|
while (frame_buffers--)
|
||||||
cam.run();
|
cam.run();
|
||||||
|
|
||||||
@@ -258,62 +209,49 @@ void handle_stream()
|
|||||||
log_v("stopped streaming");
|
log_v("stopped streaming");
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_flash()
|
|
||||||
{
|
|
||||||
log_v("handle_flash");
|
|
||||||
|
|
||||||
if (!web_server.authenticate("admin", iotWebConf.getApPasswordParameter()->valueBuffer))
|
|
||||||
{
|
|
||||||
web_server.requestAuthentication(BASIC_AUTH, APP_TITLE, "401 Unauthorized<br><br>The password is incorrect.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If no value present, use value from config
|
|
||||||
if (web_server.hasArg("v"))
|
|
||||||
{
|
|
||||||
auto v = (uint8_t)min(web_server.arg("v").toInt(), 255L);
|
|
||||||
// If conversion fails, v = 0
|
|
||||||
analogWrite(LED_FLASH, v);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
analogWrite(LED_FLASH, param_led_intensity.value());
|
|
||||||
}
|
|
||||||
|
|
||||||
web_server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
|
|
||||||
web_server.send(200);
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t initialize_camera()
|
esp_err_t initialize_camera()
|
||||||
{
|
{
|
||||||
log_v("initialize_camera");
|
log_v("initialize_camera");
|
||||||
log_i("Camera config: %s", param_board.value());
|
|
||||||
auto camera_config_template = lookup_camera_config(param_board.value());
|
constexpr auto pixformat = PIXFORMAT_JPEG;
|
||||||
// Copy the settings
|
|
||||||
camera_config_t camera_config;
|
|
||||||
memset(&camera_config, 0, sizeof(camera_config_t));
|
|
||||||
memcpy(&camera_config, &camera_config_template, sizeof(camera_config_t));
|
|
||||||
log_i("Frame size: %s", param_frame_size.value());
|
log_i("Frame size: %s", param_frame_size.value());
|
||||||
auto frame_size = lookup_frame_size(param_frame_size.value());
|
auto frame_size = lookup_frame_size(param_frame_size.value());
|
||||||
log_i("JPEG quality: %d", param_jpg_quality.value());
|
log_i("JPEG quality: %d", param_jpg_quality.value());
|
||||||
|
auto jpeg_quality = param_jpg_quality.value();
|
||||||
log_i("Frame duration: %d ms", param_frame_duration.value());
|
log_i("Frame duration: %d ms", param_frame_duration.value());
|
||||||
camera_config.frame_size = frame_size;
|
constexpr auto i2c_port = I2C_NUM_0;
|
||||||
camera_config.jpeg_quality = param_jpg_quality.value();
|
|
||||||
camera_config.grab_mode = CAMERA_GRAB_LATEST;
|
|
||||||
log_i("Enable PSRAM: %d", param_enable_psram.value());
|
|
||||||
log_i("Frame buffers: %d", param_frame_buffers.value());
|
|
||||||
camera_config.fb_count = param_frame_buffers.value();
|
|
||||||
|
|
||||||
if (param_enable_psram.value() && psramFound())
|
camera_config_t camera_config = {
|
||||||
{
|
.pin_pwdn = CAMERA_CONFIG_PIN_PWDN, // GPIO pin for camera power down line
|
||||||
camera_config.fb_location = CAMERA_FB_IN_PSRAM;
|
.pin_reset = CAMERA_CONFIG_PIN_RESET, // GPIO pin for camera reset line
|
||||||
log_i("PSRAM enabled!");
|
.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
|
||||||
else
|
.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
|
||||||
camera_config.fb_location = CAMERA_FB_IN_DRAM;
|
.pin_d6 = CAMERA_CONFIG_PIN_Y8, // GPIO pin for camera D6 line
|
||||||
log_i("PSRAM disabled");
|
.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, // 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
|
||||||
|
#endif
|
||||||
|
.sccb_i2c_port = i2c_port // If pin_sccb_sda is -1, use the already configured I2C bus by number
|
||||||
|
};
|
||||||
|
|
||||||
return cam.init(camera_config);
|
return cam.init(camera_config);
|
||||||
}
|
}
|
||||||
@@ -357,14 +295,12 @@ void start_rtsp_server()
|
|||||||
camera_server = std::unique_ptr<rtsp_server>(new rtsp_server(cam, param_frame_duration.value(), RTSP_PORT));
|
camera_server = std::unique_ptr<rtsp_server>(new rtsp_server(cam, param_frame_duration.value(), RTSP_PORT));
|
||||||
// Add RTSP service to mDNS
|
// Add RTSP service to mDNS
|
||||||
// HTTP is already set by iotWebConf
|
// HTTP is already set by iotWebConf
|
||||||
MDNS.addService("rtsp", "tcp", 554);
|
MDNS.addService("rtsp", "tcp", RTSP_PORT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_connected()
|
void on_connected()
|
||||||
{
|
{
|
||||||
log_v("on_connected");
|
log_v("on_connected");
|
||||||
// Start (OTA) Over The Air programming when connected
|
|
||||||
ArduinoOTA.begin();
|
|
||||||
// Start the RTSP Server if initialized
|
// Start the RTSP Server if initialized
|
||||||
if (camera_init_result == ESP_OK)
|
if (camera_init_result == ESP_OK)
|
||||||
start_rtsp_server();
|
start_rtsp_server();
|
||||||
@@ -375,11 +311,7 @@ void on_connected()
|
|||||||
void on_config_saved()
|
void on_config_saved()
|
||||||
{
|
{
|
||||||
log_v("on_config_saved");
|
log_v("on_config_saved");
|
||||||
// Set flash led intensity
|
|
||||||
analogWrite(LED_FLASH, param_led_intensity.value());
|
|
||||||
// Update camera setting
|
|
||||||
update_camera_settings();
|
update_camera_settings();
|
||||||
config_changed = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
@@ -387,38 +319,35 @@ void setup()
|
|||||||
// Disable brownout
|
// Disable brownout
|
||||||
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
|
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
|
||||||
|
|
||||||
// LED_BUILTIN (GPIO33) has inverted logic false => LED on
|
#ifdef USER_LED_GPIO
|
||||||
pinMode(LED_BUILTIN, OUTPUT);
|
pinMode(USER_LED_GPIO, OUTPUT);
|
||||||
digitalWrite(LED_BUILTIN, false);
|
digitalWrite(USER_LED_GPIO, !USER_LED_ON_LEVEL);
|
||||||
|
|
||||||
pinMode(LED_FLASH, OUTPUT);
|
|
||||||
// Turn flash led off
|
|
||||||
analogWrite(LED_FLASH, 0);
|
|
||||||
|
|
||||||
#ifdef CORE_DEBUG_LEVEL
|
|
||||||
Serial.begin(115200);
|
|
||||||
Serial.setDebugOutput(true);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.setDebugOutput(true);
|
||||||
|
|
||||||
|
#ifdef ARDUINO_USB_CDC_ON_BOOT
|
||||||
|
// Delay for USB to connect/settle
|
||||||
|
delay(5000);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
log_i("Core debug level: %d", CORE_DEBUG_LEVEL);
|
||||||
log_i("CPU Freq: %d Mhz, %d core(s)", getCpuFrequencyMhz(), ESP.getChipCores());
|
log_i("CPU Freq: %d Mhz, %d core(s)", getCpuFrequencyMhz(), ESP.getChipCores());
|
||||||
log_i("Free heap: %d bytes", ESP.getFreeHeap());
|
log_i("Free heap: %d bytes", ESP.getFreeHeap());
|
||||||
log_i("SDK version: %s", ESP.getSdkVersion());
|
log_i("SDK version: %s", ESP.getSdkVersion());
|
||||||
|
log_i("Board: %s", BOARD_NAME);
|
||||||
log_i("Starting " APP_TITLE "...");
|
log_i("Starting " APP_TITLE "...");
|
||||||
|
|
||||||
if (psramFound())
|
if (CAMERA_CONFIG_FB_LOCATION == CAMERA_FB_IN_PSRAM)
|
||||||
{
|
{
|
||||||
psramInit();
|
if (!psramInit())
|
||||||
log_v("PSRAM found and initialized");
|
log_e("Failed to initialize PSRAM");
|
||||||
}
|
}
|
||||||
|
|
||||||
param_group_board.addItem(¶m_board);
|
|
||||||
iotWebConf.addParameterGroup(¶m_group_board);
|
|
||||||
|
|
||||||
param_group_camera.addItem(¶m_frame_duration);
|
param_group_camera.addItem(¶m_frame_duration);
|
||||||
param_group_camera.addItem(¶m_frame_size);
|
param_group_camera.addItem(¶m_frame_size);
|
||||||
param_group_camera.addItem(¶m_jpg_quality);
|
param_group_camera.addItem(¶m_jpg_quality);
|
||||||
param_group_camera.addItem(¶m_enable_psram);
|
|
||||||
param_group_camera.addItem(¶m_frame_buffers);
|
|
||||||
param_group_camera.addItem(¶m_brightness);
|
param_group_camera.addItem(¶m_brightness);
|
||||||
param_group_camera.addItem(¶m_contrast);
|
param_group_camera.addItem(¶m_contrast);
|
||||||
param_group_camera.addItem(¶m_saturation);
|
param_group_camera.addItem(¶m_saturation);
|
||||||
@@ -443,67 +372,39 @@ void setup()
|
|||||||
param_group_camera.addItem(¶m_colorbar);
|
param_group_camera.addItem(¶m_colorbar);
|
||||||
iotWebConf.addParameterGroup(¶m_group_camera);
|
iotWebConf.addParameterGroup(¶m_group_camera);
|
||||||
|
|
||||||
param_group_peripheral.addItem(¶m_led_intensity);
|
|
||||||
iotWebConf.addParameterGroup(¶m_group_peripheral);
|
|
||||||
|
|
||||||
iotWebConf.getApTimeoutParameter()->visible = true;
|
iotWebConf.getApTimeoutParameter()->visible = true;
|
||||||
iotWebConf.setConfigSavedCallback(on_config_saved);
|
iotWebConf.setConfigSavedCallback(on_config_saved);
|
||||||
iotWebConf.setWifiConnectionCallback(on_connected);
|
iotWebConf.setWifiConnectionCallback(on_connected);
|
||||||
iotWebConf.setStatusPin(LED_BUILTIN, LOW);
|
#ifdef USER_LED_GPIO
|
||||||
|
iotWebConf.setStatusPin(USER_LED_GPIO, USER_LED_ON_LEVEL);
|
||||||
|
#endif
|
||||||
iotWebConf.init();
|
iotWebConf.init();
|
||||||
|
|
||||||
camera_init_result = initialize_camera();
|
camera_init_result = initialize_camera();
|
||||||
if (camera_init_result == ESP_OK)
|
if (camera_init_result == ESP_OK)
|
||||||
update_camera_settings();
|
update_camera_settings();
|
||||||
else
|
else
|
||||||
log_e("Failed to initialize camera: 0x%0x. Type: %s, frame size: %s, frame rate: %d ms, jpeg quality: %d", camera_init_result, param_board.value(), param_frame_size.value(), param_frame_duration.value(), param_jpg_quality.value());
|
log_e("Failed to initialize camera: 0x%0x. Frame size: %s, frame rate: %d ms, jpeg quality: %d", camera_init_result, param_frame_size.value(), param_frame_duration.value(), param_jpg_quality.value());
|
||||||
|
|
||||||
// Set up required URL handlers on the web server
|
// Set up required URL handlers on the web server
|
||||||
web_server.on("/", HTTP_GET, handle_root);
|
web_server.on("/", HTTP_GET, handle_root);
|
||||||
web_server.on("/config", []
|
web_server.on("/config", []
|
||||||
{ iotWebConf.handleConfig(); });
|
{ iotWebConf.handleConfig(); });
|
||||||
web_server.on("/restart", HTTP_GET, handle_restart);
|
|
||||||
// Camera snapshot
|
// Camera snapshot
|
||||||
web_server.on("/snapshot", HTTP_GET, handle_snapshot);
|
web_server.on("/snapshot", HTTP_GET, handle_snapshot);
|
||||||
// Camera stream
|
// Camera stream
|
||||||
web_server.on("/stream", HTTP_GET, handle_stream);
|
web_server.on("/stream", HTTP_GET, handle_stream);
|
||||||
// Camera flash light
|
|
||||||
web_server.on("/flash", HTTP_GET, handle_flash);
|
|
||||||
|
|
||||||
web_server.onNotFound([]()
|
web_server.onNotFound([]()
|
||||||
{ iotWebConf.handleNotFound(); });
|
{ iotWebConf.handleNotFound(); });
|
||||||
|
|
||||||
ArduinoOTA
|
|
||||||
.setPassword(OTA_PASSWORD)
|
|
||||||
.onStart([]()
|
|
||||||
{ log_w("Starting OTA update: %s", ArduinoOTA.getCommand() == U_FLASH ? "sketch" : "filesystem"); })
|
|
||||||
.onEnd([]()
|
|
||||||
{ log_w("OTA update done!"); })
|
|
||||||
.onProgress([](unsigned int progress, unsigned int total)
|
|
||||||
{ log_i("OTA Progress: %u%%\r", (progress / (total / 100))); })
|
|
||||||
.onError([](ota_error_t error)
|
|
||||||
{
|
|
||||||
switch (error)
|
|
||||||
{
|
|
||||||
case OTA_AUTH_ERROR: log_e("OTA: Auth Failed"); break;
|
|
||||||
case OTA_BEGIN_ERROR: log_e("OTA: Begin Failed"); break;
|
|
||||||
case OTA_CONNECT_ERROR: log_e("OTA: Connect Failed"); break;
|
|
||||||
case OTA_RECEIVE_ERROR: log_e("OTA: Receive Failed"); break;
|
|
||||||
case OTA_END_ERROR: log_e("OTA: End Failed"); break;
|
|
||||||
default: log_e("OTA error: %u", error);
|
|
||||||
} });
|
|
||||||
|
|
||||||
// Set flash led intensity
|
|
||||||
analogWrite(LED_FLASH, param_led_intensity.value());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
iotWebConf.doLoop();
|
iotWebConf.doLoop();
|
||||||
ArduinoOTA.handle();
|
|
||||||
|
|
||||||
if (camera_server)
|
if (camera_server)
|
||||||
camera_server->doLoop();
|
camera_server->doLoop();
|
||||||
|
|
||||||
yield();
|
sleep(0);
|
||||||
}
|
}
|
||||||