Проект: датчик протечки воды

Делаем устройство, которое способно спасти от затопления квартиры.

Датчик протечки — две дорожки-электрода: при попадании воды между ними её проводимость замыкает цепь, и сопротивление резко падает.

Как датчик «чувствует» воду

Сухой датчик — это разрыв (огромное сопротивление). Вода между контактами проводит ток, сопротивление падает, и АЦП видит изменение напряжения. Мы задаём порог: если показание АЦП пересекло его — тревога.

Логика порога и гистерезиса

Чтобы тревога не «дребезжала» у границы, применяют гистерезис: срабатывание и сброс — на разных уровнях. Это чистая логика, пример исполним:

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 и может закрыть кран через реле.
  • Электроды под постоянным током корродируют — питайте импульсно.
Проверьте себя
1. Как датчик протечки определяет воду?
AПо температуре
BВода между электродами проводит ток, и сопротивление падает
CПо звуку капель
DПо Wi-Fi-сигналу
2. Зачем в логике порога используют гистерезис (два уровня)?
AДля красоты
BЧтобы тревога не «дребезжала» при показаниях у границы порога
CЧтобы ускорить АЦП
DЧтобы экономить батарею
3. Почему электроды датчика протечки не стоит держать под постоянным напряжением?
AОни греются
BОни корродируют под постоянным током; лучше питать импульсно при измерении
CОни мешают Wi-Fi
DЭто увеличивает точность