Om een ESP-01 spaarzaam om te laten gaan met energie wanneer deze op batterijen werkt is Deep-Sleep tijdens rust een optie, maar deze optie heeft twee nadelen: Er moet een hardware ingreep (!) worden gedaan via de I/O wake-Up pin met de Reset pin, en de CPU herstart volledig.
Een goed alternatief is Light-Sleep-on-Timer, maar door een bug (?) in de ESP-01 software wil de CPU na ontwaken niet altijd correct reageren. De maximale slaaptijd blijkt 1000.000 uS (1 seconde) te zijn waarna alsnog de resterende (..) delay tijd wordt doorlopen.
Na wat experimenteren kwam ik op de volgende Work-Around: Een functie waarin die ene Sec slaaptijd telkens opnieuw wordt aangeroepen totdat het gewenste ontwaakmoment wordt bereikt. De CPU is dan wel elke seconde even bezig met aftellen, maar dat zijn slechts enkele mSec.
Door in de main loop() alle tijdgebonden functie via millis() te lopen kan de slaapfunctie als een slaap optie worden aangeroepen...
void Sleep(int tijd) { while (tijd--) { wifi_set_opmode(NULL_MODE); wifi_fpm_set_sleep_type(LIGHT_SLEEP_T); wifi_fpm_open(); wifi_fpm_do_sleep(998500); delay(999); } } Wakker op millis 000074 voor 10 Sec .......... Slapen op millis 010074 voor 10 Sec Wakker op millis 020079 voor 10 Sec .......... Slapen op millis 030079 voor 10 Sec Wakker op millis 040080 voor 10 Sec .......... Slapen op millis 050081 voor 10 Sec Wakker op millis 060082 voor 10 Sec ..........
Met een maXer USB Stroom/Spanning tooltje meet ik nu 0mA tijdens het slapen, na ontwaken 10mA zonder Wifi en 60mA met (enkel) WiFi aan.
Heb je vragen of opmerkingen? Stuur me een berichtje en je krijgt alle gewenste informatie!