from machine import Pin
from onewire import OneWire
import time
# Definicja klasy DS18X20
class DS18X20:
def __init__(self, pin):
self.ow = OneWire(pin)
# Skanujemy urządzenia 1-Wire
self.roms = [rom for rom in self.ow.scan() if rom[0] == 0x10 or rom[0] == 0x28]
def read_temp(self, rom=None):
"""
Odczyt temperatury z jednego czujnika DS18x20.
Przekaż ROM (identyfikator) czujnika, aby odczytać temperaturę z konkretnego urządzenia.
Jeśli na szynie jest tylko jeden czujnik, nie musisz podawać rom.
"""
rom = rom or self.roms[0] # Jeśli nie podano ROM, wybierz pierwszy czujnik
ow = self.ow
ow.reset()
ow.select_rom(rom)
ow.write_byte(0x44) # Rozpocznij pomiar temperatury
while True:
if ow.read_bit(): # Czekaj na zakończenie pomiaru
break
ow.reset()
ow.select_rom(rom)
ow.write_byte(0xbe) # Odczyt danych z pamięci czujnika
data = ow.read_bytes(9)
return self.convert_temp(rom[0], data)
def read_temps(self):
"""
Odczyt temperatury ze wszystkich wykrytych czujników DS18x20.
"""
temps = []
for rom in self.roms:
temps.append(self.read_temp(rom))
return temps
def convert_temp(self, rom0, data):
"""
Konwersja surowych danych temperatury na stopnie Celsjusza.
"""
temp_lsb = data[0]
temp_msb = data[1]
if rom0 == 0x10:
if temp_msb != 0:
# Konwersja liczby ujemnej
temp_read = temp_lsb >> 1 | 0x80 # Przesunięcie bitów
temp_read = -((~temp_read + 1) & 0xff) # Konwersja z dopełnienia do dwóch
else:
temp_read = temp_lsb >> 1 # Przesunięcie bitów
count_remain = data[6]
count_per_c = data[7]
temp = temp_read - 0.25 + (count_per_c - count_remain) / count_per_c
return temp
elif rom0 == 0x28:
return (temp_msb << 8 | temp_lsb) / 16
else:
assert False # Niewłaściwy ROM
# Ustawienia pinu dla czujnika (przykład: GPIO 15 na Raspberry Pi Pico)
ds_pin = Pin(15) # Zmienna ds_pin określa pin, do którego podłączony jest czujnik
sensor = DS18X20(ds_pin)
# Skanowanie urządzeń 1-Wire
print("Szukam czujników DS18x20 na szynie 1-Wire...")
roms = sensor.roms
print("Znalezione czujniki:", roms)
# Jeśli czujniki zostały wykryte, odczytujemy temperaturę
if roms:
print("Odczyt temperatury ze wszystkich czujników:")
temps = sensor.read_temps()
for i, temp in enumerate(temps):
print(f"Czujnik {i+1} - Temperatura: {temp} °C")
else:
print("Brak czujników DS18x20 na szynie 1-Wire.")