Stromsparmaßnahmen für die MicroPython-Firmware im Batteriebetrieb

Wär jetzt interessant zu wissen, wie viele Sendezyklen er jetzt im vergleich zu 0.5.1 geschafft hat. soweit ich mitgekommen bin hast du ja die Wachzeit versucht zu verkürzen.

Aber 1,5 Std. weniger als 0.5.1? Ist aber trotzdem echt schwer einzuschätzen, ob da nicht noch andere Faktoren mitgespielt haben. Optimierung Wartezeiten der DS1820? evtl auch Verschleiß der AKKUS, da sie ja immer bis an die Maximalgrenze gefahren werden? Das Expansionsboard? usw.

Ich wollte es einfach nur mal wieder laufen lassen. Ja, wir hatten ursprünglich gehofft, dass die ahead-of-time Bytecode-Kompilierung hier Zeitersparnis bringt – v.a. um die Turnaround-Zeit zu optimieren.

Joa, eben. Ist ja nun aber auch nicht so weit auseinander. Vielleicht war es das letzte Mal der andere Akku oder der Watchdog braucht nun auch ein wenig mehr Strom oder irgendwas. Auf jeden Fall ist der durchlaufene Code nicht weniger geworden und die ahead-of-time Kompilierung hat erstmal leider auch nicht die gewünschten Verbesserungen gebracht, die sich ja auch positiv aufs Strombudget hätten auswirken können.

Ich habe vorgestern auch mal die Stromaufnahme nachgemessen…
Beim SETUP selber habe ich nicht Mikro sondern Milliampere … Die Last beim Senden kenne ich noch nicht, messe ich demnächst aber auch noch…

Ich habe von Diren gehört, dass über ein Intervall beim Senden von 10sec. nachgedacht wird, Während dieser 10sec. ist dann aber doch der µC mit DS18B20 Abfragen antriggen und aufnehmen beschäftigt… Dann kann ich doch nicht in den DeepSleep …. oder ist das die “Nachtabsenkung” ?

Kann man ggf. für die Intervallzyklen DAY und NIGHT ggf. auch Parameter auf der CONFIG Seite mit aufnehmen ? So muss man nicht wieder neu flashen …
Und bei der späteren Datenanalyse denke ich wird ohnehin auf Viertelstunden / Stunden oder gar Tagesscheiben verdichtet ?

Nein, solche häufigen Meßzyklen sind nicht unbedingt für den deep sleep Modus geeignet, den man ohnehin meist haben will, wenn Akkubetrieb angesagt ist.

In diesem Szenario muss die Appliance an eine ordentliche dauerhafte Stromversorgung und dann kann man auch auf den deep sleep Modus verzichten.

Korrigiert mich bitte, falls ich hier einen Denkfehler habe.

1 Like

Ja … hab ich mir schon gedacht…

wie verhält es sich denn mit der Konfig Frage iSv. Zyklusvariablen beim SETUP?
DAY = 10sec. oder 30 sec.
Night = 240sec.

z.B.

Unabhängig davon, dass die dort angegebene Zeit derzeit nur die Schlafdauer angibt (muss verbessert werden), wollen wir das Meßintervall gerne zukünftig dynamisch regeln und auch vom Ladezustand des Akkus abhängig machen.

Für eine sinnvolle Steuerung in Abhängigkeit von der Tageszeit muss die exakte Zeit vorhanden sein. Diesen Aspekt haben wir bisher beim Terkin-Datenlogger noch nicht berücksichtigt.

5 posts were merged into an existing topic: ESP32 RTC clock im Deep Sleep Modus

Folgende Beiträge habe ich gerade noch im Pycom Forum aufgeschnappt:

@robert-hh said:

@KenM My best experience with going to sleep is by setting pins, which drive external loads, to input mode before going to deep_sleep. Then it is guaranteed to be in high impedance state. Unless of course you need it to drive something, which of course then consumes power.

2 Likes

Das ist zwar nicht vollständig unser Metier, weil wir bei BOB keinen Pysense benutzen, es ist aber für alle die das interessant finden trotzdem eine sehr wichtige Information, deswegen reihe ich das mal hier an.

Dank

verbraucht der Eumel dann nur noch


Ich denke beim Pytrack wird es genauso funktionieren.

cc @tonke

Nun ist die Frage wie die das machen? Sind es irgendwelche Einstellungen am WiPy / GPy / FiPy oder übernimmt die Kontrolle in deep sleep das expansion board? Irgendwo stand doch bei Pysense was von PIC. Ich kenne das PySense-board aber nicht.

Mit dem WiPy3, der Arduino-IDE und dem Arduino-Core komme ich mit einem einfachen deep sleep Zweizeiler ohne jegliche Optimierung auf etwas unter 20 uA.

Wenn wir z.B. an den pin states noch schrauben könnten um da noch weiter runter zu kommen wäre das prima, falls das die Stellschraube sein sollte und es nicht das board ist.

Ich vermute es. pycoproc.py steuert den PIC an. Dort sind die entsprechenden Routinen untergebracht, um ihn per I2C anzusteuern – konkret bei pycom-libraries/pycoproc.py at 7e980233fa6316b05e35681c9793e0ad4faf3c7f · pycom/pycom-libraries · GitHub.

Vermutlich läuft das konzeptionell ganz ähnlich wie es @wtf, @weef und @roh bei Versuchsaufbau "Autonome Zelle": Solar-Feinstaub-Wetter-Vergleichsding mit dem RTC-Baustein gemacht haben.

siehe: RTC in combinattion with deepsleep unusable | Pycom user forum

