Untersuchung und Verbesserung des Timings bei der Ansteuerung der DS18B20 Sensoren unter MicroPython

DS18B20 recap re. timing and beyond

Wir haben hier nochmal eine Bestandsaufnahme gemacht, um welche Aspekte wir uns kümmern wollen. Das Timing in den Griff kriegen führt die Liste eindeutig an.

Drüben bei Timing things on MicroPython for ESP32 findet man weitere Details zu den Hintergründen der Timing-Probleme aus nächster Nähe.

Backlog

CRC-Checks überprüfen

Q: Srsly?
A: Ja, die Funktion def crc8 wird nämlich nirgends innerhalb der Bibliothek gerufen.


Meiomei.
image

I will check that again, but haven’t come across it yet.

Apart from following the guidelines you outlined at Timing things on MicroPython for ESP32, I really would love to have a mature system-level DS18B20 library available for Pycom MicroPython, effectively written in C or C++ and made available through safe API calls from the MicroPython runtime.

Research

onewire.py at Pycom

It looks like tuning onewire.py already has a dedicated thread on the Pycom Forum.

Pure-Python Drivers

The first version of the library by Damien George.

The vanilla MicroPython drivers.

The vanilla Pycom drivers.

The OneWire library ported to MicroPython by Jason Hildebrand looks promising. It does

Another guy of Jason Hildebrand fame.

The RMT RAM variant by Yann Vernier also looks very interesting, see GitHub - lonetech/LoPy: LoPy code (MicroPython on ESP32 module). This probably works around the indeterministic timing induced by the serial RAM.

# RMT RAM is divided into 8 blocks of 64 words, each holding 2 entries. 
ram = uctypes.struct(RMT_BASE+0x800, (uctypes.ARRAY | 0x0, uctypes.UINT32 | 64*8))

Drivers written in C

Looking under the hood of the vanilla MicroPython core also brings up some things.

Miscellaneous

Some arbitrary resources about reading the DS18B20 from MicroPython.

Zu diesem Thema lief uns gerade noch die esponewire.c für ESP32 aus dem ESP32-Port des aktuellen Genuine MicroPython über den Weg, die dort timing-kritische Dinge maschinennah implementiert – gerade das Lesen und Schreiben von Bits auf den Bus und die Einhaltung des Protokolls und der Contenance.

Dass diese Angelegenheit beim Pycom MicroPython in pure-Python per onewire.py implementiert ist, mag man zwar fast nicht glauben :woman_facepalming:, zeigt aber umso deutlicher, dass diese Geräte vom Hersteller nicht unbedingt dafür ausgelegt wurden, Meßdatenlogger zu sein, sondern eher, um ihren Dienst als universelle Telemetriemodembausteine zu tun.

Auch hier wäre es nett, wenn wir bei Gelegenheit auch auf die maschinennahe Programmierung der Pycom-Geräte zugehen würden. Vielleicht ist es machbar, fehlende Funktionalitäten ggf. selbst nachzurüsten.

Meow.

1 Like

momentan patchen wir das mpy von pycom noch garnicht, korrekt?
ich befuerchte wenn wir da anfassen wollen kommen wir nicht dran vorbei.

wenn ich micropython/onewire.py at v1.11 · micropython/micropython · GitHub mit o.g. python code vergleiche, denke ich das es moeglich sein sollte den pycom kram auf den c write/reset/readbit/byte umzustellen.

das generische onewire ist auch da python, nur der lowlevel kram ist c

leider schmeisst pycom den ds18x20 support mit in das gleiche file.
bei mpy liegt das daneben als eigenes file das auf den onewire funktionen aufbaut

Genau. Irgendwann werden wir das machen und können uns dann vielleicht bessere Sachen zusammenklauben.

Ja, gerade dieses Beispiel spricht schon Bände darüber, dass das bestimmt nur eine notdürftige Lösung war, weil der echte ESP32-Port in dieser Zeit vermutlich noch gar nicht ordentlich fertig war.

1 Like

Hier noch ein paar Fundstücke, die teils die bereits hier erforschten Dinge widerspiegeln, aber auch in einem weiteren patch von @robert-hh auch noch CRC-checks mitbringen – die gibt’s in der aktuellen Variante noch nicht.

1 Like

Nach onewire.py: Use library optimized for timing and with enabled CRC checks · hiveeyes/hiveeyes-micropython-firmware@226d40e · GitHub bringt Euch ein beherztes

git pull
make setup

make install
# oder
make recycle(-ng)

der Bibliothek ein Stück näher.

Bei mir konnte ich feststellen, dass manchmal von einem der beiden Sensoren kein Ergebnis zurückkam. Zusammen mit den nun eingeführten CRC-Checks würde ich das als »considered to be a good thing™« betrachten – weil es u.U. genau jenen Fall widerspiegelt, wo bisher Glitches bei der Messung übernommen/durchgereicht/nicht weggefiltert wurden, obwohl sie inkorrekt gelesen wurden.

Wir freuen uns über Eure Erfahrungsberichte – vorzugsweise mit längeren Testzeiträumen.

1 Like

Gut werde meinen Teststand nochmal neu starten. Hab Ihn gerade mit der Firmware von gestern Nacht am laufen. Im Gegensatz zur Org. 0.5.1 ein deutlicher Rückschritt habe ca alle 10- 20 Messungen einen Glitch.

