mirror of
https://github.com/jomjol/AI-on-the-edge-device-docs.git
synced 2025-12-07 20:16:57 +03:00
Fix typos and small inconsistencies (#12)
Co-authored-by: CaCO3 <caco3@ruinelli.ch>
This commit is contained in:
@@ -8,15 +8,15 @@ This repo contains the documentation for the [AI-on-the-Edge-Device Project](htt
|
|||||||
1. When it got merged, the [Github Actions](https://github.com/jomjol/AI-on-the-edge-device-docs/actions) will re-generate the documentation and place it in the `gh-pages` branch. This branch automatically gets populated to the public [Documentation Site](https://jomjol.github.io/AI-on-the-edge-device-docs)
|
1. When it got merged, the [Github Actions](https://github.com/jomjol/AI-on-the-edge-device-docs/actions) will re-generate the documentation and place it in the `gh-pages` branch. This branch automatically gets populated to the public [Documentation Site](https://jomjol.github.io/AI-on-the-edge-device-docs)
|
||||||
|
|
||||||
## Migrating existing Wiki Pages
|
## Migrating existing Wiki Pages
|
||||||
The files from the [AI-on-the-Edge-Device Wiki](https://github.com/jomjol/AI-on-the-edge-device/wiki) got exported and added to this repo. Unless the files are listed in the [docs/nav.yml](docs/nav.yml) file, they will be listed in the **asorted pages** section of the left sidebar.
|
The files from the [AI-on-the-Edge-Device Wiki](https://github.com/jomjol/AI-on-the-edge-device/wiki) got exported and added to this repo. Unless the files are listed in the [docs/nav.yml](docs/nav.yml) file, they will be listed in the **assorted pages** section of the left sidebar.
|
||||||
|
|
||||||
In the end, we should review all pages from there step by step and add them to the upper part of the navigation.
|
In the end, we should review all pages from there step by step and add them to the upper part of the navigation.
|
||||||
|
|
||||||
### Tasks to do
|
### Tasks to do
|
||||||
- Make sure there is a top level title (#) and all other chaper headers are on lower levels (##, ###)
|
- Make sure there is a top level title (#) and all other chapter headers are on lower levels (##, ###)
|
||||||
- Check the links in the documents
|
- Check the links in the documents
|
||||||
- Fetch included images and place them directly in the [docs/img](docs/img) folder
|
- Fetch included images and place them directly in the [docs/img](docs/img) folder
|
||||||
- Rerwrite to have a clear structure
|
- Rewrite to have a clear structure
|
||||||
|
|
||||||
## Editing a page
|
## Editing a page
|
||||||
Each page has a link on its top-right corner `Edit on GitHub` which brings you directly to the Github editor.
|
Each page has a link on its top-right corner `Edit on GitHub` which brings you directly to the Github editor.
|
||||||
|
|||||||
@@ -3,14 +3,14 @@
|
|||||||
This page shows some best practices:
|
This page shows some best practices:
|
||||||
|
|
||||||
## Camera Placement
|
## Camera Placement
|
||||||
* Move the Camera as close as possible(~4cm), this will help get rid of reflections.
|
* Move the Camera as close as possible (~4cm), this will help get rid of reflections.
|
||||||
-> focus can be adjusted by turning the outer black ring of the camera.
|
-> focus can be adjusted by turning the outer black ring of the camera.
|
||||||
* If the LED reflections are too strong, put tape over the LED to defuse the light
|
* If the LED reflections are too strong, put tape over the LED to diffuse the light
|
||||||
* Change the ImageSize to QVGA under "Expert mode" configuration when close enough, this will be faster and is often good enough for digital recognition.
|
* Change the ImageSize to QVGA under "Expert mode" configuration when close enough, this will be faster and is often good enough for digital recognition.
|
||||||
|
|
||||||
## Reflections
|
## Reflections
|
||||||
|
|
||||||
* Try to get ride of the reflections by rotating the camera, so that the reflections are at positions, where no number is.
|
* Try to get rid of the reflections by rotating the camera, so that the reflections are at positions, where no number is.
|
||||||
* By using the external LED option, you can place WS2812 LEDs freely away from the main axis.
|
* By using the external LED option, you can place WS2812 LEDs freely away from the main axis.
|
||||||
* Users report, that a handy cover foil could also help
|
* Users report, that a handy cover foil could also help
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ FlipImageSize = false
|
|||||||
| InitialMirror | Option for initially mirroring the image on the original x-axis | |
|
| InitialMirror | Option for initially mirroring the image on the original x-axis | |
|
||||||
| InitialRotate | Initial rotation of image before alignment in degree (1...359) | |
|
| InitialRotate | Initial rotation of image before alignment in degree (1...359) | |
|
||||||
| FlipImageSize | Changes the aspect ratio after the image rotation to avoid cropping of the rotated imaged | |
|
| FlipImageSize | Changes the aspect ratio after the image rotation to avoid cropping of the rotated imaged | |
|
||||||
| /config/refx.jpg 98, 257 | Link to reference image and corresponding target coordinates | file link is relative to sd-card root |
|
| /config/refx.jpg 98, 257 | Link to reference image and corresponding target coordinates | file link is relative to SD card root |
|
||||||
| SearchFieldX/Y | Search field size in X/Y for finding the reference images [pixel] | |
|
| SearchFieldX/Y | Search field size in X/Y for finding the reference images [pixel] | |
|
||||||
|
|
||||||
Here two reference images are needed. Therefore rotation and shifting can be compensated. As the alignment is one of the most computing time using part, the search field needs to be limited. The calculation time goes quadratic with the search field size.
|
Here two reference images are needed. Therefore rotation and shifting can be compensated. As the alignment is one of the most computing time using part, the search field needs to be limited. The calculation time goes quadratic with the search field size.
|
||||||
@@ -123,7 +123,7 @@ Here the post processing and consistency check for the readout can be adjusted
|
|||||||
| numberX.MaxRateValue | Maximum chance rate from one to the next readout.<br />This can be specified for each number individual. | |
|
| numberX.MaxRateValue | Maximum chance rate from one to the next readout.<br />This can be specified for each number individual. | |
|
||||||
| ErrorMessage | Show error messages | |
|
| ErrorMessage | Show error messages | |
|
||||||
| numberX.DecimalShift | Shifting of the decimal separator from the default position between digital and analog.<br />This can be specified for each number individual. | DecimalShift = 2: 123.456 --> 12345.6<br />DecimalShift = -1: 123.456 --> 12.3456<br/> |
|
| numberX.DecimalShift | Shifting of the decimal separator from the default position between digital and analog.<br />This can be specified for each number individual. | DecimalShift = 2: 123.456 --> 12345.6<br />DecimalShift = -1: 123.456 --> 12.3456<br/> |
|
||||||
| CheckDigitIncreaseConsistency | This parameter controls, if the digits are checked for a consistent change in comparison to the previous value. This only makes sense, if the last digit is changing very slowly and every single digit is visible (e.g. 4.7 --> 4.8 --> 4.9 --> 5.0 --> 5.1). If single digits are skipped, for example because the digits changes to fast, this should be disabled (e.g. 4.7 --> 5.0 --> 5.1). | |
|
| CheckDigitIncreaseConsistency | This parameter controls, if the digits are checked for a consistent change in comparison to the previous value. This only makes sense, if the last digit is changing very slowly and every single digit is visible (e.g. 4.7 --> 4.8 --> 4.9 --> 5.0 --> 5.1). If single digits are skipped, for example because the digits changes too quickly, this should be disabled (e.g. 4.7 --> 5.0 --> 5.1). | |
|
||||||
|
|
||||||
### [MQTT]
|
### [MQTT]
|
||||||
|
|
||||||
@@ -170,11 +170,11 @@ DataLogActive = true
|
|||||||
DataLogRetentionInDays = 3
|
DataLogRetentionInDays = 3
|
||||||
```
|
```
|
||||||
|
|
||||||
This paragraph is used to control the logging of the result data to a spectific folder of SD-Card -> \log\data\data_YYYY-MM-DD.csv
|
This paragraph is used to control the logging of the result data to a specific folder of SD card -> \log\data\data_YYYY-MM-DD.csv
|
||||||
|
|
||||||
| Parameter | Meaning | Options/Examples |
|
| Parameter | Meaning | Options/Examples |
|
||||||
| ---------------------- | -------------------------------------------------------- | -------------------------------------------------- |
|
| ---------------------- | -------------------------------------------------------- | -------------------------------------------------- |
|
||||||
| DataLogActive | Activate data logging to SD-Card | |
|
| DataLogActive | Activate data logging to SD card | |
|
||||||
| DataLogRetentionInDays | Number of days, for which the log files should be stored | 0 = keep forever |
|
| DataLogRetentionInDays | Number of days, for which the log files should be stored | 0 = keep forever |
|
||||||
|
|
||||||
|
|
||||||
@@ -210,7 +210,7 @@ This paragraph is used to switch on an extended logging. It is optional and by d
|
|||||||
|
|
||||||
| Parameter | Meaning | Options/Examples |
|
| Parameter | Meaning | Options/Examples |
|
||||||
| ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
|
| ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
|
||||||
| TimeZone | TimeZone of the system can be specified | Central european, with summertime adjustement: `CET-1CEST,M3.5.0,M10.5.0/3` |
|
| TimeZone | TimeZone of the system can be specified | Central european, with summertime adjustment: `CET-1CEST,M3.5.0,M10.5.0/3` |
|
||||||
| TimeServer | An dedicated time server can be specified. | default = `pool.ntp.org` |
|
| TimeServer | An dedicated time server can be specified. | default = `pool.ntp.org` |
|
||||||
| Hostname | Additionally to the `wlan.ini` the hostname can be specified. It will be transferred to the `wlan.ini` and initiate a reboot | |
|
| Hostname | Additionally to the `wlan.ini` the hostname can be specified. It will be transferred to the `wlan.ini` and initiate a reboot | |
|
||||||
| SetupMode | If enabled, the server starts in an initial setup mode. This is automatically disabled at the end of the setup |
|
| SetupMode | If enabled, the server starts in an initial setup mode. This is automatically disabled at the end of the setup |
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ More configuration parameters can be edited by hand in the `config.ini` and corr
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
If you where using the Version 1 of the watermeter you can easily transfer the configuration to the new system by following the steps in this [migration description](outdated--Migrate-Old-Config-To-New-Config.md)
|
If you where using the Version 1 of the water meter you can easily transfer the configuration to the new system by following the steps in this [migration description](outdated--Migrate-Old-Config-To-New-Config.md)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -77,4 +77,3 @@ The ```config.ini``` here has the same functionality and options, but a slightly
|
|||||||
### Integration into Home Assistant
|
### Integration into Home Assistant
|
||||||
|
|
||||||
Thanks to the help of the user @deadly667 here are some hints for the integration into the home assistant: [[Integration-Home-Assistant]]
|
Thanks to the help of the user @deadly667 here are some hints for the integration into the home assistant: [[Integration-Home-Assistant]]
|
||||||
|
|
||||||
|
|||||||
@@ -32,11 +32,11 @@ This are value derived from a pointer like meter. This never has the state "N".
|
|||||||
|
|
||||||
##### CheckDigitIncreaseConsistency
|
##### CheckDigitIncreaseConsistency
|
||||||
|
|
||||||
If this is enabled an "inteligent" algorithm is used to derive from zero-crossing of discrete digit positions, if the number should have been increased. This is relevant because in some of the digit meters, the increase of a digit to the next number can be seen, before the subdigit has gone through zero.
|
If this is enabled an "intelligent" algorithm is used to derive from zero-crossing of discrete digit positions, if the number should have been increased. This is relevant because in some of the digit meters, the increase of a digit to the next number can be seen, before the sub-digit has gone through zero.
|
||||||
|
|
||||||
For example: 16.6 --> 16.7 --> 1N.8 --> **17.9** corrected to 16.9 --> 17.0 --> 17.1
|
For example: 16.6 --> 16.7 --> 1N.8 --> **17.9** corrected to 16.9 --> 17.0 --> 17.1
|
||||||
|
|
||||||
As you can see, the 17.9 is a false reading as the 7 is assumed to be already readable, although the subdigit has not crossed the zero. In this case the CheckDigitIncreaseConsistency algorithm will correct this to 16.9
|
As you can see, the 17.9 is a false reading as the 7 is assumed to be already readable, although the sub-digit has not crossed the zero. In this case the CheckDigitIncreaseConsistency algorithm will correct this to 16.9
|
||||||
|
|
||||||
A detailed description of the algorithm can be found below (not yet ready!)
|
A detailed description of the algorithm can be found below (not yet ready!)
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Demo Mode
|
# Demo Mode
|
||||||
For Demo and Testing Purpose, the device can use pre-recorded images.
|
For Demo and Testing Purpose, the device can use pre-recorded images.
|
||||||
|
|
||||||
You need to enable it in the configuration (`TakeImage > Demo`) and also provide the needed files on the SD-Card.
|
You need to enable it in the configuration (`TakeImage > Demo`) and also provide the needed files on the SD card.
|
||||||
|
|
||||||
For each round one image gets used, starting with the first image for the first round.
|
For each round one image gets used, starting with the first image for the first round.
|
||||||
|
|
||||||
@@ -9,7 +9,7 @@ For the reference image and the alignment also the first image gets used.
|
|||||||
|
|
||||||
Once the last image got reached, it starts again with the first one.
|
Once the last image got reached, it starts again with the first one.
|
||||||
|
|
||||||
## SD-Card Structure
|
## SD Card Structure
|
||||||
```
|
```
|
||||||
demo/
|
demo/
|
||||||
├── 520.8983.jpg
|
├── 520.8983.jpg
|
||||||
@@ -65,10 +65,10 @@ done
|
|||||||
Just install the zip file using the OTA Update functionality.
|
Just install the zip file using the OTA Update functionality.
|
||||||
|
|
||||||
## How does it work
|
## How does it work
|
||||||
The Demo Mode tries to interfere as less as possible with the normal behavior. Whenever a Cam Framebuffer gets taken (`esp_camera_fb_get()`), it replaces the framebuffer with the image from the SD-Card.
|
The Demo Mode tries to interfere as less as possible with the normal behavior. Whenever a Cam framebuffer gets taken (`esp_camera_fb_get()`), it replaces the framebuffer with the image from the SD card.
|
||||||
|
|
||||||
|
|
||||||
## Example Data of a Watermeter
|
## Example Data of a Water Meter
|
||||||
You can use the following demo images if you want:
|
You can use the following demo images if you want:
|
||||||
|
|
||||||
{:style="width:200px"}
|
{:style="width:200px"}
|
||||||
@@ -98,5 +98,3 @@ Animation of it (186 MB!)
|
|||||||
[{:style="width:400px"}](https://user-images.githubusercontent.com/1783586/211915898-b499e109-7b63-4e21-ba5b-c0a370022f7a.png)
|
[{:style="width:400px"}](https://user-images.githubusercontent.com/1783586/211915898-b499e109-7b63-4e21-ba5b-c0a370022f7a.png)
|
||||||
|
|
||||||
[Demo_Images_Watermeter_530.00688-532.08243_42_images.zip](https://github.com/jomjol/AI-on-the-edge-device-docs/files/10395893/Demo_Images_Watermeter_530.00688-532.08243_42_images.zip)
|
[Demo_Images_Watermeter_530.00688-532.08243_42_images.zip](https://github.com/jomjol/AI-on-the-edge-device-docs/files/10395893/Demo_Images_Watermeter_530.00688-532.08243_42_images.zip)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -39,11 +39,11 @@ Analyze the debugging output of the serial interface
|
|||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/108122193/188264361-0f5038ce-d827-4096-93fb-5907d3b072b4.png" width=30% height=30%>
|
<img src="https://user-images.githubusercontent.com/108122193/188264361-0f5038ce-d827-4096-93fb-5907d3b072b4.png" width=30% height=30%>
|
||||||
|
|
||||||
This typically happens if you have suboptimal "Alignement Marks". A very simple and working solution is to put put higly contrasted stickers on your meter and put "Alignement Marks" on it (see picture below)
|
This typically happens if you have suboptimal "Alignment Marks". A very simple and working solution is to put put higly contrasted stickers on your meter and put "Alignment Marks" on it (see picture below)
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/108122193/188264752-c0f2a2be-0c22-40de-afaf-fd55b2eb4182.png" width=30% height=30%>
|
<img src="https://user-images.githubusercontent.com/108122193/188264752-c0f2a2be-0c22-40de-afaf-fd55b2eb4182.png" width=30% height=30%>
|
||||||
|
|
||||||
If after those adjustement you still have some issues, you can try to adjust your aligmenet settings in expert mode:
|
If after those adjustment you still have some issues, you can try to adjust your alignment settings in expert mode:
|
||||||
<img src="https://user-images.githubusercontent.com/108122193/188382213-68c4a015-6582-4911-81bc-cdce8ef60ed2.png" width=75% height=75%>
|
<img src="https://user-images.githubusercontent.com/108122193/188382213-68c4a015-6582-4911-81bc-cdce8ef60ed2.png" width=75% height=75%>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
## External LED
|
## External LED
|
||||||
|
|
||||||
The internal flash LED is very close to the camera axis. This results in reflection, especially in case of flat glass surfaces such as for power meters.
|
The internal flash LED is very close to the camera axis. This results in reflection, especially in case of flat glass surfaces such as for power meters.
|
||||||
To circumvent this problem, it is now possible to control external LEDs, which than can be places somewhere else in the setup. As not simples LEDs are used, but RGB leds with a digital interface like WS2812 not only the position, but also the color and intensity of the illumination can now be adjusted. The following image shows a direct comparision of the "old" internal flash LED and two off axis LEDs.
|
To circumvent this problem, it is now possible to control external LEDs, which than can be places somewhere else in the setup. As not simples LEDs are used, but RGB LEDs with a digital interface like WS2812 not only the position, but also the color and intensity of the illumination can now be adjusted. The following image shows a direct comparison of the "old" internal flash LED and two off axis LEDs.
|
||||||
|
|
||||||
<img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/intern_vs_external.jpg" width="700">
|
<img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/intern_vs_external.jpg" width="700">
|
||||||
|
|
||||||
|
|||||||
12
docs/FAQs.md
12
docs/FAQs.md
@@ -6,7 +6,7 @@ There are several reasons for the reboot:
|
|||||||
|
|
||||||
* Frequent HTML requests
|
* Frequent HTML requests
|
||||||
* Wrong configuration, missing configuration files
|
* Wrong configuration, missing configuration files
|
||||||
* Unstable hardware - see [[Hardware Compatibility]]
|
* Unstable hardware - see [Hardware Compatibility](../Hardware-Compatibility).
|
||||||
|
|
||||||
There is a dedicated page about this: [Frequent Reboots](../Frequent-Reboots/).
|
There is a dedicated page about this: [Frequent Reboots](../Frequent-Reboots/).
|
||||||
|
|
||||||
@@ -38,9 +38,10 @@ As mentioned above, the AI algorithm is not perfect. Sometimes it may read an in
|
|||||||
We can tune the software to _almost_ never report an incorrect value. There is a tradeoff though: the software may report _stale_ values - i.e. it will drop incorrect values for a potentially long period of time, resulting in the meter reading being outdated by hours. If never receiving an incorrect value is important to you, consider tolerating this tradeoff.
|
We can tune the software to _almost_ never report an incorrect value. There is a tradeoff though: the software may report _stale_ values - i.e. it will drop incorrect values for a potentially long period of time, resulting in the meter reading being outdated by hours. If never receiving an incorrect value is important to you, consider tolerating this tradeoff.
|
||||||
|
|
||||||
You can change the following settings to reduce incorrect readings (but potentially increase staleness of data):
|
You can change the following settings to reduce incorrect readings (but potentially increase staleness of data):
|
||||||
|
|
||||||
* Set a prevalue via the UI, then change `PostProcessing` configuration option `PreValueAgeStartup` to a much larger number (e.g. `43200` = 30 days).
|
* Set a prevalue via the UI, then change `PostProcessing` configuration option `PreValueAgeStartup` to a much larger number (e.g. `43200` = 30 days).
|
||||||
* Change `PostProcessing` configuration option `MaxRateType` to be time based instead of absolute. Set `MaxRateValue` to something realistic (e.g. `5` gal/min). You can often find the max flow rate your meter supports directly on the cover.
|
* Change `PostProcessing` configuration option `MaxRateType` to be time based instead of absolute. Set `MaxRateValue` to something realistic (e.g. `5` gal/min). You can often find the max flow rate your meter supports directly on the cover.
|
||||||
* Reduce `AutoTimer` configuration option `Intervall` to the lowest it can be (e.g. `3` min). The more often you take readings, the less likely for data staleness to occur.
|
* Reduce `AutoTimer` configuration option `Interval` to the lowest it can be (e.g. `3` min). The more often you take readings, the less likely for data staleness to occur.
|
||||||
|
|
||||||
## Even after I have setup everything perfect there is a false reading - especially around the zero crossing (roll over to next number)
|
## Even after I have setup everything perfect there is a false reading - especially around the zero crossing (roll over to next number)
|
||||||
* The roll over behavior is different for the different meters. E.g.:
|
* The roll over behavior is different for the different meters. E.g.:
|
||||||
@@ -48,7 +49,7 @@ You can change the following settings to reduce incorrect readings (but potentia
|
|||||||
* The neutral position (no rolling) is not perfectly at zero, but rather at something like 7.9 or 8.1, even if it should be exactly 8
|
* The neutral position (no rolling) is not perfectly at zero, but rather at something like 7.9 or 8.1, even if it should be exactly 8
|
||||||
|
|
||||||
* The "PostProcessingAlgo" is trying to judge out of the individual readings, what number it should be.
|
* The "PostProcessingAlgo" is trying to judge out of the individual readings, what number it should be.
|
||||||
* For example if the previous number is a "1", but the next number seems to be a "8.9", mos probably there was a "zero crossing" and the number is a "9" and not still an "8"
|
* For example if the previous number is a "1", but the next number seems to be a "8.9", most probably there was a "zero crossing" and the number is a "9" and not still an "8"
|
||||||
|
|
||||||
* Currently the setting of the algorithm is set to fit most of the meters and cases. But the parameters do not fit perfectly for all situations. Therefore there might be intermediate states, where the reading is false.
|
* Currently the setting of the algorithm is set to fit most of the meters and cases. But the parameters do not fit perfectly for all situations. Therefore there might be intermediate states, where the reading is false.
|
||||||
This is especially the case, at the positions, where the roll over (zero crossing) is just starting.
|
This is especially the case, at the positions, where the roll over (zero crossing) is just starting.
|
||||||
@@ -56,8 +57,3 @@ You can change the following settings to reduce incorrect readings (but potentia
|
|||||||
Usually after some time and movement of the counters a bit further, the reading is getting back to a stable reading.
|
Usually after some time and movement of the counters a bit further, the reading is getting back to a stable reading.
|
||||||
* To handle this, a parametrized setting would be needed. This is rather complicated to implement as subtle changes make a relevant difference. Currently this is not implemented.
|
* To handle this, a parametrized setting would be needed. This is rather complicated to implement as subtle changes make a relevant difference. Currently this is not implemented.
|
||||||
So please be a bit patient with your meter :-)
|
So please be a bit patient with your meter :-)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ This is the most annoying error. The SD card is detected, but the files cannot b
|
|||||||
|
|
||||||
##### PSRAM too low
|
##### PSRAM too low
|
||||||
|
|
||||||
In order to work, there are 4 MB of PSRAM necessary. Normaly the ESP32CAM is equiped with 8 MB, whereof only 4 MB can be used effectively.
|
In order to work, there are 4 MB of PSRAM necessary. Normally the ESP32CAM is equipped with 8 MB, whereof only 4 MB can be used effectively.
|
||||||
Sometimes, there is hardware, where only 2 MB of PSRAM is present - **even if you have bought a 8 MB module**
|
Sometimes, there is hardware, where only 2 MB of PSRAM is present - **even if you have bought a 8 MB module**
|
||||||
|
|
||||||
You can identify the amount of PSRAM in the serial log file:
|
You can identify the amount of PSRAM in the serial log file:
|
||||||
@@ -131,4 +131,3 @@ There are several files needed during on run cycle. If one of this is missing, t
|
|||||||
* `/config/XXXXX.tflite` (1 time for analog and 1 time for digital)
|
* `/config/XXXXX.tflite` (1 time for analog and 1 time for digital)
|
||||||
|
|
||||||
where XXXXX is the file name, that is written in the `config.ini`
|
where XXXXX is the file name, that is written in the `config.ini`
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
## Access to the graphical user interface
|
## Access to the graphical user interface
|
||||||
|
|
||||||
The graphical configuration mode can be reached via the "Edit Configuration" button in the main menue (`/index.html`):
|
The graphical configuration mode can be reached via the "Edit Configuration" button in the main menu (`/index.html`):
|
||||||
|
|
||||||
* <img src="img/config_s1_access.jpg" width="600" align="middle">
|
* <img src="img/config_s1_access.jpg" width="600" align="middle">
|
||||||
|
|
||||||
@@ -27,13 +27,13 @@ The graphical configuration mode can be reached via the "Edit Configuration" but
|
|||||||
b. Define alignment structures
|
b. Define alignment structures
|
||||||
3. Definition of ROIs for digits and analog pointers
|
3. Definition of ROIs for digits and analog pointers
|
||||||
4. Test the settings
|
4. Test the settings
|
||||||
5. Back to main menue ("index.html")
|
5. Back to main menu ("index.html")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 1. Edit Config.ini
|
### 1. Edit Config.ini
|
||||||
|
|
||||||
This is a text editor for the config.ini. Changes commited with the button on the lower left.
|
This is a text editor for the config.ini. Changes committed with the button on the lower left.
|
||||||
|
|
||||||
* <img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/config_s2_edit_config.jpg" width="600" align="middle">
|
* <img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/config_s2_edit_config.jpg" width="600" align="middle">
|
||||||
|
|
||||||
@@ -45,15 +45,15 @@ Details see [Configuration-Parameter-Details](../Configuration-Parameter-Details
|
|||||||
|
|
||||||
The reference image is the basis for the coordination of the ROIs. Therefore it is very important, to have a well aligned image, that is not rotated.
|
The reference image is the basis for the coordination of the ROIs. Therefore it is very important, to have a well aligned image, that is not rotated.
|
||||||
|
|
||||||
**:bangbang: Attention:** Updating the reference image, also means, that all alignment images and ROIs needs to be teached again. Therefore do this step only with caution.
|
**:bangbang: Attention:** Updating the reference image, also means, that all alignment images and ROIs needs to be taught again. Therefore do this step only with caution.
|
||||||
|
|
||||||
* <img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/config_s3_reference.jpg" width="400" align="middle">
|
* <img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/config_s3_reference.jpg" width="400" align="middle">
|
||||||
|
|
||||||
At first the current image is shown and no adjustment is possible. To reload the actual image push the button "Show actual Reference" (1). To define a new reference image push the button "Create new Reference" (2).
|
At first the current image is shown and no adjustment is possible. To reload the actual image push the button "Show actual Reference" (1). To define a new reference image push the button "Create new Reference" (2).
|
||||||
Then the last taken raw image from the camera is loaded. If you want to update this, you can push the button "Make new raw image (raw.jpg)". If you need to mirror your image (e.g. mirror before camera) you can do this by selecting "mirror image". After loading the mirroring (in case checked) and the prerotation angle from the `config.ini` are applied. Then use the rough and fine adjustment to get the image straight aligned (3).
|
Then the last taken raw image from the camera is loaded. If you want to update this, you can push the button "Make new raw image (raw.jpg)". If you need to mirror your image (e.g. mirror before camera) you can do this by selecting "mirror image". After loading the mirroring (in case checked) and the pre-rotation angle from the `config.ini` are applied. Then use the rough and fine adjustment to get the image straight aligned (3).
|
||||||
If everything is done, you can save the result with "Update Reference Image" (4).
|
If everything is done, you can save the result with "Update Reference Image" (4).
|
||||||
|
|
||||||
If you have problems with reflections, you can turn the camera in a positions, where the reflection is at a position, where no important information is. To reduce the intensity of the reflection you can also a peace of felt ("Filz") as diffusior at the LED.
|
If you have problems with reflections, you can turn the camera in a positions, where the reflection is at a position, where no important information is. To reduce the intensity of the reflection you can also a peace of felt ("Filz") as diffusor at the LED.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -94,7 +94,7 @@ In order to have a good recognition, the active ROI has two rectangles for align
|
|||||||
<img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/config_s5_ROIs_details.jpg" align="middle">
|
<img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/config_s5_ROIs_details.jpg" align="middle">
|
||||||
|
|
||||||
* The outer rectangle is the final size of the ROI
|
* The outer rectangle is the final size of the ROI
|
||||||
* More important is the inner smaller rectangle. This should tightly fit around the number itself in x- and in y-dimension. Maybe you need to unlock the aspect ratio to change x- and y-size independendly
|
* More important is the inner smaller rectangle. This should tightly fit around the number itself in x- and in y-dimension. Maybe you need to unlock the aspect ratio to change x- and y-size independently
|
||||||
* The line in the middle should go through the middle of the number (in case it is not moving in or out)
|
* The line in the middle should go through the middle of the number (in case it is not moving in or out)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Hardware Compatibility
|
# Hardware Compatibility
|
||||||
|
|
||||||
### General Remark
|
### General Remark
|
||||||
Altrough a board looks similair, it can have major differences, eg.:
|
Although a board looks similar, it can have major differences, e.g.:
|
||||||
|
|
||||||
- Processor
|
- Processor
|
||||||
- Ram (Size! & Type) -> this Project needs at least 4MB RAM!
|
- Ram (Size! & Type) -> this Project needs at least 4MB RAM!
|
||||||
@@ -16,7 +16,7 @@ Altrough a board looks similair, it can have major differences, eg.:
|
|||||||
|
|
||||||
This can cause different Power Consumption, Power Requirements, compatibility issues, etc.
|
This can cause different Power Consumption, Power Requirements, compatibility issues, etc.
|
||||||
|
|
||||||
Most manufacturers and sellers buy what's cheap today on the Asian markets. In the end, it looks like it is sometimes a trial and error approach which ESP32-CAM Module works reliable.
|
Most manufacturers and sellers buy what's cheap today on the Asian markets. In the end, it looks like it is sometimes a trial and error approach which ESP32-CAM Module works reliably.
|
||||||
|
|
||||||
Below you find some remarks and experiences from the community:
|
Below you find some remarks and experiences from the community:
|
||||||
|
|
||||||
@@ -31,9 +31,9 @@ Below you find some remarks and experiences from the community:
|
|||||||
There seems to be a lot of "fake" chips, or maybe wrongly configured ESP32 Boards.
|
There seems to be a lot of "fake" chips, or maybe wrongly configured ESP32 Boards.
|
||||||
|
|
||||||
|
|
||||||
For AP MEMORY, all "real" APS**64**04\*3SQR Chips should work.
|
For AP MEMORY, all "real" APS**64**04\*3SQR chips should work.
|
||||||
|
|
||||||
For ESP PSRAM, all "real" PSRAM**64**\* should work
|
For ESP PSRAM, all "real" PSRAM**64**\* should work.
|
||||||
|
|
||||||
64Mbit density = 8Mbyte PSRAM
|
64Mbit density = 8Mbyte PSRAM
|
||||||
|
|
||||||
@@ -72,14 +72,14 @@ The experience with the camera only is based on single modules. It is well possi
|
|||||||
| Module | Image | Status |
|
| Module | Image | Status |
|
||||||
| ------------------------------------------------------------ | ----- | ------------------------------ |
|
| ------------------------------------------------------------ | ----- | ------------------------------ |
|
||||||
| ESP32CAM / Different versions on the market!<br>Especially the PSRAM is sometimes labeled wrong<br>(Label: 4MB, Real: only 2 MB --> will not work!) | | :heavy_check_mark:<br />with >=4 MB PSRAM! |
|
| ESP32CAM / Different versions on the market!<br>Especially the PSRAM is sometimes labeled wrong<br>(Label: 4MB, Real: only 2 MB --> will not work!) | | :heavy_check_mark:<br />with >=4 MB PSRAM! |
|
||||||
| ESP32-S3-EYE<br />No Flash LED, pins different used (e.g. LCD diskplay) | | **NOT OKAY** |
|
| ESP32-S3-EYE<br />No Flash LED, pins different used (e.g. LCD display) | | **NOT OKAY** |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# SD-Cards
|
# SD Cards
|
||||||
|
|
||||||
Due to the limited free available gpios (due to all the extensions needed like: camera, sd-card, LED-flash, ...) the sd card is connected in 1-wire mode. There are some cards, that are compatible with the esp32cam module for unknown reasons.
|
Due to the limited free available GPIOs (due to all the extensions needed like: camera, SD card, LED-flash, ...) the SD card is connected in 1-wire mode. There are some cards, that are compatible with the esp32cam module for unknown reasons.
|
||||||
It is observed, that smaller cards (up to 4 GB) tend to be more stable and larger cards have more problems. But quite some exceptions in the forums (4 GB cards not working, 16 G cards working like a charm).
|
It is observed, that smaller cards (up to 4 GB) tend to be more stable and larger cards have more problems. But quite some exceptions in the forums (4 GB cards not working, 16 GB cards working like a charm).
|
||||||
|
|
||||||
|
|
||||||
# Devices known to work
|
# Devices known to work
|
||||||
@@ -95,7 +95,7 @@ See [https://github.com/jomjol/AI-on-the-edge-device/discussions/1732](https://g
|
|||||||
|
|
||||||
- [https://www.reichelt.de/entwicklerboards-esp32-kamera-2mp-25--debo-cam-esp32-p266036.html?PROVID=2788&gclid=CjwKCAiAqaWdBhAvEiwAGAQlttJnV4azXWDYeaFUuNioMICh-jvxKp6Cifmcep9vvtoT2JRCDqBczRoC7Q0QAvD_BwE](https://www.reichelt.de/entwicklerboards-esp32-kamera-2mp-25--debo-cam-esp32-p266036.html?PROVID=2788&gclid=CjwKCAiAqaWdBhAvEiwAGAQlttJnV4azXWDYeaFUuNioMICh-jvxKp6Cifmcep9vvtoT2JRCDqBczRoC7Q0QAvD_BwE) (27.12.2022)
|
- [https://www.reichelt.de/entwicklerboards-esp32-kamera-2mp-25--debo-cam-esp32-p266036.html?PROVID=2788&gclid=CjwKCAiAqaWdBhAvEiwAGAQlttJnV4azXWDYeaFUuNioMICh-jvxKp6Cifmcep9vvtoT2JRCDqBczRoC7Q0QAvD_BwE](https://www.reichelt.de/entwicklerboards-esp32-kamera-2mp-25--debo-cam-esp32-p266036.html?PROVID=2788&gclid=CjwKCAiAqaWdBhAvEiwAGAQlttJnV4azXWDYeaFUuNioMICh-jvxKp6Cifmcep9vvtoT2JRCDqBczRoC7Q0QAvD_BwE) (27.12.2022)
|
||||||
|
|
||||||
### SD-Card
|
### SD Card
|
||||||
|
|
||||||
- Sandisk 2GB Micro SD Class 2 [Sandisk 2GB](https://www.amazon.co.uk/gp/product/B000N3LL02/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)
|
- Sandisk 2GB Micro SD Class 2 [Sandisk 2GB](https://www.amazon.co.uk/gp/product/B000N3LL02/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)
|
||||||
AITRIP ESP32 and CAM [ESP-32/CAM](https://www.amazon.co.uk/gp/product/B08X49P8P3/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1)
|
AITRIP ESP32 and CAM [ESP-32/CAM](https://www.amazon.co.uk/gp/product/B08X49P8P3/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Influx DB
|
# Influx DB
|
||||||
The device also supports direct sending of data to an Influ DB.
|
The device also supports direct sending of data to an Influx DB.
|
||||||
|
|
||||||
:bangbang: Only Influx DB 1 is supported!
|
:bangbang: Only Influx DB 1 is supported!
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ The installation requires multiple steps:
|
|||||||
|
|
||||||
1. Get the right hardware and wire it up
|
1. Get the right hardware and wire it up
|
||||||
1. Flash the firmware onto the ESP32
|
1. Flash the firmware onto the ESP32
|
||||||
1. Write the data to the SD-Card
|
1. Write the data to the SD card
|
||||||
1. Start it
|
1. Start it
|
||||||
|
|
||||||
For point 2 and 3 we provide multiple ways to do it. Pick the one that looks the easiest for you!
|
For point 2 and 3 we provide multiple ways to do it. Pick the one that looks the easiest for you!
|
||||||
@@ -11,17 +11,17 @@ For point 2 and 3 we provide multiple ways to do it. Pick the one that looks the
|
|||||||
## 1. Hardware
|
## 1. Hardware
|
||||||
### ESP32-CAM
|
### ESP32-CAM
|
||||||
* OV2640 camera module
|
* OV2640 camera module
|
||||||
* Micro SD-Card slot
|
* Micro SD card slot
|
||||||
* 4 or 8 MB PSRAM.
|
* 4 or 8 MB PSRAM.
|
||||||
|
|
||||||
It can be easily found on the typical internet stores, searching for ESP32-CAM for less than 10 EUR.
|
It can be easily found on the typical internet stores, searching for ESP32-CAM for less than 10 EUR.
|
||||||
How ever since the hardware is cheap and coming from China, you unluckily could pick a malfunction device. See [Hardware Compatibility](../Hardware-Compatibility) for further advice!
|
How ever since the hardware is cheap and coming from China, you unluckily could pick a malfunctioning device. See [Hardware Compatibility](../Hardware-Compatibility) for further advice!
|
||||||
|
|
||||||
### USB->UART interface
|
### USB->UART interface
|
||||||
For first time flashing the firmware a USB -> UART connector is needed. Later firmware upgrades than can be flashed via OTA.
|
For first time flashing the firmware a USB -> UART connector is needed. Later firmware upgrades than can be flashed via OTA.
|
||||||
|
|
||||||
### Power supply
|
### Power supply
|
||||||
For power supply a 5V source is needed. Most easily this can be done via an USB power supply. The power supply should support minimum 500mA. For buffering current peaks some users reported to use a large elco condensator like a 2200uF between ground and VCC.
|
For power supply a 5V source is needed. Most easily this can be done via a USB power supply. The power supply should support minimum 500mA. For buffering current peaks some users reported to use a large electrolytic capacitor like a 2200uF between ground and VCC.
|
||||||
|
|
||||||
**:bangbang: Attention:** in several internet forums there are problems reported, in case the ESP32-CAM is only supplied with 3.3V.
|
**:bangbang: Attention:** in several internet forums there are problems reported, in case the ESP32-CAM is only supplied with 3.3V.
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ A example for wiring can be found here:
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
It is also possible to use external LEDs for the illumination instead of the internal flash LED. This is described here: [[External-LED]]
|
It is also possible to use external LEDs for the illumination instead of the internal flash LED. This is described [here](../External-LED)
|
||||||
|
|
||||||
## 2. Firmware
|
## 2. Firmware
|
||||||
### Web Installer
|
### Web Installer
|
||||||
@@ -61,7 +61,7 @@ You can access it with the following link: [Web Installer](https://jomjol.github
|
|||||||
Grab the firmware from the
|
Grab the firmware from the
|
||||||
|
|
||||||
- [Releases page](https://github.com/jomjol/AI-on-the-edge-device/releases) (Stable, tested versions), or the
|
- [Releases page](https://github.com/jomjol/AI-on-the-edge-device/releases) (Stable, tested versions), or the
|
||||||
- [Automatically build development branch](https://github.com/jomjol/AI-on-the-edge-device/actions?query=branch%3Arolling) (experimental, untested versions). Please have a look on [Living on the Edge](../rolling-installation)] first!
|
- [Automatically build development branch](https://github.com/jomjol/AI-on-the-edge-device/actions?query=branch%3Arolling) (experimental, untested versions). Please have a look on [Living on the Edge](../rolling-installation) first!
|
||||||
|
|
||||||
You need:
|
You need:
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ Get the [Flash Download Tool](https://www.espressif.com/en/support/download/othe
|
|||||||
|
|
||||||
Download and extract the Flash tool, after starting choose "Developer Mode", then "ESP32-DownloadTool" and you are in the setup of the flashing tool. Connect the ESP32-CAM with the USB-UART connection and identify the COM-Port.
|
Download and extract the Flash tool, after starting choose "Developer Mode", then "ESP32-DownloadTool" and you are in the setup of the flashing tool. Connect the ESP32-CAM with the USB-UART connection and identify the COM-Port.
|
||||||
|
|
||||||
:bangbang: **Attention**: if you reflashing the code again, it is strongly recommended to erase the flash memory before flashing the firmware. Especially if you used OTA in between, which might cause remaining information on the flash, to still boot from an old image in the OTA-area, which is not erased by a normal flash.
|
:bangbang: **Attention**: if you are re-flashing the code again, it is strongly recommended to erase the flash memory before flashing the firmware. Especially if you used OTA in between, which might cause remaining information on the flash, to still boot from an old image in the OTA-area, which is not erased by a normal flash.
|
||||||
|
|
||||||
But your ESP32 in bootloader mode and push start, then it will identify the board and you can configure the bin-configuration according to the following table:
|
But your ESP32 in bootloader mode and push start, then it will identify the board and you can configure the bin-configuration according to the following table:
|
||||||
|
|
||||||
@@ -95,50 +95,50 @@ Here you need to install the esptool:
|
|||||||
```
|
```
|
||||||
pip install esptool
|
pip install esptool
|
||||||
```
|
```
|
||||||
Then connect the ESP32 with the USB-UART connector to the system, put it in bootmode and with the following command you can erase the flash and flash bootloader, partitions and firmware in two steps:
|
Then connect the ESP32 with the USB-UART connector to the system, put it in boot mode and with the following command you can erase the flash and flash bootloader, partitions and firmware in two steps:
|
||||||
|
|
||||||
```
|
```
|
||||||
esptool erase_flash
|
esptool erase_flash
|
||||||
esptool write_flash 0x01000 bootloader.bin 0x08000 partitions.bin 0x10000 firmware.bin
|
esptool write_flash 0x01000 bootloader.bin 0x08000 partitions.bin 0x10000 firmware.bin
|
||||||
```
|
```
|
||||||
- Maybe you need to specify the COM-port if it is not detected by default.
|
- Maybe you need to specify the COM-port if it is not detected by default.
|
||||||
- If the erase command throws the error `A fatal error occurred: ESP32 ROM does not support function erase_flash.`, your `esptool` might be too old, see https://techoverflow.net/2022/02/08/how-to-fix-esp32-a-fatal-error-occurred-esp32-rom-does-not-support-function-erase_flash/
|
- If the erase command throws the error `A fatal error occurred: ESP32 ROM does not support function erase_flash.`, your `esptool` might be too old, see <https://techoverflow.net/2022/02/08/how-to-fix-esp32-a-fatal-error-occurred-esp32-rom-does-not-support-function-erase_flash/>
|
||||||
|
|
||||||
With some Python installations this may not work and you’ll receive an error, try `python -m pip install esptool` or `pip3 install esptool`
|
With some Python installations this may not work and you’ll receive an error, try `python -m pip install esptool` or `pip3 install esptool`.
|
||||||
|
|
||||||
Further recommendations can be found on the [espressif webpage](https://docs.espressif.com/projects/esptool/en/latest/esp32/installation.html)
|
Further recommendations can be found on the [espressif webpage](https://docs.espressif.com/projects/esptool/en/latest/esp32/installation.html).
|
||||||
|
|
||||||
## 3. SD-Card
|
## 3. SD Card
|
||||||
The software expects a SD-Card prepared with certain directory and file structure in order to work properly.
|
The software expects an SD card prepared with certain directory and file structure in order to work properly.
|
||||||
SD-Card most top directory should look like this:
|
SD card most top directory should look like this:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
This initial setup needs only to be done **once** as further updates (Firmware as well as SD-Card content) are possible with the [Over-The-Air Update](ota.md) mechanism.
|
This initial setup needs only to be done **once** as further updates (Firmware as well as SD card content) are possible with the [Over-The-Air Update](ota.md) mechanism.
|
||||||
|
|
||||||
#### Notes
|
#### Notes
|
||||||
- Due to the limited availability of GPIOs (OV2640, Flash-Light, PSRAM & SD-Card) the communication mode to the SD card is limited to 1-line SD-Mode. It showed up, that this results in problems with very large SD-Cards (64GB, sometimes 32 GB) and some no name low cost SD-cards.
|
- Due to the limited availability of GPIOs (OV2640, Flash-Light, PSRAM & SD card) the communication mode to the SD card is limited to 1-line SD-Mode. It showed up, that this results in problems with very large SD-Cards (64GB, sometimes 32 GB) and some no name low cost SD-cards.
|
||||||
- There must be no partition table on the SD-card (no GPT, but only MBR for the single partition)
|
- There must be no partition table on the SD-card (no GPT, but only MBR for the single partition)
|
||||||
- Following setting are necessary for formating the SD-card: **SINGLE PARTITION, MBR, FAT32 - 32K. NOT exFAT**
|
- Following setting are necessary for formatting the SD-card: **SINGLE PARTITION, MBR, FAT32 - 32K. NOT exFAT**
|
||||||
- Some ESP32 devices share their SD-card and/or camera GPIOs with the pins for TX and RX. If you see errors like “Failed to connect” then your chip is probably not entering the bootloader properly. Remove the respective modules temporarily to free the GPIOs for flashing. You may find more information about troubleshooting on the [homepage of Espressif](https://docs.espressif.com/projects/esptool/en/latest/esp8266/troubleshooting.html).
|
- Some ESP32 devices share their SD-card and/or camera GPIOs with the pins for TX and RX. If you see errors like “Failed to connect” then your chip is probably not entering the bootloader properly. Remove the respective modules temporarily to free the GPIOs for flashing. You may find more information about troubleshooting on the [homepage of Espressif](https://docs.espressif.com/projects/esptool/en/latest/esp8266/troubleshooting.html).
|
||||||
|
|
||||||
**The ESP32 indicates problems with the SD card during startup with a fast, endless blinking.**
|
**The ESP32 indicates problems with the SD card during startup with a fast, endless blinking.**
|
||||||
**In this case, please try another SD card.**
|
**In this case, please try another SD card.**
|
||||||
|
|
||||||
### Manual Setup with a SD-Card-Reader on a PC
|
### Manual Setup with an SD Card Reader on a PC
|
||||||
1. Take the `AI-on-the-edge-device__manual-setup__*.zip` from the [Release](https://github.com/jomjol/AI-on-the-edge-device/releases) page.
|
1. Take the `AI-on-the-edge-device__manual-setup__*.zip` from the [Release](https://github.com/jomjol/AI-on-the-edge-device/releases) page.
|
||||||
1. Open it and extract the `sd-card.zip`.
|
1. Open it and extract the `sd-card.zip`.
|
||||||
1. Open it and extract all files onto onto your SD-Card.
|
1. Open it and extract all files onto onto your SD card.
|
||||||
1. On the SD-Card, open the `wlan.ini` file and configure it as needed:
|
1. On the SD card, open the `wlan.ini` file and configure it as needed:
|
||||||
- Set the corresponding SSID and password
|
- Set the corresponding SSID and password
|
||||||
- The other parameters are optional
|
- The other parameters are optional
|
||||||
|
|
||||||
**Note:** The device provides a File Server which can be used to show, edit or delete the files on the SD-Card. For security reasons, the `wlan.ini` file is excluded from this and is hidden from external access to protect the password.
|
**Note:** The device provides a File Server which can be used to show, edit or delete the files on the SD card. For security reasons, the `wlan.ini` file is excluded from this and is hidden from external access to protect the password.
|
||||||
|
|
||||||
After this, you can insert the SD-Card into the ESP32 board and start it.
|
After this, you can insert the SD card into the ESP32 board and start it.
|
||||||
|
|
||||||
### Remote Setup using the built-in Access Point
|
### Remote Setup using the built-in Access Point
|
||||||
On startup of the ESP32, it checks if the `wlan.ini` or the `config/config.ini` are available on the SD-Card.
|
On startup of the ESP32, it checks if the `wlan.ini` or the `config/config.ini` are available on the SD card.
|
||||||
If not, the ESP32 switches to a special mode. In this mode, it provides a Wifi Access Point which can be used to add the missing `wlan.ini` or the `config/config.ini` file.
|
If not, the ESP32 switches to a special mode. In this mode, it provides a Wifi Access Point which can be used to add the missing `wlan.ini` or the `config/config.ini` file.
|
||||||
|
|
||||||
1. Take the `AI-on-the-edge-device__remote-setup__*.zip` from the [Release](https://github.com/jomjol/AI-on-the-edge-device/releases) page.
|
1. Take the `AI-on-the-edge-device__remote-setup__*.zip` from the [Release](https://github.com/jomjol/AI-on-the-edge-device/releases) page.
|
||||||
@@ -148,14 +148,14 @@ If not, the ESP32 switches to a special mode. In this mode, it provides a Wifi A
|
|||||||
|
|
||||||
The device has the following fixed IP: [http://192.168.4.1](http://192.168.4.1).
|
The device has the following fixed IP: [http://192.168.4.1](http://192.168.4.1).
|
||||||
|
|
||||||
1. Upload initial configuration to sd-card
|
1. Upload initial configuration to SD card
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Use the `select file` and `upload` button to start the upload.
|
Use the `select file` and `upload` button to start the upload.
|
||||||
A warning will show up if you have choosen a possible wrong file (without default configuration).
|
A warning will show up if you have chosen a possible wrong file (without default configuration).
|
||||||
|
|
||||||
1. Store WLAN acces information.
|
1. Store WLAN access information.
|
||||||
|
|
||||||
After the upload, a new page will be shown:
|
After the upload, a new page will be shown:
|
||||||
|
|
||||||
@@ -167,8 +167,8 @@ If not, the ESP32 switches to a special mode. In this mode, it provides a Wifi A
|
|||||||
|
|
||||||
**:bangbang: Attention:**
|
**:bangbang: Attention:**
|
||||||
|
|
||||||
- Carefully check your wifi settings. To change them later on, you need to take out the sd-card and edit the `wlan.ini` manually (or delete it and start again).
|
- Carefully check your wifi settings. To change them later on, you need to take out the SD card and edit the `wlan.ini` manually (or delete it and start again).
|
||||||
- The informations are transfered without encryption!
|
- The information is transferred without encryption!
|
||||||
|
|
||||||
Finish the step by pushing `Write wlan.ini`
|
Finish the step by pushing `Write wlan.ini`
|
||||||
|
|
||||||
@@ -185,7 +185,7 @@ If not, the ESP32 switches to a special mode. In this mode, it provides a Wifi A
|
|||||||
|
|
||||||
|
|
||||||
## 4. Initial Startup
|
## 4. Initial Startup
|
||||||
After the firmware is flashed and the SD-Card is setup properly, you can start it.
|
After the firmware is flashed and the SD card is setup properly, you can start it.
|
||||||
After power on the connection status is indicated by 3x blinking of the red on board LED.
|
After power on the connection status is indicated by 3x blinking of the red on board LED.
|
||||||
|
|
||||||
WLAN-Status indication:
|
WLAN-Status indication:
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
# Integration into Home Assistant
|
# Integration into Home Assistant
|
||||||
There are 3 ways to get the data into your Home Assistant:
|
There are 3 ways to get the data into your Home Assistant:
|
||||||
|
|
||||||
1. Using MQTT (Automatically Setup Entities using Homeassistant MQTT Discovery)
|
1. Using MQTT (Automatically Setup Entities using Home Assistant MQTT Discovery)
|
||||||
1. Using MQTT (Manually Setup Entities)
|
1. Using MQTT (Manually Setup Entities)
|
||||||
2. Using REST calls
|
2. Using REST calls
|
||||||
|
|
||||||
The first one is the easier way if you already have MQTT in use.
|
The first one is the easier way if you already have MQTT in use.
|
||||||
|
|
||||||
## Using MQTT (Automatically Setup Entities using Homeassistant MQTT Discovery)
|
## Using MQTT (Automatically Setup Entities using Home Assistant MQTT Discovery)
|
||||||
|
|
||||||
:bangbang: This feature will be available with the next release!
|
:bangbang: This feature will be available with the next release!
|
||||||
|
|
||||||
Starting with Version `>12.0.1`, AI-on-the-edge-devices support Homeassistant Discovery.
|
Starting with Version `>12.0.1`, AI-on-the-edge-devices support Home Assistant Discovery.
|
||||||
|
|
||||||
1. Check [here](https://www.home-assistant.io/integrations/mqtt/#mqtt-discovery) to learn more about it and how to enable it in Homeassistant.
|
1. Check [here](https://www.home-assistant.io/integrations/mqtt/#mqtt-discovery) to learn more about it and how to enable it in Homeassistant.
|
||||||
1. You also have to enable it in the MQTT settings of your device:
|
1. You also have to enable it in the MQTT settings of your device:
|
||||||
@@ -20,7 +20,7 @@ Starting with Version `>12.0.1`, AI-on-the-edge-devices support Homeassistant Di
|
|||||||
|
|
||||||
Make sure to select the right Meter Type to get the right units!
|
Make sure to select the right Meter Type to get the right units!
|
||||||
|
|
||||||
On the next start of the device, it will send discovery topics and Homeassistant should pick them up and show them under `Settings > Integrations > MQTT`:
|
On the next start of the device, it will send discovery topics and Home Assistant should pick them up and show them under `Settings > Integrations > MQTT`:
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||
@@ -39,7 +39,7 @@ mqtt:
|
|||||||
unique_id: watermeter_value
|
unique_id: watermeter_value
|
||||||
unit_of_measurement: 'm³'
|
unit_of_measurement: 'm³'
|
||||||
state_class: total_increasing
|
state_class: total_increasing
|
||||||
device_class: water # Needs Homeassistant 2022.11!
|
device_class: water # Needs Home Assistant 2022.11!
|
||||||
icon: 'mdi:water-pump'
|
icon: 'mdi:water-pump'
|
||||||
availability_topic: wasserzaehler/connection
|
availability_topic: wasserzaehler/connection
|
||||||
payload_available: connected
|
payload_available: connected
|
||||||
@@ -50,7 +50,7 @@ mqtt:
|
|||||||
unique_id: watermeter_rate
|
unique_id: watermeter_rate
|
||||||
unit_of_measurement: 'm³/min'
|
unit_of_measurement: 'm³/min'
|
||||||
state_class: measurement
|
state_class: measurement
|
||||||
device_class: water # Needs Homeassistant 2022.11!
|
device_class: water # Needs Home Assistant 2022.11!
|
||||||
icon: 'mdi:water-pump'
|
icon: 'mdi:water-pump'
|
||||||
availability_topic: wasserzaehler/connection
|
availability_topic: wasserzaehler/connection
|
||||||
payload_available: connected
|
payload_available: connected
|
||||||
@@ -126,7 +126,7 @@ Note that you also can add it using the UI.
|
|||||||

|

|
||||||
|
|
||||||
### Statistics Graph
|
### Statistics Graph
|
||||||
Creating Statistics Graphs (eg. usage per day) is easy using the [Energy Dashboard](https://www.home-assistant.io/home-energy-management/):
|
Creating Statistics Graphs (e.g. usage per day) is easy using the [Energy Dashboard](https://www.home-assistant.io/home-energy-management/):
|
||||||

|

|
||||||
|
|
||||||
Note that there seems to be a bug in the graph, see [https://github.com/home-assistant/frontend/issues/13995](https://github.com/home-assistant/frontend/issues/13995)!
|
Note that there seems to be a bug in the graph, see [https://github.com/home-assistant/frontend/issues/13995](https://github.com/home-assistant/frontend/issues/13995)!
|
||||||
@@ -136,7 +136,7 @@ Note that there seems to be a bug in the graph, see [https://github.com/home-ass
|
|||||||
|
|
||||||
See also [Influx-DB](../Influx-DB).
|
See also [Influx-DB](../Influx-DB).
|
||||||
|
|
||||||
If you have setup InfluxDB already, it is also possible to fetch statistics from there, eg. daily usage:
|
If you have setup InfluxDB already, it is also possible to fetch statistics from there, e.g. daily usage:
|
||||||
```
|
```
|
||||||
from(bucket: "HomeAssistant")
|
from(bucket: "HomeAssistant")
|
||||||
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|
||||||
@@ -155,7 +155,7 @@ When using REST, Home Assistant has to periodically call an URL on the ESP32 whi
|
|||||||
|
|
||||||
See [REST API](../REST-API) for a list of available URLs.
|
See [REST API](../REST-API) for a list of available URLs.
|
||||||
|
|
||||||
The most practical one is the `json` entrypoint which provides the most relevant data JSON formated:
|
The most practical one is the `json` entrypoint which provides the most relevant data JSON formatted:
|
||||||
`http://<IP>/json`
|
`http://<IP>/json`
|
||||||
This would return:
|
This would return:
|
||||||
```JSON
|
```JSON
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ The following parameters have to be defined:
|
|||||||
* #### Rate
|
* #### Rate
|
||||||
|
|
||||||
* #### Rate_per_time_unit
|
* #### Rate_per_time_unit
|
||||||
The time Unit gets set with the Homeassistant Discovery, eg. `h` or `m` (minutes)
|
The time Unit gets set with the Home Assistant Discovery, e.g. `h` or `m` (minutes)
|
||||||
|
|
||||||
* #### Rate_per_digitalization_round
|
* #### Rate_per_digitalization_round
|
||||||
The `interval` defines when the next round gets triggered
|
The `interval` defines when the next round gets triggered
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ No setting of the type in the firmware is necessary. The type can detect by the
|
|||||||
Technically a wrong network will work and create output, but that would be totally arbitrary
|
Technically a wrong network will work and create output, but that would be totally arbitrary
|
||||||
* Not all type of pointers are trained in all networks.
|
* Not all type of pointers are trained in all networks.
|
||||||
* For the 11 classes digits network there many different types of digits trained. The reason is, that you 1) only need 20-30 training images and 2) the data collection is ongoing much longer
|
* For the 11 classes digits network there many different types of digits trained. The reason is, that you 1) only need 20-30 training images and 2) the data collection is ongoing much longer
|
||||||
* For the continious and 100 classes network especially for the digits, there are only a few types of digits trained up to now
|
* For the continuous and 100 classes network especially for the digits, there are only a few types of digits trained up to now
|
||||||
* Therefore sometimes for the digits it is more effective to choose the simpler 11 classes network type (= default).
|
* Therefore sometimes for the digits it is more effective to choose the simpler 11 classes network type (= default).
|
||||||
|
|
||||||
|
|
||||||
@@ -63,7 +63,7 @@ Example: `dig-class11_1410_s2_q.tflite`
|
|||||||
|
|
||||||
### Analog Pointer ("ana-cont_XXX.tflite" & "ana-class100_XXX.tflite")
|
### Analog Pointer ("ana-cont_XXX.tflite" & "ana-class100_XXX.tflite")
|
||||||
|
|
||||||
This is to transfer the direction of a pointer into a continuous number between 0 and 1, whereas 0 (=1) is the upwards position (12 o'clock), 0.25 corresponds to the 3 o'clock positions and so on. This network is a envolop for all different types of pointers. Currently there are no dedicated network trainings for specific types of pointers.
|
This is to transfer the direction of a pointer into a continuous number between 0 and 1, whereas 0 (=1) is the upwards position (12 o'clock), 0.25 corresponds to the 3 o'clock positions and so on. This network is a envelop for all different types of pointers. Currently there are no dedicated network trainings for specific types of pointers.
|
||||||
|
|
||||||
There are two types of network structure, currently both are supported. The "class100" is a pure classification network, that might need a bit more accuracy in the labeling. "cont" is a no classic approach with a continuous output off only 2 neurons (details see below).
|
There are two types of network structure, currently both are supported. The "class100" is a pure classification network, that might need a bit more accuracy in the labeling. "cont" is a no classic approach with a continuous output off only 2 neurons (details see below).
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ There are two types of network structure, currently both are supported. The "cla
|
|||||||
#### Training data needs
|
#### Training data needs
|
||||||
|
|
||||||
* Quadratic images, minimum size: 32x32 pixel
|
* Quadratic images, minimum size: 32x32 pixel
|
||||||
* Typically 100 - 200 images with a resultion of 1/100 of the full rotation (every 0.1 value or 3.6°)
|
* Typically 100 - 200 images with a resolution of 1/100 of the full rotation (every 0.1 value or 3.6°)
|
||||||
* Naming: x.y_ARBITRARY.jpg, where x.y = value 0.0 ... 9.9
|
* Naming: x.y_ARBITRARY.jpg, where x.y = value 0.0 ... 9.9
|
||||||
|
|
||||||
#### CNN Technical details:
|
#### CNN Technical details:
|
||||||
@@ -89,8 +89,8 @@ There are two types of network structure, currently both are supported. The "cla
|
|||||||
##### Output
|
##### Output
|
||||||
|
|
||||||
* **ana-cont**_XXX.tflite:
|
* **ana-cont**_XXX.tflite:
|
||||||
* 2 neurons with output in range [-1, 1] - representing a sinus / cosinus encoding of the angle
|
* 2 neurons with output in range [-1, 1] - representing a sinus / cosine encoding of the angle
|
||||||
* needs to be converted to angle with arctan-hyperbolicus function
|
* needs to be converted to angle with arctan-hyperbolic function
|
||||||
|
|
||||||
* **ana-class100**_XXX.tflite
|
* **ana-class100**_XXX.tflite
|
||||||
* 100 neurons representing the classes from 0.0, 0.1, ... 9.8, 9.9
|
* 100 neurons representing the classes from 0.0, 0.1, ... 9.8, 9.9
|
||||||
@@ -129,13 +129,13 @@ The digit type is a classical classification network, with 11 classes representi
|
|||||||
|
|
||||||
* 11 neurons for image classification (last layer normalized to 1)
|
* 11 neurons for image classification (last layer normalized to 1)
|
||||||
* Neuron 0 to 9 represent the corresponding numbers "0" to "9"
|
* Neuron 0 to 9 represent the corresponding numbers "0" to "9"
|
||||||
* Neron 10 represent the "Not-A-Number" class, telling, that the image is not uniquely classified
|
* Neuron 10 represents the "Not-A-Number" class, telling, that the image is not uniquely classified
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Digits with rolling results ("dig-class100_XXX.tflite" & "dig-cont_XXX.tflite")
|
### Digits with rolling results ("dig-class100_XXX.tflite" & "dig-cont_XXX.tflite")
|
||||||
|
|
||||||
This type of network tries to overcome the problem, that there are intermediate values, when a rolling digit is between two numbers. Previous this was the "N" class. In this network type, there are also subdigit values trained, so that the intermediate state can be used as additional information for the algorithms.
|
This type of network tries to overcome the problem, that there are intermediate values, when a rolling digit is between two numbers. Previous this was the "N" class. In this network type, there are also sub-digit values trained, so that the intermediate state can be used as additional information for the algorithms.
|
||||||
|
|
||||||
|
|
||||||
#### Types of counters trained:
|
#### Types of counters trained:
|
||||||
@@ -164,8 +164,7 @@ This type of network tries to overcome the problem, that there are intermediate
|
|||||||
|
|
||||||
* **dig-cont**_XXX.tflite:
|
* **dig-cont**_XXX.tflite:
|
||||||
* 10 neurons representing the digits 0, 1, ... 9. The intermediate values are represented by weighted normalized values of two neighboring output neurons
|
* 10 neurons representing the digits 0, 1, ... 9. The intermediate values are represented by weighted normalized values of two neighboring output neurons
|
||||||
* needs to be converted to angle with arctan-hyperbolicus function
|
* needs to be converted to angle with arctan-hyperbolic function
|
||||||
|
|
||||||
* **dig-class100**_XXX.tflite
|
* **dig-class100**_XXX.tflite
|
||||||
* 100 neurons representing the classes from 0.0, 0.1, ... 9.8, 9.9
|
* 100 neurons representing the classes from 0.0, 0.1, ... 9.8, 9.9
|
||||||
|
|
||||||
|
|||||||
@@ -20,4 +20,4 @@ See also [Github Documentation](https://docs.github.com/en/account-and-profile/m
|
|||||||
|
|
||||||
Alternatively or if you do not want to create a Github account, [CodeRelease.io](https://coderelease.io) can be an alternative.
|
Alternatively or if you do not want to create a Github account, [CodeRelease.io](https://coderelease.io) can be an alternative.
|
||||||
|
|
||||||
You also have to subscribe with an emailaddress but no account is required.
|
You also have to subscribe with an email address but no account is required.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# REST API
|
# REST API
|
||||||
Various information is directly accessible over specific REST calls.
|
Various information is directly accessible over specific REST calls.
|
||||||
|
|
||||||
To use it, just append them to the IP, separated with a `/`, eg. `http://192.168.1.1/json`
|
To use it, just append them to the IP, separated with a `/`, e.g. `http://192.168.1.1/json`
|
||||||
|
|
||||||
Note: For more detailed information to the REST handler, have a look to the code in the repository: [registered handlers](https://github.com/jomjol/AI-on-the-edge-device/search?q=camuri.uri)
|
Note: For more detailed information to the REST handler, have a look to the code in the repository: [registered handlers](https://github.com/jomjol/AI-on-the-edge-device/search?q=camuri.uri)
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ Note: For more detailed information to the REST handler, have a look to the code
|
|||||||
Show last aligned image
|
Show last aligned image
|
||||||
|
|
||||||
* ### img_tmp/alg_roi.jpg
|
* ### img_tmp/alg_roi.jpg
|
||||||
Show last aligned image incuding ROI overlay
|
Show last aligned image including ROI overlay
|
||||||
|
|
||||||
## Status
|
## Status
|
||||||
* ### statusflow
|
* ### statusflow
|
||||||
@@ -82,7 +82,7 @@ Note: For more detailed information to the REST handler, have a look to the code
|
|||||||
|
|
||||||
* ### sysinfo
|
* ### sysinfo
|
||||||
Show system infos in JSON syntax
|
Show system infos in JSON syntax
|
||||||
- Example: [{"firmware": "","buildtime": "2023-01-25 12:41","gitbranch": "HEAD","gittag": "","gitrevision": "af13c68+","html": "Development-Branch: HEAD (Commit: af13c68+)","cputemp": "64","hostname": "WaterMeterTest","IPv4": "192.168.xxx.xxx","freeHeapMem": "2818330"}]
|
- Example: `[{"firmware": "","buildtime": "2023-01-25 12:41","gitbranch": "HEAD","gittag": "","gitrevision": "af13c68+","html": "Development-Branch: HEAD (Commit: af13c68+)","cputemp": "64","hostname": "WaterMeterTest","IPv4": "192.168.xxx.xxx","freeHeapMem": "2818330"}]`
|
||||||
|
|
||||||
* ### starttime
|
* ### starttime
|
||||||
Show starttime
|
Show starttime
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ In order to use it for reading a meter, the focal-length of the OV2640 camera h
|
|||||||
|
|
||||||
**ATTENTION:** this modification will void any warranty, as the sealing of the lens objective is broken!
|
**ATTENTION:** this modification will void any warranty, as the sealing of the lens objective is broken!
|
||||||
|
|
||||||
**ATTENTION:** This modification will render the camera unsuitable for general, web-cam type applications unless the focal length is changed back to the original setting.
|
**ATTENTION:** This modification will render the camera unsuitable for general, web-cam type applications unless the focal length is changed back to the original setting.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -79,4 +79,3 @@ Here an example:
|
|||||||
| ------------ | --------------------------------- |
|
| ------------ | --------------------------------- |
|
||||||
| :heavy_check_mark: **Okay** | <img width="125" alt="dig-class100_OK" src="https://user-images.githubusercontent.com/412645/199028380-7623776e-59b9-4356-ab55-3852253609df.png"> |
|
| :heavy_check_mark: **Okay** | <img width="125" alt="dig-class100_OK" src="https://user-images.githubusercontent.com/412645/199028380-7623776e-59b9-4356-ab55-3852253609df.png"> |
|
||||||
| :x: **Not** Okay | <img width="125" alt="dig-class100_NOK" src="https://user-images.githubusercontent.com/412645/199028469-3a69ed31-e5c9-4038-a8dc-6d44a42437ed.png"> |
|
| :x: **Not** Okay | <img width="125" alt="dig-class100_NOK" src="https://user-images.githubusercontent.com/412645/199028469-3a69ed31-e5c9-4038-a8dc-6d44a42437ed.png"> |
|
||||||
|
|
||||||
|
|||||||
@@ -34,11 +34,11 @@ Now you can use Visual Studio Code or a standard console to upload the test code
|
|||||||
<img width="467" alt="image" src="https://user-images.githubusercontent.com/412645/209813917-ea7fca50-2553-4acf-a8af-ecdac84a01ea.png">
|
<img width="467" alt="image" src="https://user-images.githubusercontent.com/412645/209813917-ea7fca50-2553-4acf-a8af-ecdac84a01ea.png">
|
||||||
|
|
||||||
|
|
||||||
Alternativ you can run it in console/terminal with `platformio test --environment esp32cam`.
|
Alternatively you can run it in console/terminal with `platformio test --environment esp32cam`.
|
||||||
|
|
||||||
In my environment the serial terminal not opens. I have to do it for myself. You will see much logging. If any test fails it logs it out. Else it logs all test passed in the end.
|
In my environment the serial terminal not opens. I have to do it for myself. You will see much logging. If any test fails it logs it out. Else it logs all test passed in the end.
|
||||||
|
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
If you test very much cases in one function, the device runs in stackoverflow and an endless boot. Reduce the count of test cases or split the test function in multiple functions.
|
If you test very much cases in one function, the device runs in Stack Overflow and an endless boot. Reduce the count of test cases or split the test function in multiple functions.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Scripted File Upload
|
# Scripted File Upload
|
||||||
To upload a file eg. using `curl`, you first have to delete it and then upload it:
|
To upload a file e.g. using `curl`, you first have to delete it and then upload it:
|
||||||
```
|
```
|
||||||
curl -d '' http://192.168.1.153/delete/html/index.html
|
curl -d '' http://192.168.1.153/delete/html/index.html
|
||||||
curl --data-binary @ota_page.html http://192.168.1.153/upload/html/index.html
|
curl --data-binary @ota_page.html http://192.168.1.153/upload/html/index.html
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Analog/Digital Transition on Watermeters
|
# Analog/Digital Transition on Water Meters
|
||||||
|
|
||||||
At first, for the most watermeters the default configuration should be work. But the digit, especially the last digit differs in some devices.
|
At first, for the most water meters the default configuration should be work. But the digit, especially the last digit differs in some devices.
|
||||||
|
|
||||||
## "Normal" transition
|
## "Normal" transition
|
||||||
|
|
||||||
@@ -29,4 +29,3 @@ The models for image recognition are good, but have inaccuracies in the range +/
|
|||||||
## How to configure for my meter type
|
## How to configure for my meter type
|
||||||
|
|
||||||
If you have a devices with "normal" transition you should not have any issues. On devices with "early" transition, you can set the option `AnalogDigitalTransitionStart` to a value between 6 and 8.
|
If you have a devices with "normal" transition you should not have any issues. On devices with "early" transition, you can set the option `AnalogDigitalTransitionStart` to a value between 6 and 8.
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Collect images to improve the models
|
# Collect images to improve the models
|
||||||
If your device has new, different digits or pointers it might be that the existing models don't recognize them well. In such case you can collect your images and so we can train the model better. This helps you and also others as the models get more accurate. Adding more images also helps if you have a model that is already known, but the neural models do not produce good results.
|
If your device has new, different digits or pointers it might be that the existing models don't recognize them well. In such case you can collect your images and so we can train the model better. This helps you and also others as the models get more accurate. Adding more images also helps if you have a model that is already known, but the neural models do not produce good results.
|
||||||
|
|
||||||
Experienced users can do the training also by themself, see [Learn a model with your own images](Learn-models-with-your-own-images.md).
|
Experienced users can do the training also by themselves, see [Learn a model with your own images](Learn-models-with-your-own-images.md).
|
||||||
|
|
||||||
## Before you start
|
## Before you start
|
||||||
Before you go ahead, please check if your digits/pointers are not yet contained in the training data. A visual overview is available at [digits](https://jomjol.github.io/neural-network-digital-counter-readout) resp. [pointers](https://jomjol.github.io/neural-network-analog-needle-readout/).
|
Before you go ahead, please check if your digits/pointers are not yet contained in the training data. A visual overview is available at [digits](https://jomjol.github.io/neural-network-digital-counter-readout) resp. [pointers](https://jomjol.github.io/neural-network-analog-needle-readout/).
|
||||||
@@ -11,27 +11,27 @@ Poor recognition is often caused by blurred images, low contrast or incorrect se
|
|||||||
## Collecting images
|
## Collecting images
|
||||||
The neural network is trained based on a set of images that have already been collected over time. If your digits are included or at least very similar to included images, the chance is very high that the neural network is working fine for you as well.
|
The neural network is trained based on a set of images that have already been collected over time. If your digits are included or at least very similar to included images, the chance is very high that the neural network is working fine for you as well.
|
||||||
|
|
||||||
The neural network configuration is stored in the TensorFlow Lite format as `*.tfl` or `*.tflite` in the `/config` directory on the SD-Card. A model can be updated (or a new one added) by uploading the new file and activating it on the configuration page or in the config file `/config/config.ini`.
|
The neural network configuration is stored in the TensorFlow Lite format as `*.tfl` or `*.tflite` in the `/config` directory on the SD card. A model can be updated (or a new one added) by uploading the new file and activating it on the configuration page or in the config file `/config/config.ini`.
|
||||||
|
|
||||||
In order to incorporate new digits a training set of images is required. The training images needs to be collected in the final setup with the help of the `Digits` or `Analog` log settings (not to be confused with the `Data` or `Debug` log). Enable the logging of the images on the configuration page or in the config file `/config/config.ini`:
|
In order to incorporate new digits a training set of images is required. The training images needs to be collected in the final setup with the help of the `Digits` or `Analog` log settings (not to be confused with the `Data` or `Debug` log). Enable the logging of the images on the configuration page or in the config file `/config/config.ini`:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Now be patient! You have to wait until it has collected an image of each digit of every type. They wil lbe placed on the SD-Card inthe folder `/log/digit/` resp. `/log/anaolog/`.
|
Now be patient! You have to wait until it has collected an image of each digit of every type. They wil lbe placed on the SD card in the folder `/log/digit/` resp. `/log/analog/`.
|
||||||
|
|
||||||
After some days, there will be a lot of images, many of them very similar. Because of this, it is important to select only a subset of them for the model training.
|
After some days, there will be a lot of images, many of them very similar. Because of this, it is important to select only a subset of them for the model training.
|
||||||
|
|
||||||
The tools shown below can help you with that.
|
The tools shown below can help you with that.
|
||||||
|
|
||||||
## Collecting images for dig-class100/dig-cont/ana-class100
|
## Collecting images for dig-class100/dig-cont/ana-class100
|
||||||
For digits use [Collectmeterdigits](https://github.com/haverland/collectmeterdigits) resp. for pointers use [collectmeteranalog](https://github.com/haverland/collectmeteranalog) to fetch the images from the device and select a subset of them. Please read the detailed instructions on the mentionded links for details!
|
For digits use [Collectmeterdigits](https://github.com/haverland/collectmeterdigits) resp. for pointers use [collectmeteranalog](https://github.com/haverland/collectmeteranalog) to fetch the images from the device and select a subset of them. Please read the detailed instructions on the mentioned links for details!
|
||||||
|
|
||||||
If the fetching of the images is too slow for you, a faster way to get the images to your PC is to remove the SD-card from the ESP32 module and insert it into the card reader of yur PC.
|
If the fetching of the images is too slow for you, a faster way to get the images to your PC is to remove the SD-card from the ESP32 module and insert it into the card reader of yur PC.
|
||||||
Then search for two..three images of each digit (**not more! :-)**). You will have to make sure to label the images yourself matching the effective value they are supposed to show.
|
Then search for two..three images of each digit (**not more! :-)**). You will have to make sure to label the images yourself matching the effective value they are supposed to show.
|
||||||
|
|
||||||
|
|
||||||
## Share your images
|
## Share your images
|
||||||
In most cases we will integrate your images in the training dataset of the models. Only if we fear a degradation of the models or you need a different behaviour, we might not include the data in the standard models (see at bottom of page for reasons).
|
In most cases we will integrate your images in the training dataset of the models. Only if we fear a degradation of the models or you need a different behavior, we might not include the data in the standard models (see at bottom of page for reasons).
|
||||||
|
|
||||||
To provide your images to us for training the model, open an [Github Issue](https://github.com/jomjol/AI-on-the-edge-device/issues/new/choose) and append the zipped images ito it.
|
To provide your images to us for training the model, open an [Github Issue](https://github.com/jomjol/AI-on-the-edge-device/issues/new/choose) and append the zipped images ito it.
|
||||||
|
|
||||||
|
|||||||
@@ -4,17 +4,17 @@ Welcome to the AI-on-the-edge-device project!
|
|||||||
|
|
||||||
This is the documentation. For the source code, please head to [github.com/jomjol/AI-on-the-edge-device](https://github.com/jomjol/AI-on-the-edge-device).
|
This is the documentation. For the source code, please head to [github.com/jomjol/AI-on-the-edge-device](https://github.com/jomjol/AI-on-the-edge-device).
|
||||||
|
|
||||||
Artificial intelligence based systems have been established in our every days live. Just think of speech or image recognition. Most of the systems relay on either powerful processors or a direct connection to the cloud for doing the calculations up there. With the increasing power of modern processors the AI systems are coming closer to the end user - which is usually called **edge computing**.
|
Artificial intelligence based systems have been established in our everyday lives. Just think of speech or image recognition. Most of the systems rely on either powerful processors or a direct connection to the cloud for doing the calculations up there. With the increasing power of modern processors the AI systems are coming closer to the end user - which is usually called **edge computing**.
|
||||||
Here this edge computing is brought into a practical oriented example, where a AI network is implemented on a ESP32 device so: **AI on the edge**.
|
Here this edge computing is brought into a practice-oriented example, where a AI network is implemented on a ESP32 device so: **AI on the edge**.
|
||||||
|
|
||||||
## Key features
|
## Key features
|
||||||
- Tensorflow Lite (TFlite) integration - including easy to use wrapper
|
- Tensorflow Lite (TFlite) integration - including easy to use wrapper
|
||||||
- Inline Image processing (feature detection, alignment, ROI extraction)
|
- Inline image processing (feature detection, alignment, ROI extraction)
|
||||||
- **Small** and **cheap** device (3x4.5x2 cm³, < 10 EUR)
|
- **Small** and **cheap** device (3x4.5x2 cm³, < 10 EUR)
|
||||||
- camera and illumination integrated
|
- Camera and illumination integrated
|
||||||
- Web surface to administrate and control
|
- Web surface to administrate and control
|
||||||
- OTA-Interface to update directly through the web interface
|
- OTA-Interface to update directly through the web interface
|
||||||
- Full integration into Homeassistant
|
- Full integration into Home Assistant
|
||||||
- Support for Influx DB 1
|
- Support for Influx DB 1
|
||||||
- MQTT
|
- MQTT
|
||||||
- REST API
|
- REST API
|
||||||
@@ -44,10 +44,10 @@ Here this edge computing is brought into a practical oriented example, where a A
|
|||||||
|
|
||||||
This is about image recognition and digitalization, done totally on a cheap ESP32 board using artificial intelligence in form of convolutional neural networks (CNN). Everything, from image capture (OV2640), image preprocessing (auto alignment, ROI identification) all the way down to the image recognition (CNN structure) and result plausibility is done on a cheap 10 EUR device.
|
This is about image recognition and digitalization, done totally on a cheap ESP32 board using artificial intelligence in form of convolutional neural networks (CNN). Everything, from image capture (OV2640), image preprocessing (auto alignment, ROI identification) all the way down to the image recognition (CNN structure) and result plausibility is done on a cheap 10 EUR device.
|
||||||
|
|
||||||
This all is integrated in an easy to do setup and use environment, taking care for all the background processing and handling, including regular job scheduler. The user interface is an integrated web server, that can be easily adjusted an offers the data as an API in different options.
|
This all is integrated in an easy to do setup and use environment, taking care for all the background processing and handling, including regular job scheduler. The user interface is an integrated web server, that can be easily adjusted and offers the data as an API in different options.
|
||||||
|
|
||||||
The task to be demonstrated here is a automated readout of an analog water meter. The water consumption is to be recorded within a house automatization and the water meter is totally analog without any electronic interface. Therefore the task is solved by taking regularly an image of the water meter and digitize the reading.
|
The task to be demonstrated here is an automated readout of an analog water meter. The water consumption is to be recorded within a house automatization and the water meter is totally analog without any electronic interface. Therefore, the task is solved by regularly taking an image of the water meter and digitizing the reading.
|
||||||
|
|
||||||
There are two types of CNN implemented, a classification network for reading the digital numbers and a single output network for digitalize the analog pointers for the sub digit readings.
|
There are two types of CNN implemented, a classification network for reading the digital numbers and a single output network for digitalize the analog pointers for the sub digit readings.
|
||||||
|
|
||||||
This project is a evolution of the [water-meter-system-complete](https://github.com/jomjol/water-meter-system-complete), which uses ESP32-CAM just for taking the image and a 1GB-Docker image to run the neural networks backbone. Here everything is integrated in an ESP32-CAM module with 8MB of RAM and a SD-Card as data storage.
|
This project is an evolution of the [water-meter-system-complete](https://github.com/jomjol/water-meter-system-complete), which uses ESP32-CAM just for taking the image and a 1GB-Docker image to run the neural network's backbone. Here everything is integrated in an ESP32-CAM module with 8MB of RAM and a SD card as data storage.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Initial Setup
|
# Initial Setup
|
||||||
|
|
||||||
After setting up the device (firmware, sd-card, wlan) the device will connect to the wifi access point and start in an initial setup configuration:
|
After setting up the device (firmware, SD card, WLAN) the device will connect to the wifi access point and start in an initial setup configuration:
|
||||||
|
|
||||||
{: style="width:500px"}
|
{: style="width:500px"}
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ Ensure an **exact horizontal alignment** of the number via the alignment / refer
|
|||||||
| --------------------------- | ------------------------------- |
|
| --------------------------- | ------------------------------- |
|
||||||
|  |  |
|
|  |  |
|
||||||
|
|
||||||
**:bangbang: Attention:** Updating the reference image, also means, that all alignment images and ROIs needs to be teached again. Therefore do this step later only with caution.
|
**:bangbang: Attention:** Updating the reference image, also means, that all alignment images and ROIs needs to be taught again. Therefore do this step later only with caution.
|
||||||
|
|
||||||
If everything is done, you can save the result with "Update Reference Image" (4). Please do not reboot at this stage, but go to the next section.
|
If everything is done, you can save the result with "Update Reference Image" (4). Please do not reboot at this stage, but go to the next section.
|
||||||
|
|
||||||
@@ -58,11 +58,11 @@ First of all, if you don't have that kind of numbers on you meter, you can disab
|
|||||||
|
|
||||||
In contrast to the reference images, here there are more ROIs possible. You can switch between them with the drop down box (2). If you need additional ROIs or delete them you can do this with the control at (2).
|
In contrast to the reference images, here there are more ROIs possible. You can switch between them with the drop down box (2). If you need additional ROIs or delete them you can do this with the control at (2).
|
||||||
|
|
||||||
**Attention:** The order of the ROIs defines, how the indiviual digits are combined to the total number. The first ROI is the digit with the highest order, then the second and so on. You can control the order in the selector tab and change it with the buttons "move Next" or "move Previous".
|
**Attention:** The order of the ROIs defines, how the individual digits are combined to the total number. The first ROI is the digit with the highest order, then the second and so on. You can control the order in the selector tab and change it with the buttons "move Next" or "move Previous".
|
||||||
|
|
||||||
As for the reference images you can change position, size and name of the ROI in the text fields or define them via drag and drop through the mouse button.
|
As for the reference images you can change position, size and name of the ROI in the text fields or define them via drag and drop through the mouse button.
|
||||||
|
|
||||||
In most cases the digits are ordered in a aequidistant order and have the same size, you can synchronize them with the control in (4).
|
In most cases the digits are ordered in a equidistantly and have the same size, you can synchronize them with the control in (4).
|
||||||
|
|
||||||
Don' t forget to save the settings with "Save" and do not reboot at this stage.
|
Don' t forget to save the settings with "Save" and do not reboot at this stage.
|
||||||
|
|
||||||
@@ -82,10 +82,14 @@ Here is an example with the details for the ROI "ana1":
|
|||||||
For the digital meters it is a little bit more complicated, as there are different options of digital models, that you can choose.
|
For the digital meters it is a little bit more complicated, as there are different options of digital models, that you can choose.
|
||||||
|
|
||||||
1. Digital meter, that only recognized full digits (0, 1, 2, 3, ... 9) - Naming: `dig-class11-....tfl`
|
1. Digital meter, that only recognized full digits (0, 1, 2, 3, ... 9) - Naming: `dig-class11-....tfl`
|
||||||
|
|
||||||
**Advantage:** broad variety of types included in the training
|
**Advantage:** broad variety of types included in the training
|
||||||
|
|
||||||
**Disadvantage:** partially rotated numbers cannot be detected
|
**Disadvantage:** partially rotated numbers cannot be detected
|
||||||
2. Model with subdigit resulition (0.0, 0.1, 0.2, .... 9.8, 9.9) - Naming: `dig-cont-....tfl` or `dig-class100-....tfl`
|
2. Model with sub-digit resolution (0.0, 0.1, 0.2, .... 9.8, 9.9) - Naming: `dig-cont-....tfl` or `dig-class100-....tfl`
|
||||||
|
|
||||||
**Advantage:** partial numbers can be detected and a better post processing is possible
|
**Advantage:** partial numbers can be detected and a better post processing is possible
|
||||||
|
|
||||||
**Disadvantage:** only limited types of meter types are trained due to the high effort for the training data
|
**Disadvantage:** only limited types of meter types are trained due to the high effort for the training data
|
||||||
|
|
||||||
Details and the corresponding "perfect" setting is explained here: [Details ROI Configuration](https://jomjol.github.io/AI-on-the-edge-device-docs/ROI-Configuration/)
|
Details and the corresponding "perfect" setting is explained here: [Details ROI Configuration](https://jomjol.github.io/AI-on-the-edge-device-docs/ROI-Configuration/)
|
||||||
@@ -118,7 +122,7 @@ The configuration is divided into different sub topics:
|
|||||||
* PostProcessing
|
* PostProcessing
|
||||||
* MQTT
|
* MQTT
|
||||||
* InfluxDB
|
* InfluxDB
|
||||||
* GPIOSettings
|
* GPIO Settings
|
||||||
* Autotimer
|
* Autotimer
|
||||||
* DataLogging
|
* DataLogging
|
||||||
* Debug
|
* Debug
|
||||||
@@ -131,9 +135,9 @@ The setting itself is done in the next column (2) and a brief explanation you ca
|
|||||||
|
|
||||||
Don' t forget to save the settings with "Save" and do not reboot at this stage.
|
Don' t forget to save the settings with "Save" and do not reboot at this stage.
|
||||||
|
|
||||||
#### Expert Modus
|
#### Expert Mode
|
||||||
|
|
||||||
With the normal parameters you should be able to make the needed settings for most of the system. Sometimes there is some fine tunning needed. For this there is an expert modus available. This can be enabled with the check box at the top (4). After this you see much more parameters. But before modifiying them you should be really sure, what they are about.
|
With the normal parameters you should be able to make the needed settings for most of the system. Sometimes there is some fine tunning needed. For this there is an expert mode available. This can be enabled with the check box at the top (4). After this you see much more parameters. But before modifying them you should be really sure, what they are about.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -143,13 +147,13 @@ After setting up everything, there is a last step to be done:
|
|||||||
|
|
||||||
{: style="width:500px"}
|
{: style="width:500px"}
|
||||||
|
|
||||||
With (1) you leave the setup modus and reboot to normal operation mode.
|
With (1) you leave the setup mode and reboot to normal operation mode.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Access to setup in normal operation mode
|
## Access to setup in normal operation mode
|
||||||
|
|
||||||
You can access all the settings also during the normal working mode via the "Settings" menue:
|
You can access all the settings also during the normal working mode via the "Settings" menu:
|
||||||
|
|
||||||
{: style="width:500px"}
|
{: style="width:500px"}
|
||||||
|
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ nav:
|
|||||||
- outdated--Gasmeter-Log-Downloader.md
|
- outdated--Gasmeter-Log-Downloader.md
|
||||||
- outdated--Migrate-Old-Config-To-New-Config.md
|
- outdated--Migrate-Old-Config-To-New-Config.md
|
||||||
|
|
||||||
- Asorted Pages:
|
- Assorted Pages:
|
||||||
# List all pages which are not covered by above list
|
# List all pages which are not covered by above list
|
||||||
# Step by step we should migrate those page to the above list
|
# Step by step we should migrate those page to the above list
|
||||||
- ...
|
- ...
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
# Gasmeter Log-Downloader
|
# Gas Meter Log Downloader
|
||||||
|
|
||||||
!!! Warning
|
!!! Warning
|
||||||
This page no longer is maintained!
|
This page no longer is maintained!
|
||||||
|
|
||||||
This small tool downloads the logfiles from your ESP32 and stores the last value of the day in an *.csv file.
|
This small tool downloads the log files from your ESP32 and stores the last value of the day in an *.csv file.
|
||||||
|
|
||||||
To use this tool you need to **activate the debug logfile** in your configuration (Configuration / Debug / Logfile). I go with 30 days of retention in days.
|
To use this tool you need to **activate the debug log files** in your configuration (Configuration / Debug / Logfile). I go with 30 days of retention in days.
|
||||||
|
|
||||||
It downloads only the past logfiles (yesterday and older).
|
It downloads only the past log files (yesterday and older).
|
||||||
|
|
||||||
You can define the max. number of Logfiles to download (beginning from newest [yesterday]).
|
You can define the max. number of log files to download (beginning from newest [yesterday]).
|
||||||
|
|
||||||
I wrote this tool to get a chart of the daily gas consumption to optimize my gas powered heating.
|
I wrote this tool to get a chart of the daily gas consumption to optimize my gas powered heating.
|
||||||
|
|
||||||
**Variables to define by yourself:**
|
**Variables to define by yourself:**
|
||||||
|
|
||||||
- **URL to Logfile-Path on Device:** "http://ESP32-IP-Address/fileserver/log/message/"
|
- **URL to Log file-Path on Device:** "http://ESP32-IP-Address/fileserver/log/message/"
|
||||||
- **Download Logfiles to:** enter a valid directory, e.g. "D:\Gaszaehler\Auswertung\Log-Downloads\"
|
- **Download Log files to:** enter a valid directory, e.g. "D:\Gaszaehler\Auswertung\Log-Downloads\"
|
||||||
- **Output CSV-File:** enter a valid directory, e.g. "D:\Gaszaehler\Auswertung\DailyValues.csv"
|
- **Output CSV-File:** enter a valid directory, e.g. "D:\Gaszaehler\Auswertung\DailyValues.csv"
|
||||||
- **Download Logfiles from past # days:** enter the max. number of logfiles you want to download (<= your logfile retention value in your device configuration)
|
- **Download Log files from past # days:** enter the max. number of log files you want to download (<= your log files retention value in your device configuration)
|
||||||
|
|
||||||
Feel free to optimize and modify it.
|
Feel free to optimize and modify it.
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ There are only some few steps necessary to migrate your old system to the new on
|
|||||||
|
|
||||||
Please follow the following steps:
|
Please follow the following steps:
|
||||||
|
|
||||||
#### 1. Follow the installation guide to flash the ESP32CAM and prepare a SD-Card with the content of the master
|
#### 1. Follow the installation guide to flash the ESP32CAM and prepare a SD Card with the content of the master
|
||||||
|
|
||||||
#### 2. Save the following files from the old Docker system on your PC:
|
#### 2. Save the following files from the old Docker system on your PC:
|
||||||
|
|
||||||
@@ -128,4 +128,4 @@ ImageSize = VGA
|
|||||||
|
|
||||||
#### 11. Restart the system.
|
#### 11. Restart the system.
|
||||||
|
|
||||||
#### 12. After the first start set manually the PreValue in the new system
|
#### 12. After the first start set manually the PreValue in the new system
|
||||||
|
|||||||
Reference in New Issue
Block a user