Auto-Garden/Scripts/temperature_sensor.py

75 lines
2.4 KiB
Python

import machine
import onewire
import ds18x20
import time
class TemperatureSensor:
def __init__(self, pin=10):
"""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.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)')
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
# Example usage / test code
if __name__ == "__main__":
sensor = TemperatureSensor(pin=10)
while True:
temps = sensor.read_all_temps(unit='F')
for rom, temp in temps.items():
print(f'Sensor {rom.hex()}: {temp:.2f}°F')
print()
time.sleep(5)