Es gibt ein paar MicroPython-Treiber für den HX711. @RalfL hat bei GitHub - walterheisenberg/hivewatch_esp32 bereits den kanonischen Treiber von David Gerber und Robert Hammelrath ausgewählt. Dem schließen wir uns an.
Mit dem ursprünglich von David Gerber und Robert Hammelrath stammenden MicroPython-Treiber [1] und den Erweiterungen von Ralf Lindlein [2] haben wir nun gute Erfahrungen gemacht, nachdem wir in manchen Bereichen noch ein wenig nachgelegt haben [3] und den Auslesevorgang nur vornehmen, während der Garbage-Collector vorher abgeschaltet wurde [4].
Um meine Frage zu beantworten: ja, kann man. Setzt man den Gain auf 128 oder 64 wird Kanal A gelesen, bei Gain 32 Kanal B. Im Terkin ist das aber (noch) nicht drin (das Setzen des Gain aber schon).
Ich hab gerade auch ein wenig mit dem Clock Signal und wie das produziert wird rumgespielt. Nicht viel dabei herausgekommen, außer das man das disable_irq() weglassen kann. Das Signal ist immer (zumindest bei meinen Messungen) 15,6us lang - ob mit oder ohne IRQ. Also falls das Abschalten des IRQs zu irgendwelchen Problem führen sollte, könnte man es hier weg lassen.
Ich hab die Unterstützung für Kanal B im Terkin drin. Das funktioniert auch schon ‘in echt’. Ich hab mir nur noch nicht angeschaut, wie die Daten in Grafana ankommen.
Zu sehen hier:
Hintergrund ist, das ich zwei Waagen jwd installieren will. Ich benutze den Beelogger Waagentyp mit zwei Zellen pro Waage und will nur 1 MCU verwenden. 4 HX711 wären mir dann einfach zu viel und die Genauigkeit wird nicht ins unbenutzbare sinken.
P.S.: wenn wir eine Sammelbestellung von >50€ bei Digikey zusammen bekommen, dann häng ich mich auch in den NAU7802 rein. Die Schnittstelle zum HX711 geht mir nämlich ziemlich auf den Keks.
Wenn man die Lese-Routinen der HX711-Bibliothek für Arduino bei [1] mit der MicroPython-Implementierung bei [2] vergleicht, fällt auf, dass bei ersterer erst gelesen wird und dann erst channel und gain für die nächste Lesung gesetzt werden, während bei zweiterer scheinbar beides auf einmal passiert.
Kleine Präzisierung: die Einstellung des Gains bestimmt den Kanal. Bischen seltsam aber ist halt so. Gain 128 & 64 = Kanal A. Gain 32 = Kanal B.
Was tatsächlich etwas seltsam an der uPy Implementierung ist, das der Gain mit einem read() gesetzt wird (und damit mit jedem read() auch der Gain nochmal). Nicht optimal, funktioniert aber.
In der Beschreibung des C++ Treibers steht auch nochmal explizit drin, wie wichtig es ist, das Schreiben des Clock Signals vor Interrupts zu schützen. Ich ziehe daher meine Bemerkung zurück, das disableirq() unnütz ist (nehme ich auch noch aus dem PR raus).