ewaldshof / ewhome

GNU General Public License v3.0
0 stars 0 forks source link

DS18b20 ist unzuverlässig #2

Open sulimma opened 4 years ago

sulimma commented 4 years ago

Je mehr Temperatursensoren wir an einen Pin annschließen um so unzuverlässiger werden sie. es wird dann nur noch ein Teil der Sensoren oder auch gar keiner gefunden.

Vielleicht ist es elektrisch wirklich in Problem, 7 DS18B20 an einen Pin zu schließen. Kolja hat aber den Verdacht, dass mit dem Code des 1-Wire-Treiber noch etwas nicht stimmt. Hier könnten wir mal debuggen. Im Extremfall könnten wir ihn mit SPI neu schreiben. Da kann nämlich mit dem Timing nichts schief gehen.

sulimma commented 4 years ago

Bei unseren Tests heute liefen 7 Sensoren an beiden Boards im Wohnzimmer problemlos. Analyse mit dem Oszilloskop hat gezeigt, dass die Signalqualität gut ist. Es würde dem Signal aber gut tun, kleineren Pullup auf den Platinen zu haben. Derzeit sind es 4,7k, ich würde das durch 1,5k ersetzen.

Außerdem sieht man, dass Softwareseitig die Zeiten sehr knapp eingestellt sind. Beim Senden einer 0 sollte das Signal etwas länger 0 sein und danach etwas länger 1 (10us zusätzlich jeweils). Beim Senden einer 1 ist alles OK. Um feste Bitzeiten zu erreichen würde ich es aber 20us länger 1 setzen.

sulimma commented 3 years ago

Evtl. könnte eine Erweiterungsplatine mit so etwas das Problem lösen: https://www.maximintegrated.com/en/products/interface/controllers-expanders/DS2482-800.html

sulimma commented 3 years ago

Tom and I measured two sensores with an oscilloscope. The sensor where the signal is looking better is the one getting problematic temperature results. (The 0.5K bit is toggeling randomly). We are pretty sure that an unreliable 1-wire implementation is the cause.

I tried SPI und UART but apparently they can't be configured to use the same pin for input and output.

sulimma commented 3 years ago

Der ESP32 hat einiges an Hardware was bei dem Thema helfen könnte. z.B. RMT und MCPWM. Die sind in Micropython aber nicht sichtbar. Die Leute die den 1-Wire-Treiber für Micropython schreiben haben das Thema aber auf dem Schirm: https://esp32.com/viewtopic.php?t=3655

sulimma commented 3 years ago

Es gibt offensichtlich unterschiedliche DS18B20 Temperatursensoren auf dem Markt. Einige lassen den Pullup das Signal hochziehen, was ca. 300ns dauert, selbst bei kurzem Kabel. Andere scheinen den Bus kurz aktiv hochzuziehen, bevor sie hochomig werden, ähnlich wie es PCI mit den bidirektionalen Pins macht.

sulimma commented 3 years ago

Das hier könnte die Lösung sein: https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo

Es enthält 1-Wire auf RMT-Basis. Das sollte vom Timing her perfekt sein.