Implement moisture logging

This commit is contained in:
Kai Vogelgesang 2025-07-10 09:13:02 +02:00
parent e568baad96
commit 4d7139b48a
Signed by: kai
GPG Key ID: 3FC8578CC818A9EB
3 changed files with 44 additions and 41 deletions

View File

@ -44,3 +44,6 @@ async def ensure_network():
nic.connect(SSID, PASSWORD)
await asyncio.sleep(1)
async def request():
pass

View File

@ -1,30 +1,34 @@
import asyncio
import json
import requests
# from vendor.microdot import Microdot, Request
from actors.valve import ValveActor
from sensors.moisture import MoistureSensor
from vendor.microdot import Microdot, Request
from statusled import STATUS_LED
from log import Logger, Color
from sensors.ultrasonic import UltraSonicSensor
from connection import ensure_network
app = Microdot()
# app = Microdot()
@app.route("/")
async def index(_request: Request):
return "Hello from pico"
# @app.route("/")
# async def index(_request: Request):
# return "Hello from pico"
async def read_sensor():
async def read_distance():
log = Logger("tank", Color.CYAN)
sensor = UltraSonicSensor(22, 21)
sensor = UltraSonicSensor(17, 16)
while True:
d = sensor.query_mm()
if d is None:
log.warning("distance unreadable!")
else:
log.info(f"distance: {d}mm")
await asyncio.sleep(0.5)
await asyncio.sleep(0.1)
async def toggle_valves():
log = Logger("vlvs", Color.GREEN)
@ -39,46 +43,40 @@ async def toggle_valves():
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
]
sensors = {
"a0": MoistureSensor(26, submerged=39_000),
"a1": MoistureSensor(27, submerged=39_000),
"a2": MoistureSensor(28, submerged=39_000),
}
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
]
values = {
k: sensor.read_raw()
for (k, sensor) in sensors.items()
}
log.info(f"{values=}")
await asyncio.sleep(0.2)
from secret import TOKEN
try:
r = requests.post(
"https://plantlog.leafbla.de/log",
headers={"Authorization": f"Bearer {TOKEN}"},
data=json.dumps(values)
)
log.info(f"{r.status_code=} {r.text}")
except OSError as e:
log.warning(repr(e))
await asyncio.sleep(1)
async def _main():
await asyncio.gather(
STATUS_LED.task(),
read_moisture(),
toggle_valves(),
# ensure_network(),
# read_sensor(),
# toggle_valves(),
ensure_network(),
# read_distance(),
# app.start_server(port=80),
)

View File

@ -14,6 +14,8 @@ class MoistureSensor:
self.submerged = submerged
self.dry = dry
def read_raw(self):
return self.a.read_u16()
def read(self):
return (self.a.read_u16() - self.dry) / (self.submerged - self.dry)
# return self.a.read_u16()
return (self.read_raw() - self.dry) / (self.submerged - self.dry)