|
|
(3 dazwischenliegende Versionen des gleichen Benutzers werden nicht angezeigt) |
Zeile 1: |
Zeile 1: |
− | [[file:OneWire_Aufbau.png]] | + | [[file:OneWire_Aufbau.png]]<br> |
| Testaufbau mit Raspberry Pi Pico W und 3x DS18B20 Temperatursensoren. | | Testaufbau mit Raspberry Pi Pico W und 3x DS18B20 Temperatursensoren. |
| <br> | | <br> |
Zeile 5: |
Zeile 5: |
| 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. | | 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. |
| <br> | | <br> |
− | 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ßerden wichen die Temperaturwerte von denen bei 3-Draht-Speisung, also mit eigener Versorgungsspannungsleitung, ab. | + | 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. |
| + | <br> |
| Es können mehrere OneWire-Sensoren an einem Bus betrieben werden. | | Es können mehrere OneWire-Sensoren an einem Bus betrieben werden. |
| Das Titelbild zeigt einen Versuchsaubau mit 3 DS18B20 Temperatursensoren mit diskreter Speisung. | | Das Titelbild zeigt einen Versuchsaubau mit 3 DS18B20 Temperatursensoren mit diskreter Speisung. |
| <br> | | <br> |
| + | == Initialisierung== |
| + | Um einen OneWire-Sensor zu benutzen muss zuerst ein OneWire-Bus erzeugt werden: |
| + | <pre> |
| + | import onewire |
| | | |
| + | ow = onewire.OneWire(Pin(28)) |
| + | </pre> |
| + | Dann kann der Sensor initialisiert werden. Hier ist der Busname zu übergeben: |
| + | <pre> |
| + | import ds18x20 |
| | | |
− | <br><br><br><br><br> | + | ds = ds18x20.DS18X20(ow) |
| + | </pre> |
| + | Für gleiche Sensoren ist dieses nur einmal erforderlich. |
| + | <br> |
| + | Anschließend wird der Bus gescannt und gefundenen Adressen in einer Liste (roms) gespeichert. |
| + | <pre> |
| + | roms = ds.scan() |
| + | </pre> |
| + | Hier die Adressliste (roms) vom Aufbau aus dem Titelbild. |
| + | <pre> |
| + | 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')] |
| + | </pre> |
| + | Schließlich können die Werte der Sensoren gelesen werden. |
| + | <pre> |
| + | one_wire_warten = 750 |
| | | |
| + | ds.convert_temp() |
| + | time.sleep_ms(one_wire_warten) |
| + | </pre> |
| + | Danach ist eine Wartezeit von mindestens 750 ms erforderlich! |
| + | <br> |
| + | Die ausgelesenen Werte liegen in einem Dictionary, mit der Geräteadresse als Key vor. Dieses kann jetzt ausgelesen werden. |
| + | <pre> |
| + | daten = [1, 2, 3] |
| + | |
| + | for x, rom in enumerate(roms): |
| + | daten[x] = ds.read_temp(rom) |
| + | </pre> |
| + | Die Initialisierung von '''daten''' mit 3 Werten ist erforderlich damit 3 Werte in der Liste vorhanden sind, die dann mit den Messwerten überschrieben werden. |
| + | <br><br><br> |
| + | == Das komplette Programm== |
| <pre> | | <pre> |
| from machine import Pin | | from machine import Pin |
Zeile 23: |
Zeile 63: |
| daten = [1, 2, 3] # Liste mit 3 Einträgen für 3 Messstellen | | daten = [1, 2, 3] # Liste mit 3 Einträgen für 3 Messstellen |
| | | |
− | ow = onewire.OneWire(Pin(23)) | + | ow = onewire.OneWire(Pin(28)) |
| ds = ds18x20.DS18X20(ow) | | ds = ds18x20.DS18X20(ow) |
| roms = ds.scan() | | roms = ds.scan() |
Zeile 34: |
Zeile 74: |
| daten[x] = ds.read_temp(rom) # Hier werden die Temperaturen ausgelesen. | | daten[x] = ds.read_temp(rom) # Hier werden die Temperaturen ausgelesen. |
| | | |
− | </pre>
| + | # Hier folgt Code zur Auswertung der Messwerte |
| + | # Z.B. |
| + | for i, wert in enumerate(daten): |
| + | print(f'Sensor{i}, {wert}°C') |
| + | |
| | | |
| | | |
− | <pre>
| |
− | 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')]
| |
| </pre> | | </pre> |
Aktuelle Version vom 8. Januar 2024, 14:00 Uhr
![OneWire Aufbau.png](/images/1/10/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')