Проект: датчик протечки воды
Делаем устройство, которое способно спасти от затопления квартиры.
Датчик протечки — две дорожки-электрода: при попадании воды между ними её проводимость замыкает цепь, и сопротивление резко падает.
Как датчик «чувствует» воду
Сухой датчик — это разрыв (огромное сопротивление). Вода между контактами проводит ток, сопротивление падает, и АЦП видит изменение напряжения. Мы задаём порог: если показание АЦП пересекло его — тревога.
Логика порога и гистерезиса
Чтобы тревога не «дребезжала» у границы, применяют гистерезис: срабатывание и сброс — на разных уровнях. Это чистая логика, пример исполним:
ALARM_ON = 1500 # ниже -> вода (мокро)
ALARM_OFF = 2500 # выше -> сухо
alarm = False
samples = [3500, 3400, 1200, 1100, 1800, 2700, 3400]
for raw in samples:
if not alarm and raw < ALARM_ON:
alarm = True
elif alarm and raw > ALARM_OFF:
alarm = False
print(f"АЦП={raw} -> {'ТРЕВОГА' if alarm else 'сухо'}")Вывод:
АЦП=3500 -> сухо АЦП=3400 -> сухо АЦП=1200 -> ТРЕВОГА АЦП=1100 -> ТРЕВОГА АЦП=1800 -> ТРЕВОГА АЦП=2700 -> сухо АЦП=3400 -> сухо
Заметьте: при показании 1800 (между порогами) тревога сохраняется — это и есть гистерезис, защита от дрожания.
Код на плате
from machine import Pin, ADC
from umqtt.simple import MQTTClient
import time
sensor = ADC(Pin(34))
sensor.atten(ADC.ATTN_11DB)
valve = Pin(26, Pin.OUT) # реле крана
client = MQTTClient("esp32-leak", "192.168.1.50")
client.connect()
alarm = False
while True:
raw = sensor.read()
if not alarm and raw < 1500:
alarm = True
valve.on() # перекрыть воду
client.publish(b"home/leak", b"ALARM")
elif alarm and raw > 2500:
alarm = False
client.publish(b"home/leak", b"OK")
time.sleep(1)Как работает под капотом
Между электродами течёт крошечный ток через воду; вместе с резистором он образует делитель напряжения, который и читает АЦП. Сухо — напряжение одно, мокро — другое. Устройство не просто шлёт уведомление, но и может через реле закрыть электромагнитный кран, физически перекрыв воду. Уведомление по MQTT мгновенно долетит до Home Assistant и пуша на телефон. Гистерезис не даёт ложных срабатываний при капле или брызгах у границы порога.
Частые ошибки
- Один порог без гистерезиса. У границы тревога «мигает» — добавьте два уровня.
- Постоянное питание электродов. Под напряжением они корродируют; в идеале подавать ток лишь на миг измерения.
- Тревога без действия. Полезно не только уведомить, но и перекрыть кран реле.
Итог
- Датчик протечки меняет сопротивление при попадании воды.
- АЦП сравнивает показание с порогом; гистерезис убирает дребезг.
- Тревога летит по MQTT и может закрыть кран через реле.
- Электроды под постоянным током корродируют — питайте импульсно.