Auto-Garden/Scripts/temperature_sensor.py

66 lines
2.2 KiB
Python

import machine
import onewire
import ds18x20
import time
class TemperatureSensor:
def __init__(self, pin=10, label=None):
"""Initialize DS18X20 temperature sensor on the specified pin."""
self.ds_pin = machine.Pin(pin)
self.ds_sensor = ds18x20.DS18X20(onewire.OneWire(self.ds_pin))
self.roms = []
self.label = label # e.g., "Inside" or "Outside"
self.scan_sensors()
def scan_sensors(self):
"""Scan for connected DS18X20 sensors."""
try:
# Convert bytearray to bytes so they can be used as dict keys
self.roms = [bytes(rom) for rom in self.ds_sensor.scan()]
print(f'Found {len(self.roms)} DS18X20 sensor(s) on {self.label or "pin"}')
return self.roms
except Exception as e:
print(f'Error scanning sensors: {e}')
return []
def read_temp_c(self, rom=None):
"""Read temperature in Celsius. If rom=None, reads first sensor."""
try:
self.ds_sensor.convert_temp()
time.sleep_ms(750)
if rom is None and self.roms:
rom = self.roms[0]
if rom:
return self.ds_sensor.read_temp(rom)
return None
except Exception as e:
print(f'Error reading temperature: {e}')
return None
def read_temp_f(self, rom=None):
"""Read temperature in Fahrenheit."""
temp_c = self.read_temp_c(rom)
if temp_c is not None:
return temp_c * (9/5) + 32
return None
def read_all_temps(self, unit='F'):
"""Read all connected sensors. Returns dict of {rom: temp}."""
results = {}
try:
self.ds_sensor.convert_temp()
time.sleep_ms(750)
for rom in self.roms:
temp_c = self.ds_sensor.read_temp(rom)
if unit.upper() == 'F':
results[rom] = temp_c * (9/5) + 32
else:
results[rom] = temp_c
except Exception as e:
print(f'Error reading temperatures: {e}')
return results