Add valves and moisture sensors

This commit is contained in:
Kai Vogelgesang 2025-07-08 10:40:45 +02:00
parent c37d349608
commit a4675354bf
Signed by: kai
GPG Key ID: 3FC8578CC818A9EB
3 changed files with 84 additions and 3 deletions

13
pico/src/actors/valve.py Normal file
View File

@ -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)

View File

@ -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),
)

View File

@ -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()