ESP32 wakeup von Deep Sleep mit Taster oder RTC (Ds3231) Alarm

OP #6123565
Lesenswert?

Hallo,
ich habe schon einiges gesucht,  bin aber weder fündig geworden noch 
kompetent genug,  um das Problem zu lösen.

Ich möchte einen esp32 mit Taster oder RTC Alarm aufwecken. Beides soll 
möglich sein.

Für mehrere externe Waekup Gründe gibt es eigentlich die 
"esp_sleep_enable_ext1_wakeup" Funktion. Diese kann leider nur ANY_HIGH 
oder ALL_LOW behandeln. Letzteres macht mit dem Wunsch Taster ODER 
RTCalarm keinen Sinn, ersteres stellt mich vor das Problem, dass der 
Ds3231 bei Alarm auf low schaltet und sonst auf high steht.

Wie kann ich das am einfachsten lösen?

vielen Dank für die Hilfe
Markus
#6124749
Lesenswert?

Hatte bei mir ein ähnliches problem:


//Button (GPIO 26) auf Low (0)
esp_sleep_enable_ext0_wakeup(GPIO_NUM_26,0);

//Button (GPIO MASK = 2^27 = 0x800 0000 -> GPIO 27) auf Low (0)
esp_sleep_enable_ext1_wakeup(0x8000000,ESP_EXT1_WAKEUP_ALL_LOW);


Bei mir kann entweder IO27 oder IO26 auf Low um den ESP32 aufzuwecken.

Jetzt musst du nur noch die Maske für deine Pins anpassen.
OP #6125065
Lesenswert?

Hallo Martin, das Signal zu invertieren per MOSFET oder einer anderen 
Schaltung ist möglich und eine gute Idee, aber John P. hat da die 
"einfachere" Lösung.
Dass die ext1 und ext0 zusammen verwendet werden können war mir nicht 
bewusst und findet sich auch sonst nirgends in Beispielen (und den vor 
mir gelesenen Dokumentationen).
Vielen Dank für Eure Unterstützung!
#7457959
Lesenswert?

Hallo, ich hab einen NodeMCU ESP32 und möchte den über zwei pins aus dem Deep-sleep wecken. Das funktioniert soweit auch, allerdings sind die Eingänge entweder High oder schwebend, deswegen wird oft grundlos geweckt.

1
#define BUTTON_PIN_BITMASK 0x200004000 // 1000000000000000000100000000000000
2
pinMode(GPIO_NUM_14, INPUT);
3
pinMode(GPIO_NUM_33, INPUT);
4
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
5
// rtc_gpio_pulldown_en(GPIO_NUM_14);
6
// rtc_gpio_pulldown_en(GPIO_NUM_33);
7
esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK,ESP_EXT1_WAKEUP_ANY_HIGH);

Ich kann die internen Pull-Downs aktivieren um das zu verhindern. Nun kann ich aber die Eingänge nicht mehr im Programm abfragen und das wecken funktioniert nicht mehr, die Pins sind dann dauerhaft LOW. Warum?

Nun habe ich es mit einem externen Pull-Down von 10k versucht, daraufhin wurde das NodeMCU äußerst heiß und ist ausgestiegen. Keine Ahnung was da passiert ist, aber ich möchte es nicht noch mal riskieren und noch ein weiteres Board schrotten.

Wie kann ich stattdessen die internen Pull-downs ordnungsgemäß aktivieren?

Das HIGH kommt übrigens von einem STM32 und ist direkt mit dem ESP32 verbunden.

#7458699
Lesenswert?

Ich habe auf die RTC komplett verzichtet und nun geht es. War wohl ein Denkfehler - obwohl nur RTC Pins zum wecken vorgesehen sind, wird RTC nicht benötigt.

1
#define BUTTON_PIN_BITMASK 0x200004000
2
pinMode(GPIO_NUM_14, INPUT_PULLDOWN);
3
pinMode(GPIO_NUM_33, INPUT_PULLDOWN);
4
esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK,ESP_EXT1_WAKEUP_ANY_HIGH);
#7459610
Lesenswert?

Hach... irgendwie kriege ich es nicht hin. Zu früh gefreut, das Wecken funktioniert nun zwar einwandfrei, dafür kann ich die Pins aber nicht mehr im Wachzustand als Eingänge nutzen - sind immer LOW. Erst im Deep-Sleep wird das HIGH erkannt.

Also entweder pinMode(GPIO_NUM_14, INPUT) dann gibt's keinen Pulldown, oder pinMode(GPIO_NUM_14, INPUT_PULLDOWN) dann gibt's kein HIGH mehr. Die 3.3 V liegen sauber an, was da los? Compileroptimierung der Arduino IDE?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren