From a4675354bf740bf9ae37c6eb90f1e7307f346a74 Mon Sep 17 00:00:00 2001 From: Kai Vogelgesang Date: Tue, 8 Jul 2025 10:40:45 +0200 Subject: [PATCH] Add valves and moisture sensors --- pico/src/actors/valve.py | 13 +++++++++ pico/src/main.py | 55 ++++++++++++++++++++++++++++++++++-- pico/src/sensors/moisture.py | 19 +++++++++++++ 3 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 pico/src/actors/valve.py create mode 100644 pico/src/sensors/moisture.py diff --git a/pico/src/actors/valve.py b/pico/src/actors/valve.py new file mode 100644 index 0000000..4477466 --- /dev/null +++ b/pico/src/actors/valve.py @@ -0,0 +1,13 @@ +from machine import Pin +import asyncio + +class ValveActor: + p: Pin + + def __init__(self, p: int): + self.p = Pin(p, Pin.OUT) + + async def dispense(self, t: float): + self.p.value(1) + await asyncio.sleep(t) + self.p.value(0) diff --git a/pico/src/main.py b/pico/src/main.py index 9614f73..4e59bd7 100644 --- a/pico/src/main.py +++ b/pico/src/main.py @@ -1,5 +1,7 @@ import asyncio +from actors.valve import ValveActor +from sensors.moisture import MoistureSensor from vendor.microdot import Microdot, Request from statusled import STATUS_LED @@ -24,13 +26,60 @@ async def read_sensor(): log.info(f"distance: {d}mm") await asyncio.sleep(0.5) +async def toggle_valves(): + log = Logger("vlvs", Color.GREEN) + valves = [ + ValveActor(19), + ValveActor(20), + ValveActor(21), + ] + while True: + for i, v in enumerate(valves): + log.info(f"[{i}]") + await v.dispense(1) + await asyncio.sleep(0.5) + +async def read_moisture(): + log = Logger("mstr", Color.YELLOW) + sensors = [ + MoistureSensor(26, submerged=39_000), + MoistureSensor(27, submerged=39_000), + MoistureSensor(28, submerged=39_000), + ] + """ + minmax = [ + (65535, 0) + for _ in sensors + ] + while True: + res: list[str] = [] + for i, sensor in enumerate(sensors): + v = sensor.read() + v_min, v_max = minmax[i] + v_min = min(v_min, v) + v_max = max(v_max, v) + minmax[i] = (v_min, v_max) + res.append(f"[{i}] v={v} min={v_min} max={v_max}") + log.info("\n".join(res)) + await asyncio.sleep(0.2) + """ + while True: + values = [ + sensor.read() + for sensor in sensors + ] + log.info(f"{values=}") + await asyncio.sleep(0.2) + async def _main(): await asyncio.gather( STATUS_LED.task(), - ensure_network(), - read_sensor(), - app.start_server(port=80) + read_moisture(), + toggle_valves(), + # ensure_network(), + # read_sensor(), + # app.start_server(port=80), ) diff --git a/pico/src/sensors/moisture.py b/pico/src/sensors/moisture.py new file mode 100644 index 0000000..c1f860d --- /dev/null +++ b/pico/src/sensors/moisture.py @@ -0,0 +1,19 @@ +from machine import Pin, ADC + + +class MoistureSensor: + a: ADC + + # calibration + submerged: int + dry: int + + def __init__(self, a: int, submerged: int = 0, dry: int = 65535): + a_pin = Pin(a, Pin.IN) + self.a = ADC(a_pin) + self.submerged = submerged + self.dry = dry + + def read(self): + return (self.a.read_u16() - self.dry) / (self.submerged - self.dry) + # return self.a.read_u16()