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

Die DS18B20 sollten unkritisch sein, brauchen quasi nix, den BME280 sollten wir noch checken. Gibt es für den bzw den ganzen I2C-Ast auch die Möglichkeit das auszuschalten?

Expansion Board (falls verwendet) muss ich mir gesondert anschauen, da ist die SD und ich glaube auch eine Dauer-an-LED, gibt ggf Jumper auf den board, um was abzuschalten.

Wir haben ja nun den deep sleep mode implementiert und im Thread Batterieüberwachung, voltage divider und attenuation für Microypthon firmware die Grundlagen geschaffen um den Batteriezustand unserer nodes zu überwachen. Dort hat Andras auch schon erste Messungen über die Zeit gepostet:

Eine Laufzeit von 8h – mit deep sleep! – allerdings alle 60 Sekunden Messung ist nicht sooo berauschen, schauen wir, wie wir das besser machen können!

Hier ein paar Zahlen, gemessen mit der aktuellen Firmware:

Der WiPy braucht im deep sleep 10,6 mA

… der FiPy im deep sleep 74,5 mA

Das spricht erst mal dafür, dass wir die radios oder was anderes FiPy-spezielles noch nicht ordentlich abgeschaltet haben. Aber auch die 10 mA des WiPys sind jenseits von Gut und Böse:

Mir fiel vorhin noch ein: “Serielle Schnitte abschalten – ist das möglich?”.

Einige Boards haben ja eine USB-Schnittstelle, die braucht Strom, ist bei uns aber auf das Expansion Board ausgelagert, d.h. dort könnte man sie abschalten, müssten wir aber nicht, wenn wir nur die Platine verwenden. Braucht die Serielle Strom, wenn man nix schickt? Und im Deep Sleep ist die doch sowieso aus, oder?

Ok, further research! Habe den WiPi am Multimeter, der im deep sleep 10 mA verbraucht und nacheinander die einzelnen Sensoren abgeklemmt.

kritischer Stromverbrauch einzelner Sensoren im deep sleep

Keine DS18B20 reduzieren den Verbauch nicht sonderlich, auch der BME280 ist erst mal unkritisch. Der faule Apfel oder gärige Honig ist die Wägezelle / der HX711. Wenn man E+ abklemmt geht der Verbauch von 10 mA auf ca. 3,5 mA zurück.

Ab Zeile 101 gibt es in der /hiveeyes/sensor_hx711.py eine power_off mit

und auch das logging sagt

32.4655 [hiveeyes.sensor_hx711    ] INFO   : Turning off HX711

scheint aber irgendwie nicht zu greifen!

Unsere Standard-Arduino-Bibliothek kann den HX711 bzw. über den HX711 den Verbraucher Wägezelle gut abschalten, an der Hardware sollte es also nicht scheitern. Müsste 'ne Software-Geschichte sein.

1 Like

Hi Clemens,

Schade. Also Haube auf…

Die C++-Implementierung sieht folgendermaßen aus:

Die MicroPython-Implementierung sieht ganz gleich aus:

Für Vorschläge und Nachforschungen wäre ich sehr dankbar. Gerade habe ich noch Turn off interrupts when powering down the HX711 · hiveeyes/hiveeyes-micropython-firmware@1d88b63 · GitHub hinzugefügt, aber dann bin ich mit meinem Latein am Ende. Wäre vorstellbar, dass der ESP32 auch hier zu schnell unterwegs ist und man daher zwischen dem Zuppeln am SCK kurz mal warten sollte?

Merci,
Andreas.

P.S.: Falls das “zwischendrin warten” irgendwie Sinn machen sollte – so ginge es:

import time
time.sleep_ms(50)

Hi there,

Just learned from [SOLVED/WORKEDAROUND] Having problems with HX711 load cell sensor - MicroPython Forum that

Which is also confirmed through the datasheet and Electrical Engineering Stack Exchange:

A GPIO-based implementation for the RaspberryPi is also doing it likewise:

That research was easy.

Cheers,
Andreas.

2 Likes

Bin zu dem gleichen Ergebnis wie @Clemens gekommen, was ich mich jetzt noch frage ist, was macht der Pycom im Deep Sleep modus draus. Habe mich noch nicht viel damit beschäftigt, aber fällt der SCK dann nicht wieder auf False und der HX711 fährt dann wieder hoch?

Exakt jenes frage ich mich auch. Ich hoffe wir wissen grob was wir tun und es klappt aufgrund von PULL-UP/PULL-DOWN Charakteristika ebenfalls genau so wie anderswo auch. Wenn jemand unsere Zweifel fundiert vom Tisch wischen kann: Her damit!

Das schnellste was mir jetzt auf die schnelle einfallen würde, wär ein externer Pullup.

Den könnte man auch zum testen mal auf die schnelle unten auf die Platine klöppeln.

