23. Lektion: Onewire

Aus Attraktor Wiki

Wechseln zu: Navigation, Suche

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

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

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')



Diese Seite wurde zuletzt am 8. Januar 2024 um 14:00 Uhr geändert. Diese Seite wurde bisher 255 mal abgerufen.