There are two different ways to achieve deep sleep:

  • machine.deepsleep uses the internal ESP32 deep sleep mode. That one will keep the RTC alive.
  • Pysense-controlled deep sleep (using the setup_sleep / go_to_sleep from the Pysense library) just completely switches off the ESP32, including the RTC (it really cuts all power to the ESP32).

gibt dadurch dann wieder ein bekanntes problem Lopy + Pytrack: How to keep track of time in deep sleep | Pycom user forum den Lösungsversuch finde ich aber interessant. kann man vielleicht über einen weiteren interupt Timer erzeugen, der kurz vor dem WDT aktiv wird und die aktuelle zeit zwischenspeichert. als lösungsansatz für RTC time does not survive WDT | Pycom user forum

Für kurze Messintervalle ist bei der Terkin sicher noch der light sleep interessant. Ist im enteffekt ein Deep sleep nur, das der Speicher noch mit Strom versorgt wird. Pins müssen mit Hold wie beim Deep sleep gehalten werden. Radios gehen auch alle aus die RTC läuft weiter.
Bei Pin interupt bin ich dran sollten auch gehen ist bei Pycom nur schlecht dokumentiert sollte aber wie beim deep sleep funktionieren.
Wlan logt sich automatisch wieder ein.

from machine import sleep
sleep (ms)
1 Like

Hi Michael,

Lightsleep müsste drin sein. Vielen Dank!

Der Eintrag fehlt aber noch in der Blaupause für die Konfiguration, deswegen ahnt man es nicht.

Hier einfach 'lightsleep': True schreiben, damit sollte das klappen.

Ich komm zwar grad nicht drauf, aber irgendwas war noch damit (komisch) – es hatte einen Grund, warum ich nicht die Konfigurationsblaupause damit bestückt habe. Vielleicht täusche ich mich aber auch und alles klappt so wie es sollte.

Viele Grüße,
Andreas.

Gut zu. Wissen. Werde das nochmal überprüfen. Evtl. wurde ja bereits stillschweigend ein Bugfix gemacht.

Der riesige Vorteil von light sleep ist, das man den niedrigen Stromverbrauch nicht extrem teuer durch lange Bootphasen, in den sehr viel Strom verbraucht wird, erkaufen muß.

Bei Hiverize/Fipy/Kamerun kann man z.B. mit der gleichen Energie anstatt nur einmal 7 Mal messen. Und ich hab dabei nochnichtmal berücksichtigt, das dort beim booten ein vielfaches an Strom fließt, als im Normalbetrieb.

Aktuell tippe ich dort, mit den anderen teilweise radikalen Stromspar-Maßnahmen auf eine Akkulaufleistung von über 8 Tagen. Vorher waren es 7h.

1 Like

Leider konnte ich den Light Sleep im terkin Datalogger noch nicht testen. Allerdings gehen im Light Sleep wie im deep Sleep die Buttons nicht.
In deep kann man ja auch Interrupts auf gipo Pins legen die dann allerdings ebenfalls ein Reset auslösen. Mann muß nach den aufwachen dann den Grund des resets auf die spur gehen.

Im light Sleep wird ja kein Reset ausgelöst, man könnte also dann rein theoretisch gleich weiter machen.
Leider ist light Sleep bei Pycom praktisch gar nicht richtig dokumentiert.
Wär schön wenn jemandem was nützliches dazu einfällt oder über den Weg läuft.

Habe jetzt einen echt mekwürdeigen Fehler gefunden wo ich verzweifle.
habe machine.pin_sleep_wakeup verwendet um vorzeitig aus dem leichten Schlaf zu kommen, was auch vorzüglich funktioniert der AP oder Send wird auch artig nach dem Aufwachen gestartet. Nur hängt sich anscheinend die ausgabe vom sleep interrupt auf. Wenn ich jetzt mit dem Resetbutton resette. Fährt er normal hoch und macht seine erste Messung und geht dann in den schlaf und sofort nach dem aufwachen wird dann der AP oder Send button interupt aktiviert und er startet ihn wieder.
Als ob der status des Pins gepuffert und an den Interupt weitergeleitet wird.

Kurzeitiges Trennen vom Strom oder der Resetbutton bringt gar nichts einzig der WDT und ein machine.reset() schafft es den Interupt wieder zurückzusetzen. Nach jedem Aufwachen das gleiche spiel. Mit einem zuvor gespeicherten “state = disable_irq()”-state habe ich es leider auch schon erfolglos versucht. scheint als würde es irgendwo im ULP co-processor oder im RTC speicher hängen.
@Andreas viellecht hast Du ja eine Idee, wie man den zurücksetzen könnte.

Hier mal eine Messung des Stromverbrauchs mit der Hiveeyes-Terkin-Datalogger-Software und Datenübertragung via LTE. Am FiPy sind angeschlossen: Bosche H30 als Waage, 6 DS18B20, der “BOB”-BME280. Gemessen wurde mit einem CurrentRanger der per bluetooth die Messdaten auf einen Rechner übertrug.

grafik

Im Betrieb waren das um die 250 mA, was die Daten oben auch zeigen.

Im deep sleep ging der Verbrauch nur auf ca. 80 uA runter. Eigentlich zu hoch!

Das Messinterval war gerade auf 1 Minute, ggf. hat das LTE-Modem da keine Zeit sich aus dem Netz zu verabschieden und runterzufahren (?). Nun das Messintervall auf 20 Minuten gesetzt, tut sich aber nichts, immer noch die 75 uA Verbrauch. Habe den BME280 (das BOB-Modell, das auch 5 V verträgt) abgeklemmt, damit sind es dann ca. 20 uA weniger, aber immer noch 50 uA.

1 Like