Per Sleep for 80 microseconds after pulling HX711 clock pin to high · hiveeyes/hiveeyes-micropython-firmware@fedbe6f · GitHub jetzt mal so implementiert wie auch anderswo gesehen – mit der Bitte um Review und Tests.

Andere sagen das auch:

Set the PD_SCK pin to the output mode before readings, and to the HIGH-Z/INPUT mode before esp8266/hx711 powerdown, use pullup resistor.

esp8266 - HX711 Power Down Handling - Electrical Engineering Stack Exchange


Und/oder:


Haben wir das schon vorgesehen und hier berücksichtigt? Steht bestimmt schon irgendwo im Forum… ;].

Die Dokumentation sagt zu den möglichen Pin-Modi:

Quelle: Pin · GitBook

Kann uns hier vielleicht irgendein eingebautes Peripheriemerkmal weiterhelfen oder gibt es bereits entsprechende Beschaltungen auf Euren Boards, @clemens und @didilamken?

Nein und Nein.
Die internen Pullup und Pulldown sind ebenso Im Deep Sleep abgeschaltet und auch die bisherigen Schaltungen weisen keine Pullup auf.

habe gerade mal getestet ein FiPy auf Clemens Weißem Board ist bei mir mit heftigen 77mA im Deep Sleep.
Ohne aufgestecktem HX711 bei 67mA.
Mit externem 10K pullup.bei 67,5mA

Habe ihn auf die schnelle einfach direkt oben auf dem HX711 zwischen VCC und SCK gehängt.

@clemens?

1 Like

Externer pullup im Spiel?

Damit meinst Du vermutlich den externen pullup?

Ich bin mir nun unsicher, ob und wie ich das bei der Programmierung berücksichtigen sollte. Aktueller Stand:

Data pin (DOUT) als pullup konfigurieren?

Im Beitrag bei [SOLVED/WORKEDAROUND] Having problems with HX711 load cell sensor - MicroPython Forum wird darüber gesprochen, den dataPin - also der auch als pOUT bzw. dout bezeichnete - als PULL_UP zu konfigurieren à la

self.dataPin = Pin(dout, Pin.IN, Pin.PULL_UP)

Hier geht es aber um etwas anderes. Beim Schreibenden hat das Auslesen vorher überhaupt nicht funktioniert. Ich für meinen Teil wundere mich nur über die Anomalie bei der Konfiguration des entsprechenden Pins - dort als PULL_UP, bei uns als PULL_DOWN.

Fazit

Also: Muss ich für die korrekte Ansteuerung des Pullups zur besseren Abschaltung des HX711 im deep sleep nun irgendetwas softwareseitig berücksichtigen und falls ja, könntet Ihr mir das grob beschreiben?

Nein, wen ein externer Pulup dran ist brauchst Du ihn Intern( Softwareseitig) nicht auch noch dazu schalten oder berücksichtigen.

Ich habe den Pullup jetzt auch nochmal drastisch auf 1 MOhm erhöht, da bei mir der HX711 nicht immer sauber aufgewacht ist. Er war für die Taktrate wahrscheinlich zu niedrig.
1M weil ich den hier eh gerade auf dem Schreibtisch hatte.

Die maximal mögliche Impulslänge der PD_SCK -Pulse beim HX711 ist 50 µs. Wenn dieses pad länger als -mit Zugabe- 80 µs HIGH ist, geht der HX711 schlafen und schaltet die Erregerspannung der Wägezelle aus - dem Verbraucher, den wir hier jagen.

Dies muß in der Software manifestiert werden (this is the “how could this ever have worked” -part), - unabhängig davon, daß die hier gerade besprochenen Maßnahmen für den deep sleep -Fall des Prozessors sein sollen, und da wird auch ein gewöhnlicher GPIO anders bedient als sonst.

Heißt also: Dein Streben, die Treiber auch für nur 80 µs mal endlich interruptfest™ zu bekommen, wäre auch hier schön und ist zu begrüßen! ;)
Aber für externe pull-ups solltest Du nichts anfassen müssen.

Wir sollten noch einmal auf die Funkinterfaces schauen – die brauchen im Verhältnis definitiv am meisten Strom. Danke, @weef.

LTE-Modem ordentlich deaktiviert?

Im Pycom-Forum fanden wir ja irgendein Gefasel, dass man das LTE-Modem nur ordentlich deaktivieren kann, wenn 'ne SIM drin ist. WTF!

Hier: Strom sparen beim Einsatz der Microypthon firmware im Batteriebetrieb

Remove RTS/CTS jumpers on Expansion Board

Unter Umständen sollten wir aber einfach nur jenen Rat befolgen, den ich bisher überlesen hatte:

State of the onion

Aktueller Stand beim LTE-Modem pragmatisch:

… wenn es denn so funktioniert?

Other thoughts?

Ich nehme hier gerne Vorschläge entgegen, in welche Richtungen wir noch schauen könnten.