Willkommen zum zweiten Teil der Reihe „Smarte Katzenklappe“.
Im heutigen, letzten Teil der Reihe gehen wir auf ein sehr wichtiges Thema ein: Energie sparen!
Wer die Katzenklappe aus Teil1 nachgebaut hat, wird sicherlich über die Frage der Energieversorgung „gestolpert“ sein, denn so eine Elektronik an der Tür möchte zwar mit Strom versorgt werden, doch viele Kabel an der Tür möchte man aus optischen Gründen nicht verlegen. Erst recht nicht quer über die Tür. Also bleibt eigentlich eine einzig sinnvolle Option nur eine Akkuversorgung für unsere Katzenklappe übrig. Diese sollte jedoch möglichst lange unsere Schaltung mit Strom versorgen. Dabei gilt die Gleichung: Je kleiner der Stromverbrauch, desto länger hält der Akku bei gleicher Kapazität.
Rechnerisch ausgedrückt heißt das: A(mpere)*H(our) = Ah (Amperestunde). Die Kapazität eines Akkus wird in Ah angegeben, daher stellen wir die Formel nach der Zeit um: Zeit (In Stunden) = Amperestunden des Akkus / Ampere (Stromaufnahme des Verbrauchers). Nehmen wir als Beispiel an, wir betreiben unsere Katzenklappe mit einer 5Ah 5 Volt Powerbank. Zur Einfachheit vernachlässigen wir die Verlustleistung an den Spannungsreglern. Unsere Schaltung benötigt für den Betrieb bei 5 Volt - 122 mA.
Setzen wir diesen Wert in oben genannte Formel, können wir die voraussichtliche Betriebsdauer der Schaltung an unserem Akku berechnen: 5 Ah / 0,122 A = 40,98 Stunden / 24 Stunden = 1,71 Tage. Nicht viel, wenn man bedenkt, dass wir jedes Mal den Akku nach er Zeit neu aufladen müssen. Um dies zu ändern. Laden wir folgenden Code auf unseren ESP hoch:
#include <WiFi.h> #include <BlynkSimpleEsp32.h> // Portdefinierung Taster #define Cat_Go_SW 15 // Katze geht #define Cat_Comes_SW 2 // Katze kommt #define BLYNK_PRINT Serial #define BLYNK_NO_BUILTIN #define BLYNK_NO_FLOAT #define BUTTON_PIN_BITMASK 0x8004 //#define BLYNK_DEBUG //Global Variables char auth[] = "Hihpj9P8wjhUiTClwNGAa4RW7kx4XDax"; // Hier lt. Anleitung Auth Token dere Blynk App eintragen (E-Mail). bool result = 0; RTC_DATA_ATTR int bootCount = 0; // Deine WiFi Zugangsdaten. char ssid[] = "WLANGW1339"; char pass[] = "A09703471882406B#!"; // Set password to "" for open networks. unsigned long Switch_ServiceCall_Handler = 0; // Delay Variable for Delay between Moisure Readings bool State_Cat_Go_old = false; bool State_Cat_Comes_old = false ; int GPIO_reason = 0; byte TryCounter = 0; 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.println("Wakeup was not caused by deep sleep."); break; } } void print_GPIO_wake_up() { if (GPIO_reason != 0) { Serial.print("GPIO that triggered the wake up: GPIO "); Serial.println((log(GPIO_reason)) / log(2), 0); } } void setup() { ++bootCount; //Increment boot number and print it every reboot pinMode(Cat_Go_SW, INPUT); pinMode(Cat_Comes_SW, INPUT); Serial.begin(9600); // initialize serial communication at 9600bits per second while (!Serial) { } // wait for serial port to connect. Needed for native USB Serial.println(F("")); Serial.println("Boot number: " + String(bootCount)); print_wakeup_reason(); //Print wakeup Reason GPIO_reason = esp_sleep_get_ext1_wakeup_status(); print_GPIO_wake_up(); //Print wakeup Reason Port WiFi.persistent(false); WiFi.begin(ssid, pass); Serial.print("Trying to establishing connection to WiFi"); while ((WiFi.status() != WL_CONNECTED) && (TryCounter < 10)) { delay(1000); TryCounter++; Serial.print("."); } Serial.println("."); if (WiFi.status() == WL_CONNECTED) { if (GPIO_reason != 0) { Blynk.config(auth); while (Blynk.connect() == false) { } // Wait until connected Serial.println(F("Connected to Blynk Server.")); Send_Handy_Message (); for (byte a = 0; a > 254; a++) { Blynk.run(); } delay(10000); } } else { Serial.println("Counld NOT establish Connection to WiFi Network."); } WiFi.disconnect(); esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK, ESP_EXT1_WAKEUP_ANY_HIGH); Serial.println("Going to sleep now."); esp_deep_sleep_start(); } void Send_Handy_Message () // { byte convert = 0; convert = log(GPIO_reason) / log(2); if (convert == 2) { Serial.println("Cat is coming."); Blynk.notify ("Hinweis: Katze Kommt"); } if (convert == 15) { Serial.println("Cat is going."); Blynk.notify ("Hinweis: Katze geht"); } } // Main Loop void loop() { //This is not going to be called }
Unsere Schaltung benötigt nun für den Betrieb bei 5 Volt und gleicher! Funktion jetzt nur noch 10 mA.
Eine Änderung der Hardware im Vergleich zum Teil 1 ist nicht notwendig.
Setzen wir diesen Wert wieder in die Formel, können wir die neue voraussichtliche Betriebsdauer der Schaltung berechnen: 5 Ah / 0,010 A = 500 Stunden / 24 Stunden = 20,83 Tage. Das ist eine Verzwölffachung der Laufzeit durch Anpassen des Codes und Nutzung des Deep Sleep Modus des ESP32 Chips! Nicht schlecht fürs erste.
Wer jedoch noch weiter seine Schaltung optimieren will, kann die Stromaufnahme durch Entfernung des USB- to Serial Converters CP2102 auf dem DEV Board nochmals um die Hälfte reduzieren. Die Platzierung des Chips CP2102 habe ich dazu auf dem Board rot umrandet:
Nach Entfernung dieses Chips ergäbe sich durch die reduzierte Stromaufnahme rechnerisch eine Laufzeit von ca. 41 Tagen pro Aufladung.
Genug für einen bequemen Betrieb, jedoch kann der Chip dann nicht mehr über USB direkt programmiert werden. Laut Datenblatt verbraucht der ESP32 im Deep Sleep einige Mikroampere. Es ist daher durchaus möglich, z.B. durch Entfernung des Spannungsreglers und direkt Versorgung mit 3,3 Volt wiederum einige mA zu sparen. Allerdings empfehle ich in diesem Fall direkt nur einen ESP32 Chip oder den ESP32 Chip mit Adapterkarte zu verwenden, und nicht mehr das ESP DEV Board.
Ich wünsche viel Spaß beim Nachbauen und bis zum nächsten Projekt.
6 comments
Andreas Wolter
@Anja: was die LED betrifft tippe ich auf Auslöten, da sie fest verdrahtet ist. Ich hab dazu nochmal ein wenig recherchiert und finde keine andere Möglichkeit.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Anja
Ich habe das Modul gerade im Einsatz um einen Öltanksensor zu betreiben. Gemessen wird mit einem TOF Modul mit Laser einmal am Tag und das wird dann per WiFi an Thingspeak geschickt. Dafür habe ich nun das Modul in Hibernation geschickt sobald es fertig ist und das TOF Modul wird mit einem der RTC Pins auf Powersave umgestellt.
Aktiv braucht das Modul über 100mA, vor allem wohl wegen dem WiFi – das führt ab und zu zu brownouts wenn ich es per AA Batterien betreibe (3 AA Batterien in Serie über den Vcc Eingang). Im Hibernation Modul braucht es leider immer noch 1.8mA – 1.6 wenn ich das TOF Modul ganz abstecke – der Schlafmodul dort ist also wohl auch noch nicht perfekt aktiviert, denn das sind dann doch immer noch 200µA, da muss ich noch mal dran basteln, aber die 1.6mA stören mich doch, dadurch läuft das Modul trotz seltener Messung vielleicht 14 Tage oder ein Monat. Die Power LED brennt leider auch die ganze Zeit – kann man die noch irgendwie deaktivieren oder muss man die auslöten?
Oliver
@Werner99,
Manchmal will der ESP32 (gleiches Problem auch bei ESP8266) einfach nicht mit dem WLAN verbinden. Da hilft dann nur ein Reset und anschließender Neustart.
Ich hab das so gelöst:
- Nach dem Aufwachen aus dem Deepsleep Modus wird ein WLAN Verbindungsversuch unternommen und ca. 5 Sekunden auf die Verbindung mit dem WLAN gewartet.
- Verbindet das WLAN ist alles ok, die gewünschte Aktion wird ausgeführt und der Chip geht erneut in den Deepsleep und wartet auf den nächsten Wakeup.
- Verbindet das WLAN aus welchem Grund auch immer nicht wird der Deepsleep auf z.b. 10 Sekunden Dauer gesetzt und der Chip wird mit dieser kurzen Deeplsleepzeit wieder schlafen geschickt.
- Nach Ablauf der kurzen Deepsleep Zeit erfolgt ein neuer Verbindungsversuch.
Im Prinzip wird dadurch nur ein Reset nach relativ kurzer Deepsleepzeit provoziert
Ich setze diese Methode schon seit Langem bei einem Außensensor ein, der alle 6 Stunden einen Messwert liefern soll. Klappt bisher wunderbar.
Gruß,
Oliver
Werner99
Sehr interessantes Projekt :-)… ich hoffe es macht die Katze froh :-)
Mich würde interessieren ob es denn auch zuverlässig läuft?
Blöde Frage möchte man meinen, aber meine Erfahrung mit Deep Sleep und WLAN reconnect ist:
Es läuft nicht stabil, sprich der ESP versucht x-Mal den reconnect nach den Deep sleep wake up.. und verbrät dabei soviel Energie das auch ein LiPo mit 3000mAh bei nach 2Tagen leer ist… Es gibt im Netz genügend dieser Fehlerbeschreibung. Bislang habe ich noch keine funktionierte Lösung finden können.
Manchmal läuft das ganze auch eine Woche ohne Probleme und man denkt, ja prima aber nach den nächsten Aufladen ist wieder alles beim Alten..
Solange man aber kein WLAN (und MQTT) braucht, z.B. nur lokale Messwert auf einen eInkDisplay anzeigen, klappt das mit den Deep sleep hervorragend.
Ralf Bauerfeind
Es ist doch interessant dass allgemein gedacht wird, eine Powerbank mit 5Ah Kapazität und 5V Ausgangsspannung hätte eine Energie von 25Wh. Leider wird die Energie auf Powerbanks – im Gegensatz zu Laptopakkus – nicht angegeben.
Ich denke eher, die 5Ah sind die Kapazität der verbauten, parallel geschalteten Li-Ionen Akkus. Mal rund gerechnet 3,5V * 5Ah ergäbe dann aber nur noch 17,5Wh – mal ganz abgesehen davon dass die Wandlung von 3,5V auf 5V auch nicht ganz ohne Verluste abgeht.
CrazyNepo
Hi, Cooles Projekt.
Ihr habt nur vergessen die Zugangsdaten zu Blynk und Wlan zu schwärzen.