Ich habe ein kleines Projekt erstellt in dem ich mit einem ESP32-H2 eine
Art Zeitschaltuhr gebaut habe. Das ganze ist Batteriebetrieben und soll
möglichst wenig Strom verbrauchen. Dazu schalte ich mittels
1 | esp_light_sleep_start();
|
den ESP nach kurze Inaktivität bei der Bedienung in den Schlafmodus.
Hier hätte ich erwartet das die Stromaufnahme deutlich sinkt, tut sie
aber nicht, im Gegenteil, es entstehen "Bursts", so als wolle er nicht
wirklich ruhen. Irgendwas reißt ihn mit 200 HZ aus dem Schlaf.
Mein Sleep-Code schaut aktuell so aus:
1 | void go_to_sleep() {
|
2 | ESP_LOGI(TAG, "Time to sleep! zzzzZZZ...\n");
|
3 | vTaskDelay(pdMS_TO_TICKS(100));
|
4 |
|
5 | iot_button_stop();
|
6 | xTimerStop(inactivity_timer, 0);
|
7 |
|
8 | esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_ALL); // disable ALL wakeup sources (just for safety)
|
9 |
|
10 | gpio_wakeup_enable(BUTTON_GPIO, GPIO_INTR_HIGH_LEVEL); // LOW -> HIGH wakeup
|
11 | esp_sleep_enable_gpio_wakeup();
|
12 |
|
13 | // USB-CDC vor Sleep deaktivieren
|
14 | usb_serial_jtag_driver_uninstall();
|
15 |
|
16 | sleep_indicator_sleeping(); // set GPIO4 to HIGH
|
17 |
|
18 | // SLEEP
|
19 | esp_light_sleep_start();
|
20 |
|
21 | sleep_indicator_awake(); // set GPIO4 to LOW
|
22 |
|
23 | // USB-CDC nach Sleep neu starten
|
24 | reinit_usb_cdc();
|
25 |
|
26 | ESP_LOGI(TAG, "Uuaaa, i woke up!\n");
|
27 | esp_sleep_wakeup_cause_t wakeup_reason = esp_sleep_get_wakeup_cause();
|
28 | ESP_LOGI(TAG, "Wakeup reason: %d", wakeup_reason);
|
29 |
|
30 | iot_button_resume();
|
31 | vTaskDelay(pdMS_TO_TICKS(500));
|
32 |
|
33 | xTimerReset(inactivity_timer, 0);
|
34 | }
|
Problem bei der Sache ist auch das Debugging. Wenn ich das Super-Mini
Board am USB lasse für Logmeldungen, kann ich keine Strommessung
durchführen weil es ja direkt vom USB versorgt wird und im anderen Fall
habe ich kein USB und somit kein Log :-/ Und im reinen USB-Modus sehe
ich nach dem Sleep nichts mehr weil sich die Console abkoppelt und nicht
automatisch wieder aufnimmt.