Mein GPS-Tracker läuft, aber es gibt hier noch Optimierungsbedarf. Der Stromverbrauch ist zu hoch und der 900mAh Akku hält nur knapp einen Tag, bei einem Sendeintervall von dreißig Sekunden. Das ist mir zu wenig. Adafruit selbst bietet bereits Informationen um den Stromverbrauch des Feathers zu senken. Mit Hilfe der eigenen SpleepyDog Library, kann man den Prozessor schlafen legen. So sollen aus 11mA Stromverbrauch, nur noch 0,3 mA für den Prozessor werden. Die 11mA habe ich bereits in einem früheren Test bestätigen können. Der GPS Chip verbraucht 20 bis 25 mA. Also könnt ich, mit dem Powermanagement, theoretisch auf eine Laufzeit von fast zwei Tagen kommen.
Ich werde nun zwei Tests machen. Der erste Test wird mit angepasster Software durchgeführt, in welcher der Prozessor für 25 Sekunden in den Ruhezustand versetzt wird. In der zweiten Variante, werde ich den Prozessor nicht abschalten. In beiden Varianten werde ich die Batteriespannung messen. Der Ultimate GPS Feather Wing wird aufgesteckt sein und wird einen GPS Fix haben. Somit habe ich reale Bedingungen und kann testen ob die Anpassung was bringt oder nicht.
Implementation des Powermanagement
Ihr müsst erst die Bibliothek einbinden über Sketch >> Bibliothek einbinden >> Bibliothek verwalten. Dort sucht ihr nach sleepy und installiert die Adafruit SleepyDog Library.
Mittels #include <Adafruit_SleepyDog.h> bindet ihr die Bibliothek ein und könnt danach mit Watchdog.sleep(1000); den Prozessor für eine Sekunde, in den Ruhezustand versetzen. Natürlich kann die Zeit auch größer sein, dazu müsst ihr nur den Wert anpassen, jedoch nicht mehr als 8000ms. Es ist aber kein Prob em den Befehl mehrmals hintereinander zu schreiben. Die zwei Sketches, einmal mit und einmal ohne Powermanagement, findet ihr auf GitHub.
Ich versetze den Prozessor nach dem EV_TXCOMPLETE Event für 20 (2*8+4) Sekunden in den Ruhezustand. In Verbindung mit einem TX_INTERVAL von 5 Sekunden, komme ich real auf ein Sendeintervall von 30 Sekunden. Fragt mich nicht warum, dafür ist mein Arduino Wissensstand einfach zu gering. Irgendwo im Programmablauf werden sich die restlichen fünf Sekunden verstecken. Also ist Testen angesagt.
Der Test
Die Payload verarbeite ich mit Node-RED und speichere sie in InfluxDB. Anschließend bereite ich die Daten grafisch in Grafana auf. Ihr seht hier gerade den gestarteten Test mit aktivem Powermanagement. Anstelle der GPS-Daten, lese ich die Akkuspannung aus. Das GPS-Modul wirt aber weiterhin mit Strom versorgt, so bekomme ich reale Verbrauchswerte und sehe wie sich die Spannung verhält.
Der Akku hat im ersten Versuch knapp 32 Stunden gehalten. Das ist jedenfalls schon eine große Verbesserung und ich habe noch etwas Möglichkeit zu optimieren.
Anschließend war der zweite Test, ohne Powermanagement, dran. Hier hielt der Akku ebenfalls 32 Stunden. Ich war verwirrt und enttäuscht zugleich, da meine Änderungen anscheinend gar keine Wirkung gezeigt haben.
Ich entschloß einen weiteren Test zu machen. Und zwar veränderte ich das Sendeintervall auf 60 Sekunden. Ich nutze hierbei 7*8+4 Watchdog.sleep und ein TX_INTERVAL von 1. Bei dem Upload des Sketches bemerkte ich, dass der USB-Port nicht erkannt wurde, also war anscheinend noch das alte Programm mit Powermanagement aktiv. Ich würde den Test, ohne Powermanagement, somit wiederholen müssen.
Nach diesem Test bin ich immerhin auf eine Laufzeit von 35 Stunden gekommen. Viel mehr geht wohl nicht, außer mit einem größeren Akku.
Den Test ohne Powermanagement habe ich auch anschließend nochmals durchgeführt und kam auf eine Laufzeit von knapp 26 Stunden. Es lässt sich also, in diesem Anwendungsfall, 23 bis 35% mehr Laufleistung erzielen. Je weniger die angeschlossenen Verbraucher aus dem Akku ziehen desto größer wird der Gewinn sein. Ich hatte durch den GPS Empfängern immerhin konstant 20 bis 25 mA an Verbrauch.
TX Intervall | Powermanagement | Laufzeit |
30s | Nein | 26h |
30s | Ja | 32h |
60s | Ja | 36h |
USB geht nicht mehr
Doch, keine Angst, der Port geht noch, er wird aber, durch das Powermanagement, abgeschaltet. Ihr könnt euren Chip neu betanken, indem ihr ihn resettet. Ich müsste etwas probieren, habe aber mittlerweile den Dreh raus. Ich startet in der Arduino IDE den Upload und wartet zwei bis drei Sekunden, dann drücke ich den Reset-Knopf am Feather. Anschließend blinkt die Status-LED regelmäßig und anschließend sollte sie, durch den Upload, flackern.