From 7ce79028578f543a7523847fb6317270de60bc74 Mon Sep 17 00:00:00 2001
From: Khoi Hoang <57012152+khoih-prog@users.noreply.github.com>
Date: Sat, 24 Apr 2021 21:57:29 -0400
Subject: [PATCH] v1.5.0 to enable scan of WiFi networks
### Major Release v1.5.0
1. Enable scan of WiFi networks for selection in Configuration Portal. Check [PR for v1.3.0 - Enable scan of WiFi networks #10](https://github.com/khoih-prog/WiFiManager_NINA_Lite/pull/10). Now you can select optional **SCAN_WIFI_NETWORKS**, **MANUAL_SSID_INPUT_ALLOWED** to be able to manually input SSID, not only from a scanned SSID lists and **MAX_SSID_IN_LIST** (from 2-6 for ESP8266-AT or 2-15 for other)
2. Minor enhancement to not display garbage when data is invalid
---
README.md | 210 ++++++++++++++-
examples/ESP_WiFi/ESP_WiFi.ino | 3 +-
examples/ESP_WiFi/defines.h | 10 +
examples/ESP_WiFi_MQTT/ESP_WiFi_MQTT.ino | 3 +-
examples/ESP_WiFi_MQTT/defines.h | 10 +
library.json | 2 +-
pics/Input.png | Bin 28146 -> 35476 bytes
pics/Input_With_Scan.png | Bin 0 -> 34847 bytes
pics/Main.png | Bin 36716 -> 29118 bytes
src/ESP_WiFiManager_Lite.h | 326 ++++++++++++++++++++++-
src/ESP_WiFiManager_Lite_Debug.h | 3 +-
11 files changed, 536 insertions(+), 31 deletions(-)
create mode 100644 pics/Input_With_Scan.png
diff --git a/README.md b/README.md
index 812bc3a..64425e8 100644
--- a/README.md
+++ b/README.md
@@ -15,6 +15,7 @@
* [Features](#features)
* [Currently supported Boards](#currently-supported-boards)
* [Changelog](#changelog)
+ * [Major Release v1.5.0](#major-release-v150)
* [Release v1.4.0](#release-v140)
* [Release v1.3.0](#release-v130)
* [Release v1.2.0](#release-v120)
@@ -59,6 +60,12 @@
* [9. To use custom Head Elements](#9-to-use-custom-head-elements)
* [10. To use CORS Header](#10-to-use-cors-header)
* [11. To use and input only one set of WiFi SSID and PWD](#11-to-use-and-input-only-one-set-of-wifi-ssid-and-pwd)
+ * [11.1 If you need to use and input only one set of WiFi SSID/PWD](#111-if-you-need-to-use-and-input-only-one-set-of-wifi-ssidpwd)
+ * [11.2 If you need to use both sets of WiFi SSID/PWD](#112-if-you-need-to-use-both-sets-of-wifi-ssidpwd)
+ * [12. To enable auto-scan of WiFi networks for selection in Configuration Portal](#12-to-enable-auto-scan-of-wifi-networks-for-selection-in-configuration-portal)
+ * [12.1 Enable auto-scan of WiFi networks for selection in Configuration Portal](#121-enable-auto-scan-of-wifi-networks-for-selection-in-configuration-portal)
+ * [12.2 Disable manually input SSIDs](#122-disable-manually-input-ssids)
+ * [12.3 Select maximum number of SSIDs in the list](#123-select-maximum-number-of-ssids-in-the-list)
* [Examples](#examples)
* [ 1. ESP_WiFi](examples/ESP_WiFi)
* [ 2. ESP_WiFi_MQTT](examples/ESP_WiFi_MQTT)
@@ -90,7 +97,10 @@
* [3.3 Lost a WiFi and autoconnect to another WiFi AP](#33-lost-a-wifi-and-autoconnect-to-another-wifi-ap)
* [4. ESP_WiFi_MQTT on ESP32S2_DEV to demo MultiResetDetector](#4-esp_wifi_mqtt-on-esp32s2_dev-to-demo-multiresetdetector)
* [4.1 MultiResetDetected => Open Config Portal](#41-multiresetdetected--open-config-portal)
- * [4.2 Got valid Credentials from Config Portal then connected to WiFi](#42-got-valid-credentials-from-config-portal-then-connected-to-wifi)
+ * [4.2 Got valid Credentials from Config Portal then connected to WiFi](#42-got-valid-credentials-from-config-portal-then-connected-to-wifi)
+ * [5. ESP_WiFi_MQTT on ESP32_DEV to demo WiFi Scan](#5-esp_wifi_mqtt-on-esp32_dev-to-demo-wifi-scan)
+ * [5.1 MRD/DRD => Open Config Portal](#51-mrddrd--open-config-portal)
+ * [5.2 Config Data Saved => Connection to Adafruit MQTT](#52-config-data-saved--connection-to-adafruit-mqtt)
* [Debug](#debug)
* [Troubleshooting](#troubleshooting)
* [Releases](#releases)
@@ -135,20 +145,28 @@ New recent features:
- Control Config Portal from software or Virtual Switches
- To permit autoreset after configurable timeout if DRD/MRD or non-persistent forced-CP
- Use new ESP32 LittleFS features
+- **Scan WiFi networks** for selection in Configuration Portal
#### Currently supported Boards
This [**ESP_WiFiManager_Lite** library](https://github.com/khoih-prog/ESP_WiFiManager_Lite) currently supports these following boards:
- 1. **ESP32 including ESP32-S2 (ESP32-S2 Saola, AI-Thinker ESP-12K, etc.)**
- 2. **ESP8266**
+ 1. **ESP8266 and ESP32-based boards using EEPROM, SPIFFS or LittleFS**.
+ 2. **ESP32-S2 (ESP32-S2 Saola, AI-Thinker ESP-12K, etc.) using EEPROM, SPIFFS or LittleFS**.
+ 3. **ESP32-C3 (ARDUINO_ESP32C3_DEV) using EEPROM or SPIFFS**.
---
---
## Changelog
+### Major Release v1.5.0
+
+1. Enable scan of WiFi networks for selection in Configuration Portal. Check [PR for v1.3.0 - Enable scan of WiFi networks #10](https://github.com/khoih-prog/WiFiManager_NINA_Lite/pull/10). Now you can select optional **SCAN_WIFI_NETWORKS**, **MANUAL_SSID_INPUT_ALLOWED** to be able to manually input SSID, not only from a scanned SSID lists and **MAX_SSID_IN_LIST** (from 2-6 for ESP8266-AT or 2-15 for other)
+2. Minor enhancement to not display garbage when data is invalid
+
+
### Release v1.4.0
1. Add **LittleFS and SPIFFS** support to new **ESP32-S2** boards (**Arduino ESP32C3_DEV**). Check [HOWTO Install esp32 core for ESP32-S2 (Saola, AI-Thinker ESP-12K) and ESP32-C3 boards into Arduino IDE](#howto-install-esp32-core-for-esp32-s2-saola-ai-thinker-esp-12k-and-esp32-c3-boards-into-arduino-ide).
@@ -628,7 +646,7 @@ Once Credentials / WiFi network information is saved in the host non-volatile me
#### 11. To use and input only one set of WiFi SSID and PWD
-#### If you need to use and input only one set of WiFi SSID/PWD.
+#### 11.1 If you need to use and input only one set of WiFi SSID/PWD
```
// Permit input only one set of WiFi SSID/PWD. The other can be "NULL or "blank"
@@ -637,7 +655,7 @@ Once Credentials / WiFi network information is saved in the host non-volatile me
```
But it's always advisable to use and input both sets for reliability.
-#### If you need to use both sets of WiFi SSID/PWD
+#### 11.2 If you need to use both sets of WiFi SSID/PWD
```
// Permit input only one set of WiFi SSID/PWD. The other can be "NULL or "blank"
@@ -645,6 +663,37 @@ But it's always advisable to use and input both sets for reliability.
#define REQUIRE_ONE_SET_SSID_PW false
```
+#### 12. To enable auto-scan of WiFi networks for selection in Configuration Portal
+
+#### 12.1 Enable auto-scan of WiFi networks for selection in Configuration Portal
+
+
+```
+#define SCAN_WIFI_NETWORKS true
+```
+
+The manual input of SSIDs is default enabled, so that users can input arbitrary SSID, not only from the scanned list. This is for the sample use-cases in which users can input the known SSIDs of another place, then send the boards to that place. The boards can connect to WiFi without users entering Config Portal to re-configure.
+
+#### 12.2 Disable manually input SSIDs
+
+```
+// To disable manually input SSID, only from a scanned SSID lists
+#define MANUAL_SSID_INPUT_ALLOWED false
+```
+
+This is for normal use-cases in which users can only select an SSID from a scanned list of SSIDs to avoid typo mistakes and/or security.
+
+#### 12.3 Select maximum number of SSIDs in the list
+
+The maximum number of SSIDs in the list is seletable from 2 to 15. If invalid number of SSIDs is selected, the default number of 10 will be used.
+
+
+```
+// From 2-15
+#define MAX_SSID_IN_LIST 8
+```
+
+
---
---
@@ -668,10 +717,28 @@ After you connected, please, go to http://192.168.4.1 or newly configured AP IP,
Enter your credentials,
+### 1. Without SCAN_WIFI_NETWORKS
+
+Enter your credentials,
+
+
+
+
+
+or
+
+### 2. With SCAN_WIFI_NETWORKS
+
+
+
+
+
+
+
then click `Save`.
@@ -1125,6 +1192,16 @@ void loop()
/////////////////////////////////////////////
+#define SCAN_WIFI_NETWORKS true
+
+// To be able to manually input SSID, not from a scanned SSID lists
+#define MANUAL_SSID_INPUT_ALLOWED true
+
+// From 2-15
+ #define MAX_SSID_IN_LIST 8
+
+/////////////////////////////////////////////
+
#include
#if ESP8266
@@ -1317,7 +1394,7 @@ This is the terminal output when running [**ESP_WiFi**](examples/ESP_WiFi) examp
```
Starting ESP_WiFi using LittleFS on ESP32_DEV
-ESP_WiFiManager_Lite v1.4.0
+ESP_WiFiManager_Lite v1.5.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFC0003
multiResetDetectorFlag = 0xFFFC0003
@@ -1388,7 +1465,7 @@ FFFFFFFFF
```
Starting ESP_WiFi using LittleFS on ESP32_DEV
-ESP_WiFiManager_Lite v1.4.0
+ESP_WiFiManager_Lite v1.5.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFE0001
multiResetDetectorFlag = 0xFFFE0001
@@ -1460,7 +1537,7 @@ This is the terminal output when running [**ESP_WiFi_MQTT**](examples/ESP_WiFi_M
```
Starting ESP_WiFi_MQTT using LittleFS on ESP8266_NODEMCU
-ESP_WiFiManager_Lite v1.4.0
+ESP_WiFiManager_Lite v1.5.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFE0001
multiResetDetectorFlag = 0xFFFE0001
@@ -1535,7 +1612,7 @@ NNN
Starting ESP_WiFi_MQTT using LittleFS on ESP8266_NODEMCU
-ESP_WiFiManager_Lite v1.4.0
+ESP_WiFiManager_Lite v1.5.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFE0001
multiResetDetectorFlag = 0xFFFE0001
@@ -1627,7 +1704,7 @@ This is the terminal output when running [**ESP_WiFi_MQTT**](examples/ESP_WiFi_M
```
Starting ESP_WiFi_MQTT using LittleFS on ESP32S2_DEV
-ESP_WiFiManager_Lite v1.4.0
+ESP_WiFiManager_Lite v1.5.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFE0001
multiResetDetectorFlag = 0xFFFE0001
@@ -1740,7 +1817,7 @@ entry 0x4004c190
Starting ESP_WiFi_MQTT using LittleFS on ESP32S2_DEV
-ESP_WiFiManager_Lite v1.4.0
+ESP_WiFiManager_Lite v1.5.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFE0001
multiResetDetectorFlag = 0xFFFE0001
@@ -1842,7 +1919,7 @@ This is the terminal output when running [**ESP_WiFi_MQTT**](examples/ESP_WiFi_M
```
Starting ESP_WiFi_MQTT using LittleFS on ESP32S2_DEV
-ESP_WiFiManager_Lite v1.4.0
+ESP_WiFiManager_Lite v1.5.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFC0003
multiResetDetectorFlag = 0xFFFC0003
@@ -1870,7 +1947,7 @@ NNNN NNNNN NNNNN NNNNN NN[WML] h:UpdLittleFS
```
Starting ESP_WiFi_MQTT using LittleFS on ESP32S2_DEV
-ESP_WiFiManager_Lite v1.4.0
+ESP_WiFiManager_Lite v1.5.0
ESP_MultiResetDetector v1.1.1
LittleFS Flag read = 0xFFFE0001
multiResetDetectorFlag = 0xFFFE0001
@@ -1916,6 +1993,98 @@ AIO_SUB_TOPIC = /feeds/LED_Control
TWTWTWTW TWTWTWTWTW TWTW
```
+---
+
+### 5. [ESP_WiFi_MQTT](examples/ESP_WiFi_MQTT) on ESP32_DEV to demo WiFi Scan
+
+This is the terminal output when running [**ESP_WiFi**](examples/ESP_WiFi) example on **ESP32_DEV** with WiFi Scan for selection in Configuration Portal
+
+#### 5.1. MRD/DRD => Open Config Portal
+
+```
+Starting ESP_WiFi_MQTT using LittleFS on ESP32_DEV
+ESP_WiFiManager_Lite v1.5.0
+ESP_MultiResetDetector v1.1.1
+LittleFS Flag read = 0xFFFC0003
+multiResetDetectorFlag = 0xFFFC0003
+lowerBytes = 0x0003, upperBytes = 0x0003
+multiResetDetected, number of times = 3
+Saving config file...
+Saving config file OK
+[WML] Hdr=ESP_WM_LITE,SSID=HueNet1,PW=12345678
+[WML] SSID1=HueNet2,PW1=12345678
+[WML] BName=ESP32_DEV
+[WML] Hdr=ESP_WM_LITE,SSID=HueNet1,PW=12345678
+[WML] SSID1=HueNet2,PW1=12345678
+[WML] BName=ESP32_DEV
+[WML] WiFi networks found:
+[WML] 1: HueNet, -24dB
+[WML] 2: HueNet1, -31dB
+[WML] 3: HueNetTek, -33dB
+[WML] 4: dragino-1ed63c, -33dB
+[WML] 5: HueNet2, -57dB
+[WML] 6: bacau, -72dB
+[WML] 7: guest_24, -72dB
+[WML] 8: Waterhome, -91dB
+[WML] 9: BAHFAMILY, -93dB
+[WML] 10: TP-LINK_2.4GHz_9A67ED, -94dB
+[WML] 11: Access 2.0, -96dB
+[WML]
+stConf:SSID=ESP_9ABF498,PW=MyESP_9ABF498
+[WML] IP=192.168.4.1,ch=11
+N
+Your stored Credentials :
+AIO_SERVER = io.adafruit.com
+AIO_SERVERPORT = 1883
+AIO_USERNAME = private
+AIO_KEY = private
+AIO_PUB_TOPIC = /feeds/Temperature
+AIO_SUB_TOPIC = /feeds/LED_Control
+N
+```
+
+### 2. Config Data Saved => Connection to Adafruit MQTT
+
+```
+Starting ESP_WiFi_MQTT using LittleFS on ESP32_DEV
+ESP_WiFiManager_Lite v1.5.0
+ESP_MultiResetDetector v1.1.1
+LittleFS Flag read = 0xFFFE0001
+multiResetDetectorFlag = 0xFFFE0001
+lowerBytes = 0x0001, upperBytes = 0x0001
+No multiResetDetected, number of times = 1
+LittleFS Flag read = 0xFFFE0001
+Saving config file...
+Saving config file OK
+[WML] Hdr=ESP_WM_LITE,SSID=HueNet1,PW=12345678
+[WML] SSID1=HueNet2,PW1=12345678
+[WML] BName=ESP32_DEV
+[WML] Hdr=ESP_WM_LITE,SSID=HueNet1,PW=12345678
+[WML] SSID1=HueNet2,PW1=12345678
+[WML] BName=ESP32_DEV
+[WML] WiFi connected after time: 1
+[WML] SSID=HueNet1,RSSI=-30
+[WML] Channel=2,IP=192.168.2.45
+Stop multiResetDetecting
+Saving config file...
+Saving config file OK
+
+Creating new WiFi client object OK
+Creating new MQTT object OK
+AIO_SERVER = io.adafruit.com, AIO_SERVERPORT = 1883
+AIO_USERNAME = user_name, AIO_KEY = aio_key
+Creating new MQTT_Pub_Topic, Temperature = user_name/feeds/Temperature
+Creating new Temperature object OK
+Temperature MQTT_Pub_Topic = user_name/feeds/Temperature
+Creating new AIO_SUB_TOPIC, LED_Control = user_name/feeds/LED_Control
+Creating new LED_Control object OK
+LED_Control AIO_SUB_TOPIC = user_name/feeds/LED_Control
+
+Connecting to WiFi MQTT (3 attempts)...
+WiFi MQTT connection successful!
+TWTWTWTW TWTW
+```
+
---
---
@@ -1949,6 +2118,11 @@ If you get compilation errors, more often than not, you may need to install a ne
## Releases
+### Major Release v1.5.0
+
+1. Enable scan of WiFi networks for selection in Configuration Portal. Check [PR for v1.3.0 - Enable scan of WiFi networks #10](https://github.com/khoih-prog/WiFiManager_NINA_Lite/pull/10). Now you can select optional **SCAN_WIFI_NETWORKS**, **MANUAL_SSID_INPUT_ALLOWED** to be able to manually input SSID, not only from a scanned SSID lists and **MAX_SSID_IN_LIST** (from 2-6 for ESP8266-AT or 2-15 for other)
+2. Minor enhancement to not display garbage when data is invalid
+
### Release v1.4.0
1. Add **LittleFS and SPIFFS** support to new **ESP32-S2** boards (**Arduino ESP32C3_DEV**). Check [HOWTO Install esp32 core for ESP32-S2 (Saola, AI-Thinker ESP-12K) and ESP32-C3 boards into Arduino IDE](#howto-install-esp32-core-for-esp32-s2-saola-ai-thinker-esp-12k-and-esp32-c3-boards-into-arduino-ide).
@@ -2018,6 +2192,7 @@ Submit issues to: [ESP_WiFiManager_Lite issues](https://github.com/khoih-prog/ES
21. Add support to **ESP32-S2 (ESP32-S2 Saola, AI-Thinker ESP-12K, etc.) using EEPROM, LittleFS and SPIFFS**
22. Configurable **Customs HTML Headers**, including Customs Style, Customs Head Elements, CORS Header
23. Add support to **ESP32-C3 using EEPROM and SPIFFS**
+24. Enable **scan of WiFi networks** for selection in Configuration Portal
---
---
@@ -2026,6 +2201,15 @@ Submit issues to: [ESP_WiFiManager_Lite issues](https://github.com/khoih-prog/ES
Please help contribute to this project and add your name here.
+1. Thanks to [Michael H. "bizprof"](https://github.com/bizprof). With the impressive new feature :
+ - `Enable scan of WiFi networks for selection in Configuration Portal`. Check [PR for v1.3.0 - Enable scan of WiFi networks #10](https://github.com/khoih-prog/WiFiManager_NINA_Lite/pull/10) leading to v1.5.0
+
+
+
---
diff --git a/examples/ESP_WiFi/ESP_WiFi.ino b/examples/ESP_WiFi/ESP_WiFi.ino
index 0b3786d..3943ee5 100644
--- a/examples/ESP_WiFi/ESP_WiFi.ino
+++ b/examples/ESP_WiFi/ESP_WiFi.ino
@@ -8,7 +8,7 @@
Built by Khoi Hoang https://github.com/khoih-prog/ESP_WiFiManager_Lite
Licensed under MIT license
- Version: 1.4.0
+ Version: 1.5.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -17,6 +17,7 @@
1.2.0 K Hoang 22/02/2021 Add customs HTML header feature. Fix bug.
1.3.0 K Hoang 12/04/2021 Fix invalid "blank" Config Data treated as Valid. Fix EEPROM_SIZE bug
1.4.0 K Hoang 21/04/2021 Add support to new ESP32-C3 using SPIFFS or EEPROM
+ 1.5.0 Michael H 24/04/2021 Enable scan of WiFi networks for selection in Configuration Portal
*****************************************************************************************************************************/
#include "defines.h"
diff --git a/examples/ESP_WiFi/defines.h b/examples/ESP_WiFi/defines.h
index cbdde3c..db1e6e2 100644
--- a/examples/ESP_WiFi/defines.h
+++ b/examples/ESP_WiFi/defines.h
@@ -89,6 +89,16 @@
/////////////////////////////////////////////
+#define SCAN_WIFI_NETWORKS true
+
+// To be able to manually input SSID, not from a scanned SSID lists
+#define MANUAL_SSID_INPUT_ALLOWED true
+
+// From 2-15
+ #define MAX_SSID_IN_LIST 8
+
+/////////////////////////////////////////////
+
#include
#if ESP8266
diff --git a/examples/ESP_WiFi_MQTT/ESP_WiFi_MQTT.ino b/examples/ESP_WiFi_MQTT/ESP_WiFi_MQTT.ino
index 084de67..abaae5c 100644
--- a/examples/ESP_WiFi_MQTT/ESP_WiFi_MQTT.ino
+++ b/examples/ESP_WiFi_MQTT/ESP_WiFi_MQTT.ino
@@ -8,7 +8,7 @@
Built by Khoi Hoang https://github.com/khoih-prog/ESP_WiFiManager_Lite
Licensed under MIT license
- Version: 1.4.0
+ Version: 1.5.0
Version Modified By Date Comments
------- ----------- ---------- -----------
@@ -17,6 +17,7 @@
1.2.0 K Hoang 22/02/2021 Add customs HTML header feature. Fix bug.
1.3.0 K Hoang 12/04/2021 Fix invalid "blank" Config Data treated as Valid. Fix EEPROM_SIZE bug
1.4.0 K Hoang 21/04/2021 Add support to new ESP32-C3 using SPIFFS or EEPROM
+ 1.5.0 Michael H 24/04/2021 Enable scan of WiFi networks for selection in Configuration Portal
*****************************************************************************************************************************/
/****************************************************************************************************************************
diff --git a/examples/ESP_WiFi_MQTT/defines.h b/examples/ESP_WiFi_MQTT/defines.h
index e1b9182..e2c55a1 100644
--- a/examples/ESP_WiFi_MQTT/defines.h
+++ b/examples/ESP_WiFi_MQTT/defines.h
@@ -89,6 +89,16 @@
/////////////////////////////////////////////
+#define SCAN_WIFI_NETWORKS true
+
+// To be able to manually input SSID, not from a scanned SSID lists
+#define MANUAL_SSID_INPUT_ALLOWED true
+
+// From 2-15
+ #define MAX_SSID_IN_LIST 8
+
+/////////////////////////////////////////////
+
#include
#if ESP8266
diff --git a/library.json b/library.json
index 6a279d5..8c52099 100644
--- a/library.json
+++ b/library.json
@@ -2,7 +2,7 @@
"name": "ESP_WiFiManager_Lite",
"version": "1.4.0",
"keywords": "wifi, wi-fi, MultiWiFi, multi-wifi, WiFiManager, esp8266, esp32, esp32-s2, esp32-c3, Communication, iot, credentials, persistent, config-portal, DoubleReset, MultiReset, DoubleResetDetector, littlefs, spiffs, eeprom, light-weight",
- "description": "Library to configure MultiWiFi/Credentials at runtime for ESP32 (including ESP32-S2) and ESP8266 boards. You can also specify DHCP HostName, static AP and STA IP. Use much less memory compared to full-fledge WiFiManager. Config Portal will be auto-adjusted to match the number of dynamic custom parameters. Optional default Credentials to be autoloaded into Config Portal to use or change instead of manually input. Credentials are saved in LittleFS, SPIFFS or EEPROM. New powerful-yet-simple-to-use feature to enable adding dynamic custom parameters from sketch and input using the same Config Portal. Double or MultiDetectDetector as well as Virtual Switches feature permits entering Config Portal as requested. Configurable Customs HTML Headers, including Customs Style, Customs Head Elements, CORS Header.",
+ "description": "Library to configure MultiWiFi/Credentials at runtime for ESP32 (including ESP32-S2 and ESP32-C3) and ESP8266 boards. You can also specify DHCP HostName, static AP and STA IP. Use much less memory compared to full-fledge WiFiManager. Config Portal will be auto-adjusted to match the number of dynamic custom parameters. Optional default Credentials to be autoloaded into Config Portal to use or change instead of manually input. Credentials are saved in LittleFS, SPIFFS or EEPROM. New powerful-yet-simple-to-use feature to enable adding dynamic custom parameters from sketch and input using the same Config Portal. Double or MultiDetectDetector as well as Virtual Switches feature permits entering Config Portal as requested. Configurable Customs HTML Headers, including Customs Style, Customs Head Elements, CORS Header.",
"authors":
{
"name": "Khoi Hoang",
diff --git a/pics/Input.png b/pics/Input.png
index 63b2d977a9421bd7d07d84da2b8625d1975f51e8..f28e5efeec1dabd6d3a806662833bfb623e65e6a 100644
GIT binary patch
literal 35476
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 |