Ich bin neu hier und dies ist mein erster Eintrag hier. Sollte ich gegen etwas verstoßen haben dann gebt mir bitte eine kurze Info. Lieben Dank.
Hier aber nun mein Problem:
Ich möchte einen ESP32 so lange schlafen lassen wie ein Taster gedrückt ist. Man kann auch sagen so lange ein Türchen geschlossen ist so lange ist auch der Taster gedrückt. Mein Code hierzu sieht wie folgt aus:
#include <Arduino.h>
#include <esp_sleep.h>
const int buttonPin = 35; // GPIO35 für den Taster
volatile bool buttonPressed = false;
void buttonISR() {
buttonPressed = true;
}
void setup() {
Serial.begin(115200);
// Pin für den Taster als Eingang mit Pull-Down-Widerstand konfigurieren
pinMode(buttonPin, INPUT_PULLDOWN);
// ISR (Interrupt Service Routine) für den Taster anmelden
attachInterrupt(digitalPinToInterrupt(buttonPin), buttonISR, CHANGE);
// Konfiguration des GPIO35 als Wakeup-Pin
esp_sleep_enable_ext1_wakeup(1ULL << buttonPin, ESP_EXT1_WAKEUP_ANY_HIGH);
}
void loop() {
if (buttonPressed && digitalRead(buttonPin) == LOW) {
Serial.println("Taster wurde gedrückt!");
// Optional: Verzögerung oder Entprellzeit
delay(1000); // 1 Sekunde Verzögerung
// Zurücksetzen des Flags
buttonPressed = false;
// Hier können Sie den ESP aus dem Deep Sleep wecken
esp_deep_sleep_start();
}
Serial.println("jetzt bin ich im Loop");
}
Allerdings macht der ESP nun genau das Gegenteil. Er schläft wenn der Taster nicht gedrückt ist und "arbeitet" wenn die Taste gedrückt ist. Ich hätte es aber gerne das er schläft wenn die Taste gedrückt ist und Arbeitet wenn nicht gedrückt.
Hintergrund ist das ich gerne eine Info bekommen möchte wenn in den Briefkasten etwas eingeworfen wird.
Nur mal so als Gedankengang. Warum den ESP nur schlafen schicken? Warum nicht den kompletten Stromkreis kappen? So könntest dir die Programmierung sparen.
Solche Türkontakte haben meist einen NC Schalter (Normally Closed). Die Tür drückt auf den Schalter, der Schalter öffnet, und das Licht (im Kühlschrank) geht aus.
Wenn du denkst, der "Normalfall" sei die geschlossene Tür, bist du anderer Meinung als der Schalter
Ist es nicht möglich, mit dem Türkontakt den ESP komplett abzuschalten, statt ihn nur schlafen zu lassen?
Hallo das hatten wir schon mal.
Problem ist wenn der Briefkasten nur kurz geöffnet wird, dann reicht die Zeit nicht um den Sketch komplett ablaufen zu lassen. Man müsste eine Art Selbsthaltung mit ein paar externen Bauteilen bauen . Vorschläge dazu gab´s hier auch schon.
Das ist richtig, bischen Bauteile braucht es. Den Schaltplan kann ich gern zur Verfügung stellen. Prinzip wäre dann: Schalter schließt den Stromkreis, ESP startet und macht was er machen soll. Und wenn fertig kappt sich der ESP über einen digital Pin die eigene Stromversorgung.
... einem Briefträger zufällig schonmal bei der Arbeit zugesehen? Wenn es nicht gerade eine Schneckenpost ist, werden die Briefe in unter einer Sekunde im Kasten versenkt.
Ein S-R-Flipflop aus der CMOS Serie wäre ein geeignetes Mittel, um den Zustand zwischenzuspeichern, braucht fast keinen Strom ...
Was es aber meiner Meinung nach auch braucht, etwas dass verhindert, dass der ESP gar nicht mehr schläft / aus geht. Weil was passiert wenn der Deckel vom Briefkasten nicht geschlossen wird, oder Sachen eingeworfen werden, die das schließen verhindern.
Dem könnte man mit zusätzlicher "Halte-Stoppelektronik" entgegenwirken. Dann einfach nach einer Ablaufzeit den Controller selbst ausschalten.
Oder den Schalter so anbringen, dass er nur an bestimmter Stelle (fast ganz auf) schaltet.
Muss halt probiert werden.
Hm...
ich würde im BK einen doppelten Boden einbauen, den Oberen auf einem Microschalter wirkend der den Strom einschaltet wenn eine Last drauf kommt.
Strom einschalten = ESP hochfahren, einmal eine Nachricht senden und dann schlafen legen.
Schon Du mal einen Zettel, der z.B. den Schornsteinfeger oder eine Zählerablesung ankündigt gewogen?
Da braucht es neben der Mikroelektronik auch noch Mikromechanik.
habe ich einen Demo-Code gefunden
und heftig modifiziert damit der Code Klartext redet was er macht.
Das ist insbesondere dann hilfreich wenn man sich im IO-pin vertan hat
oder wenn man einen Denkfehler zwischen pullup/pulldown-widerstand und "Aufweck-Pegel" hat.
Um einen ESP32 per Spannungspegel LOW oder HIGH aus dem deepsleep aufzuwecken
reicht es den deep-sleep-modus zu konfigurieren. Da müssen sonst keine weiteren Variablen mehr verwendet werden.
// you can use either a external PULL-DOWN-resistor
// in combination with wakeup on HIGH
// or
// you can use either a external PULL-UP-resistor
// in combination with wakeup on LOW
// START OF WAKEUP-CONFIGURATION_DETAILS
const gpio_num_t wakeUP_Pin = GPIO_NUM_35;
byte wakeUpLevel = HIGH; // waking up from deepsleep is invoked by this logic level
// END OF WAKEUP-CONFIGURATION_DETAILS
RTC_DATA_ATTR int bootCount = 0;
byte buttonStateOnWakeUp;
byte buttonStateBeforeGoingToSleep;
void setup() {
// a wakeup from deep-sleep means the ESP32 is booting NEW
// the booting-process requires aproximately 1,5 seconds
// this means if the wakeup-button is pressed only for a short moment
// the IO-state when reading in the IO-pin might have ALREADY CHANGED
buttonStateOnWakeUp = digitalRead(wakeUP_Pin);
Serial.begin(115200);
while(!Serial);
Serial.println("Setup-Start");
//delay(1000); //Take some time to open up the Serial Monitor
printWakeUpInfos();
print_wakeup_reason();
bootCount++; //Increment boot number and print it every reboot
Serial.println("Boot number: " + String(bootCount));
Serial.println("to send a message the code must be inserted here");
/*
First we configure the wake up source
We set our ESP32 to wake up for an external trigger.
There are two types for ESP32, ext0 and ext1 .
ext0 uses RTC_IO to wakeup thus requires RTC peripherals
to be on while ext1 uses RTC Controller so doesnt need
peripherals to be powered on.
Note that using internal pullups/pulldowns also requires
RTC peripherals to be turned on.
*/
esp_sleep_enable_ext0_wakeup(wakeUP_Pin, wakeUpLevel); // HIGH or LOW
//If you were to use ext1, you would use it like
//esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK,ESP_EXT1_WAKEUP_ANY_HIGH);
printWait_IO_PinState();
Serial.println("Going to sleep now ....\n\n");
esp_deep_sleep_start();
Serial.println("This will never be printed");
}
void loop() {
//This is not going to be called
}
void printWakeUpInfos() {
Serial.print("esp_sleep_enable_ext0_wakeup is configured to use GPIO-Pin ");
Serial.println(wakeUP_Pin);
Serial.print("wakeup is configured for wakeup on ");
if (wakeUpLevel == HIGH) {
Serial.println("HIGH");
}
else {
Serial.println("LOW");
}
Serial.print("buttonStateOnWakeUp has logic level ");
if (digitalRead(wakeUP_Pin) == HIGH) {
Serial.print("HIGH");
}
else {
Serial.print("LOW");
}
Serial.println();
}
void print_wakeup_reason() {
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause();
switch (wakeup_reason) {
case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Wakeup caused by timer"); break;
case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break;
case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break;
default : Serial.printf("Wakeup was not caused by deep sleep: %d\n", wakeup_reason); break;
}
}
void printWait_IO_PinState() {
Serial.println();
Serial.print("waiting some seconds before going to sleep");
for (byte i = 0; i < 10; i++) {
Serial.print(".");
delay(500);
}
Serial.println();
buttonStateBeforeGoingToSleep = digitalRead(wakeUP_Pin);
Serial.print("after waiting the wakeup-pin has state ");
if (buttonStateBeforeGoingToSleep == HIGH) {
Serial.println("HIGH");
}
else {
Serial.println("LOW");
}
}
Sorry, ich habe da noch eine Frage. Da der ESP Mini D1im DeepSleep 2,4 mA (auch wegen dieser blöden roten LED) verbraucht und der ESP8266 nur 0,46 mA mit der gleichen Schaltung wollte ich Fragen wie ich es hier umsetzen kann? Der obige Code funktioniert leider hier nicht. Die Möglichkeit den ESP8266 aus dem DeepSleep per Reset-Taste zu holen ist bei mir ja nicht möglich da der Taster ja die ganze Zeit gedrückt ist bei geschlossenen Briefkasten.
Die allermeisten ESP8266 und ESP32-boards sind nicht auf minimalen Stromverbrauch hin optimiert.
Mit diesem Board kommt man auf 0,015 mA herunter
Es gibt Schalter mit Öffner-Kontakten und es gibt Schalter mit Schließer-kontakten
Öffner-Kontakte sind unbetätigt geschlossen und werden bei Betätigung geöffnet
Schließer-Kontakte sind unbetätigt geöffnet und werden bei Betätigung geschlossen
Zitat aus diesem Tutorial
The RST pin of the ESP8266 is always HIGH while the ESP8266 is running. However, when the RST pin receives a LOW signal, it restarts the microcontroller.
Also wenn du einen Öffner-Schalter verwendest dann ist der bei Briefkastendeckel zu geöffnet.
Wenn der Deckel angehoben wird schließt sich der Kontakt und es gibt einen Reset.
Die stromsparendste Methode hat "Bese(r) Bube 17 schon genannt.
Den ganzen ESP8266 nur dann mit Strom versorgen wenn der Deckel angehoben wird.
Das würde man auch mit einem Öffnet-Kontakt machen.
Als Programm läuft dann ein Code der per ESP-NOW einen Befehl an einen zweiten ESP sendet.
ESP-NOW hat den Vorteil, dass der Befehl schon nach 1,5 Sekunden abgesetzt ist.
Eine WLAN-Verbindung aufbauen dauert unter Umständen 10 Sekunden oder noch länger.
Kann man auch machen, dann brauchst du aber eine Zusatzschaltung genannt Mono-Flop die den ESP 30 Sekunden lang mit Strom versorgt und dann erst wieder anschaltet.
Oder du musst den ESP eine sogenannte Selbsthaltung ansteuern lassen.
Das ist dann ein kleines Relais oder Transistor der den evtl. schnell wieder geöffneten Taster überbrückt