23. Lektion: Onewire
Datei:OneWire Aufbau.png
Testaufbau mit Raspberry Pi Pico W und 3x DS18B20 Temperatursensoren.
Die Bezeichnung OneWire bezieht sich darauf, das ein Draht als Signal- und Versorgungsleitung dienen kann. Damit ein Strom fließen kann sind natürlich immer 2 Drähte erforderlich.
Beim Anschluß mit nur 2 Drähten spricht man von parasitärer Speisung, weil die Stromversorgung als Parasit die Signalleitung benutzt. Diese Betriebsart hat sich bei mir als nicht stabil gezeigt. Außerdem wichen die Temperaturwerte von denen bei 3-Draht-Speisung, also mit eigener Versorgungsspannungsleitung, ab.
Es können mehrere OneWire-Sensoren an einem Bus betrieben werden.
Das Titelbild zeigt einen Versuchsaubau mit 3 DS18B20 Temperatursensoren mit diskreter Speisung.
Initialisierung[Bearbeiten | Quelltext bearbeiten]
Um einen OneWire-Sensor zu benutzen muss zuerst ein OneWire-Bus erzeugt werden:
import onewire ow = onewire.OneWire(Pin(28))
Dann kann der Sensor initialisiert werden. Hier ist der Busname zu übergeben:
import ds18x20 ds = ds18x20.DS18X20(ow)
Für gleiche Sensoren ist dieses nur einmal erforderlich.
Anschließend wird der Bus gescannt und gefundenen Adressen in einer Liste (roms) gespeichert.
roms = ds.scan()
Hier die Adressliste (roms) vom Aufbau aus dem Titelbild.
print(roms) [bytearray(b'(y\x19 \x00\x00\x00\xef'), bytearray(b'(\x19U \x00\x00\x00\xe4'), bytearray(b'(n\xdc\x1e\x00\x00\x00\x9c')]
Schließlich können die Werte der Sensoren gelesen werden.
one_wire_warten = 750 ds.convert_temp() time.sleep_ms(one_wire_warten)
Danach ist eine Wartezeit von mindestens 750 ms erforderlich!
Die ausgelesenen Werte liegen in einem Dictionary, mit der Geräteadresse als Key vor. Dieses kann jetzt ausgelesen werden.
daten = [1, 2, 3] for x, rom in enumerate(roms): daten[x] = ds.read_temp(rom)
Die Initialisierung von daten mit 3 Werten ist erforderlich damit 3 Werte in der Liste vorhanden sind, die dann mit den Messwerten überschrieben werden.
Das komplette Programm[Bearbeiten | Quelltext bearbeiten]
from machine import Pin import onewire import time import ds18x20 warten = 250 # Wartezeit für nächste Abrage in ms one_wire_warten = 750 # 750ms Wartezeit braucht der OneWire-Mechanismus daten = [1, 2, 3] # Liste mit 3 Einträgen für 3 Messstellen ow = onewire.OneWire(Pin(28)) ds = ds18x20.DS18X20(ow) roms = ds.scan() while True: ds.convert_temp() time.sleep_ms(one_wire_warten) # OneWire braucht eine Pause for x, rom in enumerate(roms): daten[x] = ds.read_temp(rom) # Hier werden die Temperaturen ausgelesen. # Hier folgt Code zur Auswertung der Messwerte # Z.B. for i, wert in enumerate(daten): print(f'Sensor{i}, {wert}°C')