Welkom bij het tweede deel van de serie "Smart Cat Flap".
In het laatste deel van vandaag gaan we in op een heel belangrijk onderwerp: energie besparen!
Iedereen die de kattenluik uit deel 1 heeft herbouwd, zal zeker zijn "gestruikeld" over de kwestie van energietoevoer, omdat dergelijke elektronica op de deur wel van stroom wil worden voorzien, maar veel kabels op de deur willen om optische redenen niet worden gelegd. Vooral niet tegenover de deur. Er is dus eigenlijk maar één verstandige optie, alleen een batterijvoeding voor onze kattenluik. Dit moet ons circuit echter zo lang mogelijk van stroom voorzien. De volgende vergelijking is van toepassing: hoe lager het stroomverbruik, hoe langer de batterij meegaat met dezelfde capaciteit.
In wiskundige termen betekent dit: A (mpere) * H (onze) = Ah (ampère uur). De capaciteit van een batterij wordt gegeven in Ah, dus we veranderen de formule volgens de tijd: Tijd (in uren) = ampère-uren van de batterij / ampère (stroomverbruik door de consument). Laten we als voorbeeld nemen, we bedienen onze kattenluik met een 5Ah 5 volt powerbank. Voor de eenvoud negeren we het vermogensverlies bij de spanningsregelaars. Ons circuit vereist werking op 5 volt - 122 mA.
Als we deze waarde instellen in de bovenstaande formule, kunnen we de verwachte bedrijfstijd van het circuit op onze batterij berekenen: 5 Ah / 0,122 A = 40,98 uur / 24 uur = 1,71 dagen. Niet veel, gezien het feit dat we de batterij elke keer moeten opladen. Om dat te veranderen. Laten we de volgende code uploaden naar onze ESP:
# opnemen <WiFi.h> # opnemen <BlynkSimpleEsp32.h> // Poortdefinitieknop #define Cat_Go_SW 15 // kat gaat #define Cat_Comes_SW 2 // kat komt eraan #define BLYNK_PRINT Serie #define BLYNK_NO_BUILTIN #define BLYNK_NO_FLOAT #define BUTTON_PIN_BITMASK 0x8004 // # definieer BLYNK_DEBUG // Globale variabelen char auth[] = "Hihpj9P8wjhUiTClwNGAa4RW7kx4XDax"; // Voer de Blynk-app in volgens de instructies voor het Auth Token (e-mail). dwaas resultaat = 0; RTC_DATA_ATTR int bootCount = 0; // Uw wifi-toegangsgegevens. char ssid[] = "WLANGW1339"; char doorgeven[] = "A09703471882406B #!"; // Stel wachtwoord in op "" voor open netwerken. niet ondertekend lang Switch_ServiceCall_Handler = 0; // Vertragingsvariabele voor vertraging tussen metingen van de vrije tijd dwaas State_Cat_Go_old = fout; dwaas State_Cat_Comes_old = fout ; int GPIO_reason = 0; byte TryCounter = 0; nietig print_wakeup_reason() { esp_sleep_wakeup_cause_t wakeup_reason; wakeup_reason = esp_sleep_get_wakeup_cause(); schakelaar (wakeup_reason) { geval ESP_SLEEP_WAKEUP_EXT0 : Serie.println("Wakeup veroorzaakt door extern signaal met RTC_IO"); pauze; geval ESP_SLEEP_WAKEUP_EXT1 : Serie.println("Wakeup veroorzaakt door extern signaal met RTC_CNTL"); pauze; geval ESP_SLEEP_WAKEUP_TIMER : Serie.println("Wakker worden door timer"); pauze; geval ESP_SLEEP_WAKEUP_TOUCHPAD : Serie.println("Wakeup veroorzaakt door touchpad"); pauze; geval ESP_SLEEP_WAKEUP_ULP : Serie.println("Wakeup veroorzaakt door ULP-programma"); pauze; standaard : Serie.println("Wakeup werd niet veroorzaakt door diepe slaap."); pauze; } } nietig print_GPIO_wake_up() { als (GPIO_reason != 0) { Serie.afdrukken("GPIO die de wake-up heeft geactiveerd: GPIO"); Serie.println((gelogen(GPIO_reason)) / gelogen(2), 0); } } nietig instellen() { ++bootCount; // Verhoog het opstartnummer en druk het elke keer opnieuw af pinMode(Cat_Go_SW, INGANG); pinMode(Cat_Comes_SW, INGANG); Serie.beginnen(9600); // initialiseer seriële communicatie met 9600 bits per seconde terwijl (!Serie) { } // wacht tot seriële poort verbinding maakt. Nodig voor native USB Serie.println(F("")); Serie.println("Boot nummer:" + Draad(bootCount)); print_wakeup_reason(); // Print wake-up reden GPIO_reason = esp_sleep_get_ext1_wakeup_status(); print_GPIO_wake_up(); // Print wakeup Reason Port Wifi.aanhoudend(fout); Wifi.beginnen(ssid, voorbij gaan aan); Serie.afdrukken("Proberen verbinding tot stand te brengen met WiFi"); terwijl ((Wifi.toestand() != WL_CONNECTED) && (TryCounter < 10)) { vertraging(1000); TryCounter++; Serie.afdrukken("."); } Serie.println("."); als (Wifi.toestand() == WL_CONNECTED) { als (GPIO_reason != 0) { Blynk.config(auth); terwijl (Blynk.aansluiten() == fout) { } // Wacht tot verbinding Serie.println(F("Verbonden met Blynk Server.")); Send_Handy_Message (); voor (byte een = 0; een > 254; een++) { Blynk.rennen(); } vertraging(10000); } } anders { Serie.println("Raad GEEN verbinding met WiFi-netwerk tot stand."); } Wifi.verbinding verbreken(); esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK, ESP_EXT1_WAKEUP_ANY_HIGH); Serie.println("Nu gaan slapen."); esp_deep_sleep_start(); } nietig Send_Handy_Message () // { byte converteren = 0; converteren = logboek(GPIO_reason) / logboek(2); als (converteren == 2) { Serie.println("Kat komt eraan."); Blynk.melden ("Hinweis: Katze Kommt"); } als (converteren == 15) { Serie.println("Cat gaat."); Blynk.melden ("Hinweis: Katze geht"); } } // Hoofdlus nietig lus() { // Dit wordt niet genoemd }
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. Dit is een Verzorgingssoftware van Anpass des Codes en 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. door 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 Reacties
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.