- Why do we need this ESP_MultiResetDetector library
- Changelog
- Prerequisites
- Installation
- HOWTO Usage
- Examples
- Examples from other libraries
- 1. ESP_WiFiManager Library
- 2. ESPAsync_WiFiManager Library
- Many other libraries are depending on this library's DRD and MRD feature
- Example checkWaitingMRD
- Debug Terminal Output Samples
- Libraries using ESP_MultiResetDetector, ESP_DoubleResetDetector or DoubleResetDetector_Generic library
- Debug
- Troubleshooting
- Issues
- TO DO
- DONE
- Contributions and Thanks
- Contributing
- License
- Copyright
Why do we need this ESP_MultiResetDetector library
ESP_MultiResetDetector is a library for the ESP8266 and ESP32 boards to detects a configurable multi reset, within configurable timeout (default 10s) seconds, so that an alternative start-up mode can be used. Example use cases are to allow re-configuration of a device's WiFi / MQTT / Blynk credentials or to count the number of resets within a pre-determined timed.
This library is based on, modified, bug-fixed and improved from Stephen Denne's DoubleResetDetector
to add support to ESP8266 and ESP32 using EEPROM, SPIFFS and LittleFS besides original RTC.
Currently, DoubleResetDetector
only supports ESP8266 using RTC memory.
This library can be used to detect a multi reset within a predetermined time to force the program to enter a special operation such as Config Portal, Clear Default Data, etc., using :
- EEPROM, SPIFFS or LittleFS for ESP8266 and ESP32 boards.
- RTC memory for ESP8266 boards (unadvised).
This ESP_MultiResetDetector library currently supports these following boards:
- ESP32, ESP32_C3, ESP32_S2 and ESP32_S3 boards, using EEPROM, SPIFFS or LittleFS.
- ESP8266 boards RTC memory, EEPROM, SPIFFS or LittleFS
Arduino IDE 1.8.19+
for Arduino.ESP32 Core 2.0.5+
for ESP32-based boards.ESP8266 Core 3.0.2+
for ESP8266-based boards. . SPIFFS is deprecated from ESP8266 core 2.7.1+, to use LittleFS.LittleFS_esp32 v1.0.6+
for ESP32-based boards using LittleFS with ESP32 core v1.0.5-. To install, check . Notice: ThisLittleFS_esp32 library
has been integrated to Arduino ESP32 core v1.0.6+ and you don't need to install it if using ESP32 core v1.0.6+
The best and easiest way is to use Arduino Library Manager
. Search for ESP_MultiResetDetector
, then select / install the latest version. You can also use this link for more detailed instructions.
- Navigate to ESP_MultiResetDetector page.
- Download the latest release
ESP_MultiResetDetector-main.zip
. - Extract the zip file to
ESP_MultiResetDetector-main
directory - Copy the whole
ESP_MultiResetDetector-main
folder to Arduino libraries' directory such as~/Arduino/libraries/
.
- Install VS Code
- Install PlatformIO
- Install ESP_MultiResetDetector library by using Library Manager. Search for ESP_MultiResetDetector in Platform.io Author's Libraries
- Use included platformio.ini file from examples to ensure that all dependent libraries will installed automatically. Please visit documentation for the other options and examples at Project Configuration File
How to use
// These defines must be put before #include <ESP_MultiResetDetector.h>
// to select where to store MultiResetDetector's variable.
// For ESP32, You must select one to be true (EEPROM or SPIFFS)
// For ESP8266, You must select one to be true (RTC, EEPROM, LITTLEFS or SPIFFS)
// Otherwise, library will use default EEPROM storage
#ifdef ESP8266
#define ESP8266_MRD_USE_RTC false //true
#endif
#define ESP_MRD_USE_LITTLEFS true
#define ESP_MRD_USE_SPIFFS false
#define ESP_MRD_USE_EEPROM false
#define MULTIRESETDETECTOR_DEBUG true //false
// These definitions must be placed before #include <ESP_MultiResetDetector.h> to be used
// Otherwise, default values (MRD_TIMES = 3, MRD_TIMEOUT = 10 seconds and MRD_ADDRESS = 0) will be used
// Number of subsequent resets during MRD_TIMEOUT to activate
#define MRD_TIMES 5
// Number of seconds after reset during which a
// subsequent reset will be considered a multi reset.
#define MRD_TIMEOUT 10
// RTC/EEPROM Memory Address for the MultiResetDetector to use
#define MRD_ADDRESS 0
#include <ESP_MultiResetDetector.h> //https://github.com/khoih-prog/ESP_MultiResetDetector
MultiResetDetector* mrd;
#ifdef ESP32
// For ESP32
#ifndef LED_BUILTIN
#define LED_BUILTIN 2 // Pin D2 mapped to pin GPIO2/ADC12 of ESP32, control on-board LED
#endif
#define LED_OFF LOW
#define LED_ON HIGH
#else
// For ESP8266
#define LED_ON LOW
#define LED_OFF HIGH
#endif
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
while (!Serial);
delay(200);
Serial.print(F("\nStarting ESP_MultiResetDetector minimal on ")); Serial.print(ARDUINO_BOARD);
#if ESP_MRD_USE_LITTLEFS
Serial.println(F(" using LittleFS"));
#elif ESP_MRD_USE_SPIFFS
Serial.println(F(" using SPIFFS"));
#else
Serial.println(F(" using EEPROM"));
#endif
Serial.println(ESP_MULTI_RESET_DETECTOR_VERSION);
mrd = new MultiResetDetector(MRD_TIMEOUT, MRD_ADDRESS);
if (mrd->detectMultiReset())
{
Serial.println("Multi Reset Detected");
digitalWrite(LED_BUILTIN, LED_ON);
}
else
{
Serial.println("No Multi Reset Detected");
digitalWrite(LED_BUILTIN, LED_OFF);
}
}
void loop()
{
// Call the multi reset detector loop method every so often,
// so that it can recognise when the timeout expires.
// You can also call mrd.stop() when you wish to no longer
// consider the next reset as a multi reset.
mrd->loop();
}
- 1. ConfigOnDoubleReset
- 2. ConfigOnDRD_FS_MQTT_Ptr
- 3. ESP32_FSWebServer_DRD
- 4. ESP_FSWebServer_DRD
- 5. ConfigOnDRD_ESP32_minimal
- 6. ConfigOnDRD_ESP8266_minimal
- 7. ConfigOnDRD_FS_MQTT_Ptr_Complex
- 8. ConfigOnDRD_FS_MQTT_Ptr_Medium
- 1. Async_ConfigOnDoubleReset
- 2. Async_ConfigOnDRD_FS_MQTT_Ptr
- 3. Async_ESP32_FSWebServer_DRD
- 4. Async_ESP_FSWebServer_DRD
- 5. Async_ConfigOnDRD_ESP32_minimal
- 6. Async_ConfigOnDRD_ESP8266_minimal
- 7. Async_ConfigOnDRD_FS_MQTT_Ptr_Complex
- 8. Async_ConfigOnDRD_FS_MQTT_Ptr_Medium
and there are many more.
All examples of these following libraries are using DRD/MRD feature of this ESP_DoubleResetDetector Library or ESP_MultiResetDetector Library
- 1. Blynk_WM
- 2. Blynk_Async_WM
- 3. BlynkEthernet_WM
- 4. BlynkESP32_BT_WF
- 5. BlynkGSM_Manager
- 6. Blynk_Async_ESP32_BT_WF
- 7. Blynk_Async_GSM_Manager
- 8. Ethernet_Manager
Example checkWaitingMRD
ESP_MultiResetDetector/examples/checkWaitingMRD/checkWaitingMRD.ino
Lines 16 to 150 in c878d5e
This is terminal debug output when running ESP32_FSWebServer_DRD on ESP32 ESP32_DEV.. Config Portal was requested by DRD to input and save Credentials. The boards then connected to WiFi AP HueNet1 using new Static IP successfully. WiFi AP HueNet1 is then lost, and board autoreconnects itself to backup WiFi AP HueNet2.
Starting ESP32_FSWebServer_DRD with DoubleResetDetect using SPIFFS on ESP32_DEV
ESP_WiFiManager v1.12.1
ESP_MultiResetDetector v1.3.2
FS File: /ConfigSW.json, size: 150B
FS File: /CanadaFlag_1.png, size: 40.25KB
FS File: /CanadaFlag_2.png, size: 8.12KB
FS File: /CanadaFlag_3.jpg, size: 10.89KB
FS File: /edit.htm.gz, size: 4.02KB
FS File: /favicon.ico, size: 1.12KB
FS File: /graphs.js.gz, size: 1.92KB
FS File: /index.htm, size: 3.63KB
FS File: /drd.dat, size: 4B
FS File: /wifi_cred.dat, size: 192B
[WM] RFC925 Hostname = ESP32-FSWebServerDRD
[WM] setAPStaticIPConfig
[WM] setSTAStaticIPConfig for USE_CONFIGURABLE_DNS
[WM] Set CORS Header to : Your Access-Control-Allow-Origin
Stored: SSID = HueNet2, Pass = 12345678
[WM] * Add SSID = HueNet2 , PW = 12345678
Got stored Credentials. Timeout 120s for Config Portal
SPIFFS Flag read = 0xd0d04321
No multiResetDetected
Saving config file...
Saving config file OK
[WM] LoadWiFiCfgFile
[WM] OK
[WM] * Add SSID = HueNet1 , PW = 12345678
[WM] * Add SSID = HueNet2 , PW = 12345678
ConnectMultiWiFi in setup
[WM] ConnectMultiWiFi with :
[WM] * Flash-stored Router_SSID = HueNet2 , Router_Pass = 12345678
[WM] * Additional SSID = HueNet1 , PW = 12345678
[WM] * Additional SSID = HueNet2 , PW = 12345678
[WM] Connecting MultiWifi...
[WM] WiFi connected after time: 1
[WM] SSID: HueNet1 ,RSSI= -27
[WM] Channel: 2 ,IP address: 192.168.2.232
After waiting 3.16 secs more in setup(), connection result is connected. Local IP: 192.168.2.232
HTTP server started @ 192.168.2.232
Open http://esp32-fs-browser.local/edit to see the file browser
[WM] freeing allocated params!
Stop multiResetDetecting
Saving config file...
Saving config file OK
WiFi lost. Call connectMultiWiFi in loop
[WM] ConnectMultiWiFi with :
[WM] * Flash-stored Router_SSID = HueNet2 , Router_Pass = 12345678
[WM] * Additional SSID = HueNet1 , PW = 12345678
[WM] * Additional SSID = HueNet2 , PW = 12345678
[WM] Connecting MultiWifi...
[WM] WiFi connected after time: 3
[WM] SSID: HueNet2 ,RSSI= -59
[WM] Channel: 4 ,IP address: 192.168.2.232
HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH
This is terminal debug output when running minimal on ESP32 ESP32_DEV using LittleFS.. Config Portal was requested by MRD to input and save Credentials.
Starting ESP_MultiResetDetector minimal on ESP32_DEV using LittleFS
ESP_MultiResetDetector v1.3.2
/home/kh/Arduino/libraries/LITTLEFS-master/src/lfs.c:1003:error: Corrupted dir pair at {0x0, 0x1}
E (241) esp_littlefs: mount failed, (-84)
E (245) esp_littlefs: Failed to initialize LittleFS
multiResetDetectorFlag = 0xFEFEFEFE
lowerBytes = 0xFEFE, upperBytes = 0x0101
lowerBytes = 0xFEFE, upperBytes = 0x0101
detectRecentlyResetFlag: Data corrupted. Reset to 0
No multiResetDetected, number of times = 0
Saving config file...
Saving config file OK
No Multi Reset Detected
Stop multiResetDetecting
Saving config file...
Saving config file OK
Starting ESP_MultiResetDetector minimal on ESP32_DEV using LittleFS
ESP_MultiResetDetector v1.3.2
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
No Multi Reset Detected
Starting ESP_MultiResetDetector minimal on ESP32_DEV using LittleFS
ESP_MultiResetDetector v1.3.2
LittleFS Flag read = 0xFFFD0002
multiResetDetectorFlag = 0xFFFD0002
lowerBytes = 0x0002, upperBytes = 0x0002
No multiResetDetected, number of times = 2
LittleFS Flag read = 0xFFFD0002
Saving config file...
Saving config file OK
No Multi Reset Detected
Starting ESP_MultiResetDetector minimal on ESP32_DEV using LittleFS
ESP_MultiResetDetector v1.3.2
LittleFS Flag read = 0xFFFC0003
multiResetDetectorFlag = 0xFFFC0003
lowerBytes = 0x0003, upperBytes = 0x0003
No multiResetDetected, number of times = 3
LittleFS Flag read = 0xFFFC0003
Saving config file...
Saving config file OK
No Multi Reset Detected
Starting ESP_MultiResetDetector minimal on ESP32_DEV using LittleFS
ESP_MultiResetDetector v1.3.2
LittleFS Flag read = 0xFFFB0004
multiResetDetectorFlag = 0xFFFB0004
lowerBytes = 0x0004, upperBytes = 0x0004
No multiResetDetected, number of times = 4
LittleFS Flag read = 0xFFFB0004
Saving config file...
Saving config file OK
No Multi Reset Detected
Starting ESP_MultiResetDetector minimal on ESP32_DEV using LittleFS
ESP_MultiResetDetector v1.3.2
LittleFS Flag read = 0xFFFA0005
multiResetDetectorFlag = 0xFFFA0005
lowerBytes = 0x0005, upperBytes = 0x0005
multiResetDetected, number of times = 5
Saving config file...
Saving config file OK
Multi Reset Detected
Starting ESP_MultiResetDetector minimal on ESP32_DEV using LittleFS
ESP_MultiResetDetector v1.3.2
LittleFS Flag read = 0xFFFB0004
multiResetDetectorFlag = 0xFFFB0004
lowerBytes = 0x0004, upperBytes = 0x0004
No multiResetDetected, number of times = 4
LittleFS Flag read = 0xFFFB0004
Saving config file...
Saving config file OK
No Multi Reset Detected
Stop multiResetDetecting
Saving config file...
Saving config file OK
Starting ESP_MultiResetDetector minimal on ESP32_DEV using LittleFS
ESP_MultiResetDetector v1.3.2
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
No Multi Reset Detected
This is terminal debug output when running minimal on ESP8266_NODEMCU using LittleFS.. Config Portal was requested by MRD to input and save Credentials.
Starting ESP_MultiResetDetector minimal on ESP8266_NODEMCU using LittleFS
ESP_MultiResetDetector v1.3.2
multiResetDetectorFlag = 0x00000000
lowerBytes = 0x0000, upperBytes = 0xFFFF
lowerBytes = 0x0000, upperBytes = 0xFFFF
detectRecentlyResetFlag: Data corrupted. Reset to 0
No multiResetDetected, number of times = 0
Saving config file...
Saving config file OK
No Multi Reset Detected
Starting ESP_MultiResetDetector minimal on ESP8266_NODEMCU using LittleFS
ESP_MultiResetDetector v1.3.2
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
No Multi Reset Detected
Starting ESP_MultiResetDetector minimal on ESP8266_NODEMCU using LittleFS
ESP_MultiResetDetector v1.3.2
LittleFS Flag read = 0xFFFD0002
multiResetDetectorFlag = 0xFFFD0002
lowerBytes = 0x0002, upperBytes = 0x0002
No multiResetDetected, number of times = 2
LittleFS Flag read = 0xFFFD0002
Saving config file...
Saving config file OK
No Multi Reset Detected
Starting ESP_MultiResetDetector minimal on ESP8266_NODEMCU using LittleFS
ESP_MultiResetDetector v1.3.2
LittleFS Flag read = 0xFFFC0003
multiResetDetectorFlag = 0xFFFC0003
lowerBytes = 0x0003, upperBytes = 0x0003
No multiResetDetected, number of times = 3
LittleFS Flag read = 0xFFFC0003
Saving config file...
Saving config file OK
No Multi Reset Detected
Starting ESP_MultiResetDetector minimal on ESP8266_NODEMCU using LittleFS
ESP_MultiResetDetector v1.3.2
LittleFS Flag read = 0xFFFB0004
multiResetDetectorFlag = 0xFFFB0004
lowerBytes = 0x0004, upperBytes = 0x0004
No multiResetDetected, number of times = 4
LittleFS Flag read = 0xFFFB0004
Saving config file...
Saving config file OK
Starting ESP_MultiResetDetector minimal on ESP8266_NODEMCU using LittleFS
ESP_MultiResetDetector v1.3.2
LittleFS Flag read = 0xFFFA0005
multiResetDetectorFlag = 0xFFFA0005
lowerBytes = 0x0005, upperBytes = 0x0005
multiResetDetected, number of times = 5
Saving config file...
Saving config file OK
Multi Reset Detected
Starting ESP_MultiResetDetector minimal on ESP8266_NODEMCU using LittleFS
ESP_MultiResetDetector v1.3.2
LittleFS Flag read = 0xFFFB0004
multiResetDetectorFlag = 0xFFFB0004
lowerBytes = 0x0004, upperBytes = 0x0004
No multiResetDetected, number of times = 4
LittleFS Flag read = 0xFFFB0004
Saving config file...
Saving config file OK
No Multi Reset Detected
Stop multiResetDetecting
Saving config file...
Saving config file OK
Starting ESP_MultiResetDetector minimal on ESP8266_NODEMCU using LittleFS
ESP_MultiResetDetector v1.3.2
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
No Multi Reset Detected
This is terminal debug output when running ESPAsync_WiFi on ESP32 ESP32S3_DEV.. Config Portal was requested by MRD to input and save Credentials.
Starting ESPAsync_WiFi using LittleFS on ESP32S3_DEV
ESPAsync_WiFiManager_Lite v1.9.0
ESP_MultiResetDetector v1.3.2
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_S3
[WML] Hdr=ESP_WM_LITE,SSID=HueNet1,PW=12345678
[WML] SSID1=HueNet2,PW1=12345678
[WML] BName=ESP32_S3
[WML] WiFi networks found:
[WML] 1: HueNetTek, -30dB
[WML] 2: HueNet, -31dB
[WML] 3: HueNet1, -36dB
[WML] 4: HueNet2, -55dB
[WML] 5: SmartRG-02a2, -75dB
[WML] 6: AT_301_WLREL6325F_f66d, -75dB
[WML] 7: Linksys00043, -77dB
[WML] 8: El khoury, -79dB
[WML] 9: house, -79dB
[WML] 10: Waterhome, -87dB
[WML] 11: Offline5, -89dB
[WML] 12: Access, -90dB
[WML] 13: ESP151CD5, -90dB
[WML] 14: Jessie, -90dB
[WML] 15: AdeyemiHome, -90dB
[WML] 16: BELL627, -90dB
[WML] 17: JJ Realestate Investments, -90dB
[WML] 18: BELL042, -92dB
[WML] 19: VIRGIN874, -93dB
[WML] 20: BELL905, -95dB
[WML]
stConf:SSID=ESP_E1A1DF7C,PW=MyESP_E1A1DF7C
[WML] IP=192.168.4.1,ch=6
F
Your stored Credentials :
Blynk Server1 = account.duckdns.org
Token1 = token1
Blynk Server2 = account.ddns.net
Token2 = token2
Port = 8080
MQTT Server = mqtt.duckdns.org
Libraries using ESP_MultiResetDetector, ESP_DoubleResetDetector or DoubleResetDetector_Generic library
You can also see how ESP_MultiResetDetector
and DoubleResetDetector_Generic
are applied in many other libraries, such as:
- Blynk_WM
- BlynkEthernet_WM
- WiFiManager_NINA_Lite
- BlynkESP32_BT_WF,
- Blynk_GSM_Manager,
- Blynk_Esp8266AT_WM,
- Blynk_WiFiNINA_WM,
- Blynk_Async_WM,
- Blynk_Async_ESP32_BT_WF,
- Blynk_Async_GSM_Manager,
- ESP_WiFiManager
- ESPAsync_WiFiManager
- WiFiManager_NINA_Lite
- BlynkEthernet_STM32_WM,
- ESP_AT_WM_Lite
- WIOTerminal_WiFiManager
- Ethernet_Manager
- Ethernet_Manager_STM32
and the list is growing fast.
Debug is disabled by default. To enable debug:
// Use this to output debug msgs to Serial
#define MULTIRESETDETECTOR_DEBUG true
If you get compilation errors, more often than not, you may need to install a newer version of the ESP32 / ESP8266
core for Arduino.
Sometimes, the library will only work if you update the ESP32 / ESP8266
core to the latest version because I am using some newly added function.
Submit issues to: ESP_MultiResetDetector issues
- Search for bug and improvement.
- Similar features for Arduino (UNO, Mega, SAM DUE, SAMD21/SAMD51, nRF52, STM32, Teensy, etc.). Look at DoubleResetDetector_Generic
- Multi Reset Detector for ESP32 (EEPROM, SPIFFS and LittleFS) and ESP8266 (RTC, EEPROM, SPIFFS and LittleFS).
- Add support to
ESP32_C3
,ESP32_S2
- Add support to
ESP32_S3
using ESP32 core v2.0.2+ - Add waitingForMRD() function to signal in MRD waiting period.
- Fix ESP32 chipID for example
ConfigOnMultiReset
- Remove dependency on
LittleFS_esp32
library to prevent PIO error when using new ESP32 core v1.0.6+ - Add astyle using
allman
style. Restyle the library
- Thanks to kbssa for request enhancement in Issue 9: Not an issue, but a question, leading to this new ESP_MultiResetDetector Library
- Thanks to Tochi Moreno for enhancement request in DRD is waiting for a double reset? #14 leading to v1.3.1 to add
waitingForMRD()
function to signal in MRD waiting period
kbssa |
Tochi Moreno |
If you want to contribute to this project:
- Report bugs and errors
- Ask for enhancements
- Create issues and pull requests
- Tell other people about this library
- The library is licensed under MIT
Copyright (c) 2020- Khoi Hoang