https://swarm.hiveeyes.org/grafana/d/rgD4TVIZz/mko-teststand?orgId=2&from=1564691157367&to=1564697602770&var-STATION=AACHEN-ORSBACH&panelId=16&fullscreen

Vielen Dank für Deine Beobachtungen.

Welcher Art ist dieser denn?

Habe auf jeden Fall sicherheitshalber Revert "Adjust waiting time after resetting 1-Wire bus" · hiveeyes/hiveeyes-micropython-firmware@11e8eaf · GitHub nachgeschoben, der eine kürzliche Änderung wieder rückgängig macht, die u.U. dazu beigetragen hat. Da müssen wohl die Pferde mit mir durchgegangen sein. Kriegst Du die Änderung noch mit unter?

Auf nahezu allen DS 1820 Sensoren geht wie bei 0.5.1 von ein paar Grad Abweichung bis zu 534°C alles vertreten. Ausbleiben einiger Werte von DS1820 Sensoren konnte ich auch schon sehen.

Ok, schade! Um sicherzugehen: Löschst Du vielleicht gerne kurz Deinen dist-packages Ordner komplett und holst Dir die Inhalte erneut per make setup? Better safe than sorry…

Einleitung

Hast Du Deine Daten auch bereits im Grafana?

Labor / FiPy Workbench 01

An jenem Gerät bei Labor / FiPy Workbench 01 sind zwar Sensoren angeschlossen, allerdings wird dort bisher nur selten bis kaum konkret auf die Werte geschaut.

Bei den Aufzeichnungen gibt es viele Lücken, weil es recht häufig recycled wird. Daher sind die Aussetzer (bei allen Sensoren) der Betriebsweise geschuldet.

Frage an die Grafana-Spezis: Würde man solche Ausreißer durch Glitches gegen 451°F oder darüber hinaus nicht auch hier bei min/max in der Legendentabelle von Grafana zu Gesicht bekommen, um eindeutig mit dem Finger drauf zeigen zu können?

image

image
Das einzige “Misreading” sehe ich oben bei system-temperature. Das war aus der Zeit, in der wir mit dem Voltage Divider und der Ansteuerung des ADC beschäftigt waren.

Rohdaten

Disclaimer

Bei diesem Gerät sind aber halt auch nur 2x DS18B20 am Bus und ich habe vermutlich auch Anfängerglück mit den Sensoren.

ja hab ich eben schon gemacht. Ja Daten sind in Grafana: Baue ich aber gerade noch um

https://swarm.hiveeyes.org/grafana/d/rgD4TVIZz/mko-teststand?orgId=2&from=1564691157367&to=1564697602770&var-STATION=AACHEN-ORSBACH&panelId=16&fullscreen

1 Like

image
… scheinbar eine dieser Heat-Waves erwischt [1].


  1. See also LoRa distance records. ↩︎

Neue Version mit CRC-Checks allerdings noch ohne die letzten beiden commit bezüglich der Rückstellung der Timings der Ds1820.
2 Fehler allerdings einer auf 0 hatte ich bisher noch nie das einer nach unten ausgeschlagen hat

Danke. Hier die Rohdaten auf die betroffenen Sensoren sowie den passenden Zeitraum eingeschränkt: Labor / MKO-Teststand 2019-08-02T01:30:00 bis 2019-08-02T02:30:00 für DS18B20 286cd7799704031f sowie 282ad9799704037a.

2019-08-02%2009_57_03-Rechner

hier noch der dazugehörige Log.


Ich habe jetzt nochmal ein Git Pull gemacht und vorher den den Fipy und und den dist-packages Ordner gelöscht.
3:18 Uhr mal schauen was Jetzt raus kommt

Edit: Schaut jetzt wieder viel ruhiger aus. Aktuell noch kein Fehler seit dem.

https://swarm.hiveeyes.org/api/hiveeyes/testdrive/mko-micropython-firmware/fipy/data.txt?include=temperature.282fbf799704031c.onewire:0,temperature.28165879970403ec.onewire:0,temperature.282ad9799704037a.onewire:0,temperature.286cd7799704031f.onewire:0,temperature.2884cd7997040356.onewire:0,temperature.2868537997040317.onewire:0&from=2019-08-02T03:18:00%2B02:00&to=2019-08-02T11:30:00%2B02:00

Allerdings gab es in den 432 Messungen 128 mal keine Daten von einzelnen oder mehrerern Sensoren. Was aber vergleichbar mit dem Org. 0.5.1 ist.

Was schließen Ich daraus? das Timing um die Wartezeiten sind extrem wichtig. Und wir sollten dort nur langsam dran drehen. gibt also auch ein zu lange warten.

Wie erzeugst Du das letze Bild? Mit der BOB-App sieht das anders aus, da wird auch gemittelt.

Exzellent, vielen Dank für Deine bisherige Messreihe!

Exakt.

Die Optik des Revert "Adjust waiting time after resetting 1-Wire bus" · hiveeyes/hiveeyes-micropython-firmware@11e8eaf · GitHub kann trügen. Ich hatte dort unüberlegt eine Änderung gemacht, die kürzer (750ms) gewartet hatte als bisher (1s) - mea culpa => langsam dran drehen ;].

Diese Änderung wurde nun wieder zurückgenommen, so dass zwischen Bus-Reset und Bus-Scan wieder eine ganze Sekunde Zeit eingeräumt wird.

1 Like