Датчик уровня воды для Arduino: дождь, бак, аквариум
«Бак полон или уже пуст?», «дождь пошёл — закрывать люк?», «аквариум не переливается?» — на глаз эти вопросы решаются плохо, а поплавковый выключатель — механика, которая клинит. Самый дешёвый ответ — резистивная гребёнка за 80 рублей: плата с десятью дорожками, которая вешается на аналоговый пин и говорит, докуда добралась вода. Заодно честно предупрежу: у резистивной гребёнки есть врождённая болезнь — коррозия, — и у неё есть лечение, о нём половина статей молчит.
Ниже — как работает гребёнка, скетч сигнализации «бак полон» с хитростью про питание, борьба с коррозией и сравнение с ёмкостным датчиком v1.2. В палитре «Макетка» нашего симулятора датчик уже есть: ползунок уровня 0-100 % — попробуйте его в симуляторе и подберите пороги до покупки.
Как работает гребёнка: вода как провод
На плате десять параллельных медных дорожек, не соединённых между собой. Сухая гребёнка — это разрыв; вода, поднявшись, мостит дорожки, сопротивление между ними падает, и аналоговый выход меняется. Датчик аналоговый: чем выше вода, тем больше дорожек замкнуто и тем заметнее сдвиг — по нему видно и «пошёл дождь» (несколько капель внизу гребёнки), и «бак полный» (вся плата в воде). Направление шкалы зависит от разводки конкретного модуля, поэтому первое, что делает практик, — окунает датчик и смотрит свои реальные числа. В нашем симуляторе принят вариант типовой «дождевой» платы: сухо — большие значения (≈ 1023), полное погружение — ≈ 200. Порог «полон» ставится где-то посередине, по вашим замерам.
Скетч «бак полон» с питанием через цифровой пин
Стандартное подключение: GND, VCC на 5 В и аналоговый выход AO на A0. Но питание будем подавать не с пина 5V, а с цифрового пина — и включать только на время замера. Зачем — в следующем разделе, а пока код:
const byte PIN_WET = 7; // питание гребёнки через цифровой пинconst byte PIN_AO = A0; // аналоговый выход датчикаconst byte PIN_LED = 13; // индикатор «бак полон»const int FULL = 400; // свой порог: замерьте при погружённой гребёнке void setup() { pinMode(PIN_WET, OUTPUT); pinMode(PIN_LED, OUTPUT); Serial.begin(9600);} void loop() { digitalWrite(PIN_WET, HIGH); // подали питание ТОЛЬКО на замер delay(10); // контактам нужно время устаканиться long sum = 0; for (byte i = 0; i < 20; i++) { sum += analogRead(PIN_AO); } digitalWrite(PIN_WET, LOW); // и сразу выключили int raw = sum / 20; bool full = raw < FULL; // чем больше воды — тем меньше число digitalWrite(PIN_LED, full); Serial.print("raw="); Serial.print(raw); Serial.println(full ? " bak polon" : ""); delay(1000);}Усреднение по 20 точкам убирает дрожь от пузырьков и ряби. Ток гребёнки — единицы миллиампер, цифровому пину с его потолком 20-40 мА такое по силам; для прожорливых модулей этот трюк применять нельзя — смотрите урок про бюджет тока.
Коррозия: почему дорожки темнеют за месяц
Постоянный ток в воде — это электролиз: медь с анода уходит в раствор, и открытые дорожки гребёнки съедаются за несколько недель постоянной работы. Отсюда три правила жизни датчика. Первое — питать только на время замера: 10 мс в секунду продлевают жизнь примерно в сто раз, это и делает скетч выше. Второе — после дождя или замера дать плате просохнуть, не оставлять мокрой на месяцы. Третье — принять как данность: резистивная гребёнка расходник, и её место — учебный стенд и сигнализация дождя, а не многолетний мониторинг аквариума.
Резистивный или ёмкостный: сравнение
| Параметр | Резистивная гребёнка | Ёмкостный v1.2 |
|---|---|---|
| Контакт с водой | открытая медь — электролиз и коррозия | плата в изоляции, воды не касается |
| Ресурс | недели-месяцы | годы |
| Выход | аналоговый, шкала зависит от модуля | аналоговый, стабильная калибровка |
| Цена | 50-100 ₽ | 150-300 ₽ |
| Лучшее применение | дождь, перелив, учебный стенд | бак, аквариум, автополив |
Ёмкостный датчик измеряет уровень через изоляцию — электроды не стоят в воде, поэтому не корродируют, и его платят те, кто уже съел две резистивных гребёнки. Постоянный полив с насосом и расписанием собирают именно на ёмкостном. Тонкость с ёмкостной версией v1.2: у неё на плате светодиод-порог, и некоторые клоны стабильно работают только на 3,3 В — читайте отзывы перед покупкой.
Куда развивать: сигнал «бак полон» зажигает светодиод, а если хочется звук — пассивный пьезозуммер проиграет сирену той же логикой; ток помпы в баке контролируется датчиком тока ACS712 — сухой ход ловится по скачку тока раньше, чем сгорит помпа. Грубо отмерять уровень сверху можно и без контакта с водой — ультразвуковым HC-SR04.