Deep Sleep

Hier werden einzelne Projekte mit MicroPython vorgestellt
Antworten
Heinrichs
Beiträge: 183
Registriert: Do 21. Okt 2010, 18:31

Deep Sleep

Beitrag von Heinrichs » Sa 20. Nov 2021, 12:32

Bei zahlreichen Anwendungen muss der Mikrocontroller nur von Zeit zu Zeit aktiv werden. Insbesondere beim Betrieb über eine Batterie oder einen Akku lohnt es sich dann, den ESP32 in einen Tiefschlaf (deep sleep) zu versetzen. In diesem Zustand soll der ESP32 angeblich nur einige uA benötigen. Beim TTGO-Modul ist zu berücksichtigen, dass auch die auf dem Board angebrachte Peripherie (selbst bei ausgeschaltetem Display) zusätzlichen Strom benötigt. Der Hersteller des Boards gibt für die Stromstärke im Schlafmodus einen Wert von 350 uA an; vermutlich bezieht sich dieser Wert auf eine Stromversorgung über zwei 1,5-Volt-Batterien. Bei einer Versorgung über die USB-Schnittstelle findet man eine deutlich höhere Stromstärke. Meine Messungen ergaben für diesen Fall:

Code: Alles auswählen

Zustand     | Leerlauf | Tiefschlaf
------------+----------+-----------
Stromstärke | 0,036 A  | 0,007 A 
Immerhin könnte somit das Modul über eine 10 000 mAh Powerbank ca. 60 Tage im Tiefschlaf betrieben werden.


In diesem Beitrag soll nun an einem einfachen Beispiel gezeigt werden, wie man den ESP32
  • in einen Tiefschlaf versetzt,
  • per Knopfdruck wieder aufweckt.

Das folgende Programm lässt eine LED (an Pin 25) blinken. Wenn dann der Taster GPIO0 des TTGO-Moduls (für 1 Sekunde) betätigt worden ist, wird die Schleife abgebrochen und der ESP32 wird 10 Sekunden später mit dem Kommando deepsleep in den Tiefschlaf versetzt. Mit dem Taster GPIO35 kann dann der ESP32 wieder aufgeweckt werden; er führt dabei einen Reboot aus. Natürlich müssen die Pins GPIO0 und GPIO35 vorher entsprechend konfiguriert worden sein (vgl. Programmcode).

Wenn das Programm nicht über die REPL läuft, sondern als 'main.py' auf dem ESP32 hochgeladen worden ist, dann wird durch diesen Boot-Vorgang das Programm wieder gestartet und die LED fängt wieder an zu blinken. In diesem Fall ist dafür Sorge zu tragen, dass z. B. durch einen sleep-Befehl vor dem Einschlaf-Befehl ein Zeitraum geboten wird, in dem man von der IDE aus das Programm stoppen kann, um so wieder Zugriff auf den ESP32 zu erlangen.

In dem folgenden Programm sind einige print-Befehle eingefügt, welche dem Benutzer Informationen über den Zustand des ESP32 geben; diese können natürlich gelöscht werden.

Code: Alles auswählen

# deep_sleep_button_1a.py

# TTGO in Tiefschlaf (deepsleep) versetzen und mittels Taster wieder aufwecken
# Weitere Informationen: https://randomnerdtutorials.com/micropython-esp32-deep-sleep-wake-up-sources/

# Nachdem der TTGO mit dem deepsleep-Befehl in den Tiefschlaf-Zustand versetzt worden ist, kann er mit dem Taster GPIO35
# des TTGO-T-Display-Moduls wieder aufgeweckt werden. Dabei führt der TTGO einen reboot durch.
# Wenn das Programm als 'main.py' auf dem ESP32 hochgeladen worden ist, dann wird dieses Programm nach dem Booten erneut ausgeführt.

# Für erste Tests sollte man das Programm deep_sleep_button_1a.py allerdings von der REPL aus starten. 

import esp32
from machine import Pin, deepsleep
from time import sleep

led = Pin(25, Pin.OUT) # LED an Pin 25
wake_button = Pin(35, Pin.IN) # externer Pull-Up-Widerstand (100K) auf dem TTGO-Board
stop_button = Pin(0, Pin.IN, Pin.PULL_UP) # interner Pull-Up-Widerstand des ESP32

# Mögliche Level-Parameter: esp32.WAKEUP_ANY_HIGH (True) bzw. esp32.WAKEUP_ALL_LOW (False)
esp32.wake_on_ext0(pin = wake_button, level = esp32.WAKEUP_ALL_LOW) # aufwecken, wenn der Taster GPIO35 betätigt wird

# Hier beginnt das "Hauptprogramm", in unserem Fall eine Blink-Schleife
print('Taster GPIO0 länger als 1 s drücken -> DeepSleep')
while stop_button.value(): # Schleife wird abgebrochen, wenn der Taster GPIO0 gedrückt wird (1 Sekunde)
    led.value(1)
    sleep(0.5)
    led.value(0)
    sleep(0.5)
# Dies ist das Ende des "Hauptprogramms"

# Einleitung des Schlafzustands...
print()
print('Noch bin ich wach, aber in 10 Sekunden gehe ich schlafen.') 
print('Abbruch des Count-Downs mit Strg-C möglich!')
# Warte-Schleife: In dieser Pause ist Gelegenheit, das Programm über die IDE zu stoppen!!!
for i in range(10):
    print(10-i, end=' .. ')
    sleep(1.0)
print()    
print('Jetzt gehe ich schlafen... Wecken mit Taster GPIO35')
deepsleep()    

    


Antworten