Датчик дождя на Arduino: подключение, код и автоматическое окно
Датчик дождя на Arduino: подключение FC-37/YL-83, выходы AO и DO, настройка порога, защита от коррозии, сигнализация с зуммером, окно на сервоприводе, код для ESP32 и Pico.
Датчик дождя позволяет Arduino замечать капли и за считаные миллисекунды сообщать «начался дождь», и это один из самых дешёвых и интересных датчиков. Он состоит из сенсорной пластины, на которую попадает вода, и небольшой платы с компаратором LM393, а к Arduino подключается всего четырьмя проводами. Напоминание снять бельё, пока оно не промокло, окно или маркиза, которые автоматически закрываются с началом дождя, садовая система, пропускающая полив в дождливые дни, и маленькая метеостанция — всё это строится на этом модуле.
В этом руководстве разберём, что находится внутри модуля датчика дождя, который продаётся под названиями FC-37, YL-83 и MH-RD, чем отличаются аналоговый (AO) и цифровой (DO) выходы, как настроить порог потенциометром, и самую недооценённую тему: как защитить пластину от коррозии. Затем пошагово соберём на Arduino сигнализацию дождя с уровнями интенсивности, автоматическое закрывание окна сервоприводом, уведомления на телефон с ESP32 и пример на MicroPython для Raspberry Pi Pico.

Что такое датчик дождя и как он работает?
На сенсорной пластине есть две проводящие дорожки, которые входят друг в друга, как зубья двух гребёнок, но нигде не соприкасаются. Когда пластина сухая, сопротивление между ними составляет мегаомы, так что цепь практически разомкнута. Когда капля дождя ложится поперёк двух дорожек, вода образует между ними мостик, и сопротивление падает. Чем больше капель и чем большая часть пластины намокла, тем ниже сопротивление. На плате управления пластина вместе с резистором (на большинстве моделей 10 kΩ) образует делитель напряжения: при сухой пластине напряжение на пине AO близко к напряжению питания (VCC) и снижается по мере намокания. Как меняется выход при разных сопротивлениях, можно проверить в утилите делителя напряжения.
LM393 на плате — это микросхема-компаратор, которая сравнивает два напряжения. На один вход подаётся напряжение с пластины, на другой — опорное напряжение, которое задаётся потенциометром. Как только напряжение пластины опускается ниже опорного, то есть воды обнаружено достаточно, выход DO переходит в LOW и на плате загорается светодиод DO. У LM393 выход с открытым коллектором; благодаря подтягивающему резистору на плате DO остаётся в HIGH, пока дождя нет. Второй светодиод (PWR) просто показывает, что на модуль подано питание.
| Характеристика | Значение |
|---|---|
| Сенсорная пластина | Около 5,4 × 4 см; встречно-гребенчатые дорожки на FR4, на большинстве моделей с никелевым покрытием |
| Плата управления | Около 3 × 1,5 см, компаратор LM393 |
| Напряжение питания | 3,3–5 V |
| Ток | Около 8 mA (при 5 V, оба светодиода горят) |
| Аналоговый выход (AO) | От 0 V до VCC; снижается по мере намокания пластины |
| Цифровой выход (DO) | HIGH, когда сухо; LOW после превышения порога |
| Индикаторы | Светодиод PWR (питание) и светодиод DO (обнаружен дождь) |
| Настройка | Потенциометр чувствительности (меняет только порог DO) |
| Подключение | 2 пина со стороны пластины (полярность не важна), 4 пина со стороны Arduino: VCC, GND, DO, AO |
FC-37, YL-83 и MH-RD: есть ли разница?
Если коротко, нет. FC-37, YL-83 и MH-RD — это названия, которые разные производители дают одной и той же схеме: все они состоят из сенсорной пластины и платы управления на LM393 и работают с одним и тем же кодом. Различия обычно в размере пластины, небольших изменениях рисунка дорожек и качестве покрытия. Плата управления почти такая же, как у датчика влажности почвы, поэтому платы двух модулей взаимозаменяемы. У двух пинов между пластиной и платой нет плюса и минуса, так что неважно, какой стороной вставлять кабель. Когда пластина со временем износится, достаточно заменить только её.
Аналоговый (AO) и цифровой (DO) выход
Какой выход использовать, зависит от проекта. DO сообщает только «дождь» или «нет дождя»; порог задаётся потенциометром на плате, а на Arduino достаточно одного digitalRead(). AO же выдаёт число от 0 до 1023, которое показывает, насколько мокрая пластина: так можно отличить морось от ливня, менять порог в коде и решать, начался или закончился дождь, по нескольким измерениям подряд. Оба выхода можно использовать и одновременно.
| Характеристика | DO (цифровой) | AO (аналоговый) |
|---|---|---|
| Что сообщает | Дождь / нет дождя | Насколько мокрая пластина (0–1023 на Uno) |
| Настройка порога | Потенциометр на плате | В коде, как угодно |
| Пин Arduino | Любой цифровой пин | Аналоговый пин (A0–A5) |
| Различает интенсивность | Нет | Да (морось, дождь, ливень) |
| Работа с прерываниями | Да | Нет |
| Лучшее применение | Простая сигнализация, сигнал пробуждения | Измерение уровня, автоматика с гистерезисом |
Подключение датчика дождя: Arduino Uno, ESP32 и Pico
| Пин модуля / деталь | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | D7 (чтобы питать модуль только во время измерения) или 5V | GPIO 25 или 3V3 | GP15 или 3V3(OUT) |
| GND | GND | GND | GND |
| AO | A0 | GPIO 34 (ADC1) | GP26 (ADC0) |
| DO | D2 | Необязательно (напр. GPIO 27) | GP14 |
| Активный зуммер (+) | D8 | Необязательно | GP13 |
| Сигнальный провод сервопривода | D9 | Необязательно | GP16 |
Обрати внимание: в таблице VCC подключён не к 5V, а к цифровому пину. Модуль потребляет всего около 8 mA при 5 V, поэтому пин Arduino легко его питает (рекомендуемый предел — 20 mA на пин). Так модуль включается только на те несколько миллисекунд, пока идёт измерение, а всё остальное время остаётся выключенным. Почему это так важно, подробно разберём в разделе о коррозии. Пины Pico по умолчанию настроены на нагрузочную способность 4 mA; модуль при 3,3 V потребляет всего несколько mA, так что обычно этого хватает, но если показания нестабильны, модуль можно питать от пина 3V3(OUT).
Настройка чувствительности: порог потенциометром
- Протри пластину насухо и подай питание на модуль: светодиод PWR должен гореть, а DO — нет.
- Маленькой отвёрткой медленно поворачивай потенциометр, пока не загорится светодиод DO. Если светодиод горит уже при сухой пластине, крути в другую сторону.
- Вернись точно в ту точку, где светодиод гаснет. Это самая чувствительная настройка, при которой DO остаётся в HIGH на сухой пластине.
- Поверни ещё немного в ту же сторону, чтобы оставить запас; иначе сигнализацию может включить даже влажный воздух или роса.
- Капни с пальца на пластину две-три капли воды. Светодиод DO должен загореться; если нет, немного увеличь чувствительность.
- Вытри пластину и посмотри, через сколько времени погаснет светодиод: это подскажет, сколько твоей системе стоит ждать, прежде чем решить «дождь закончился».
Шаг за шагом: первое измерение на Arduino
- Подключи VCC модуля к D7, GND к GND, AO к A0, а DO к D2. Соедини пластину с платой двухпроводным кабелем.
- Открой код ниже в Arduino IDE, выбери плату Arduino Uno и загрузи скетч.
- Открой монитор порта на скорости 9600 бод и запиши значение AO при сухой пластине.
- Капни на пластину несколько капель воды, потом больше и каждый раз записывай значение AO.
- Запиши и значение при полностью мокрой пластине: эти значения станут константами DRY и WET в следующих скетчах.
1// Yağmur sensörü: AO ve DO okuma / Rain sensor: reading AO and DO
2const int SENSOR_POWER = 7; // modülün VCC'si bu pinden beslenir / module VCC is fed from this pin
3const int RAIN_AO = A0; // analog çıkış / analog output
4const int RAIN_DO = 2; // dijital çıkış / digital output
5
6void setup() {
7 Serial.begin(9600);
8 pinMode(SENSOR_POWER, OUTPUT);
9 digitalWrite(SENSOR_POWER, LOW); // başlangıçta kapalı / off at start-up
10 pinMode(RAIN_DO, INPUT);
11}
12
13void loop() {
14 digitalWrite(SENSOR_POWER, HIGH); // modülü aç / power the module
15 delay(50); // değerin oturmasını bekle / let the reading settle
16 int analogValue = analogRead(RAIN_AO); // 0-1023: kuruyken yüksek / high when dry
17 bool raining = digitalRead(RAIN_DO) == LOW; // yağmurda DO = LOW / DO goes LOW in rain
18 digitalWrite(SENSOR_POWER, LOW); // modülü kapat / power it off
19
20 Serial.print(F("AO: "));
21 Serial.print(analogValue);
22 Serial.print(F(" DO: "));
23 Serial.println(raining ? F("YAGMUR / RAIN") : F("KURU / DRY"));
24 delay(2000); // 2 sn'de bir ölç / measure every 2 s
25}Перед каждым измерением код подаёт HIGH на D7, чтобы включить модуль, ждёт 50 мс, пока зарядятся конденсаторы на плате и установится значение, читает AO и DO и сразу выключает модуль. В итоге модуль получает питание только 50 мс из каждого 2-секундного цикла, то есть 2,5% времени. Поскольку в дождь DO переходит в LOW, условие записано как digitalRead(RAIN_DO) == LOW. Турецкие слова в выводимых сообщениях (YAGMUR, KURU) написаны без специальных символов, потому что некоторые терминалы показывают такие символы искажённо.
| Состояние пластины | Примерно AO (Uno, 5 V) | DO (настроенная плата) |
|---|---|---|
| Сухая и чистая | 1000–1023 | HIGH |
| Несколько капель | 750–950 | HIGH или LOW в зависимости от настройки |
| Морось, пластина мокрая частично | 500–750 | LOW |
| Сильный дождь | 300–500 | LOW |
| Полностью мокрая, водопроводная вода | 150–350 | LOW |
Эти числа — лишь ориентир: размер пластины, состояние покрытия, чистота воды и пыль на пластине заметно их меняют. Даже у одного и того же модуля значения уплывают после нескольких месяцев на улице. Поэтому в следующих скетчах мы не используем сырое значение напрямую, а переводим его в процент намокания от 0 до 100 по сухому (DRY) и мокрому (WET) значениям, измеренным на твоём модуле; тогда достаточно обновлять только эти две константы, не трогая пороги.
Сигнализация дождя на Arduino: уровни интенсивности и зуммер
Теперь превратим измерение в полезную сигнализацию. Код делает 8 измерений AO подряд, усредняет их, переводит результат в процент намокания функцией map() и относит к одному из четырёх уровней: сухо, морось, дождь и ливень. Когда дождь усиливается, активный зуммер пищит столько раз, сколько указывает номер уровня: один раз при мороси, два раза при дожде и три раза при ливне. Подключи плюсовой вывод зуммера к D8, а минусовой к GND; чем активный зуммер отличается от пассивного, рассказано в статье Активный и пассивный зуммер.
1// Yağmur şiddeti seviyeleri ve sesli alarm / Rain intensity levels and audible alarm
2const int SENSOR_POWER = 7; // modülün VCC'si / module VCC
3const int RAIN_AO = A0; // analog çıkış / analog output
4const int BUZZER = 8; // aktif buzzer / active buzzer
5const int DRY = 1015; // kuru panel değeri / dry pad reading (kendin ölç / measure yours)
6const int WET = 350; // tamamen ıslak panel / fully wet pad (kendin ölç / measure yours)
7
8const char* const LEVEL_NAMES[] = {"Kuru / Dry", "Ciseleme / Drizzle", "Yagmur / Rain", "Saganak / Downpour"};
9int lastLevel = 0;
10
11int readWetness() {
12 digitalWrite(SENSOR_POWER, HIGH);
13 delay(50);
14 long sum = 0;
15 for (int i = 0; i < 8; i++) sum += analogRead(RAIN_AO); // 8 ölçümün ortalaması / average of 8 readings
16 digitalWrite(SENSOR_POWER, LOW);
17 return constrain(map(sum / 8, DRY, WET, 0, 100), 0, 100); // % ıslaklık / % wetness
18}
19
20void beep(int count) {
21 for (int i = 0; i < count; i++) {
22 digitalWrite(BUZZER, HIGH);
23 delay(150);
24 digitalWrite(BUZZER, LOW);
25 delay(150);
26 }
27}
28
29void setup() {
30 Serial.begin(9600);
31 pinMode(SENSOR_POWER, OUTPUT);
32 pinMode(BUZZER, OUTPUT);
33}
34
35void loop() {
36 int wet = readWetness();
37 int level;
38 if (wet < 10) level = 0; // kuru / dry
39 else if (wet < 40) level = 1; // çiseleme / drizzle
40 else if (wet < 75) level = 2; // yağmur / rain
41 else level = 3; // sağanak / downpour
42
43 Serial.print(F("Islaklik / Wetness: %"));
44 Serial.print(wet);
45 Serial.print(F(" "));
46 Serial.println(LEVEL_NAMES[level]);
47
48 if (level > lastLevel) beep(level); // şiddet artınca seviye kadar bip / beep once per level when it gets heavier
49 lastLevel = level;
50 delay(3000); // 3 sn'de bir ölç / measure every 3 s
51}Процент здесь показывает, какая часть пластины намокла; это не измерение осадков в миллиметрах в час, как у метеорологов. Но на практике он очень полезен: лёгкая морось замыкает лишь несколько дорожек, а ливень покрывает почти всю поверхность. Границы уровней (10, 40 и 75) можно поменять по своим наблюдениям. Зуммер звучит только при повышении уровня, поэтому, пока дождь держится на одном уровне, писк не повторяется каждые 3 секунды.
Коррозия: почему ржавеет пластина и как продлить ей жизнь?
Главная проблема датчиков дождя — износ со временем. Когда на пластину всё время подаётся постоянный ток (DC), вода между дорожками работает как электролит и начинается электролиз: металл дорожки, подключённой к плюсу, медленно растворяется, никелевое покрытие истончается, а медь под ним темнеет или зеленеет. В итоге сопротивление сухой пластины падает, показания уплывают, а в конце концов дорожки разрушаются. Пластина, оставленная на улице под постоянными 5 V, может заметно износиться за несколько недель. Хорошая новость: износ пропорционален времени, пока на пластине есть питание, а этим временем управляешь ты.
- Питай только во время измерения: подавай VCC с цифрового пина и включай модуль всего на 50 мс на каждое измерение. В системе, которая измеряет раз в 2 секунды, пластина под питанием 2,5% времени, и износ замедляется примерно в 40 раз.
- Измеряй реже: дождь не меняется за секунды. Для проектов с окном или уведомлениями достаточно одного измерения раз в 5–30 секунд; при измерении раз в 30 секунд пластина под питанием всего около 0,2% времени.
- Меняй полярность (продвинутый уровень): если подключить пластину напрямую к двум цифровым пинам и при каждом измерении менять, на каком конце HIGH, износ распределяется между двумя дорожками поровну. В этом способе плата управления не используется: делитель напряжения собирается своими руками из резистора, а измерение делается в каждом направлении отдельно.
- Держи пластину в чистоте: пыль, пыльца и птичий помёт повышают проводимость и снижают показание сухой пластины. Время от времени очищай пластину изопропиловым спиртом и мягкой кисточкой; наждачная бумага или абразивная губка поцарапают покрытие.
- Защищай плату, а не пластину: помести плату управления в водонепроницаемую коробку или покрой её защитным лаком. Пластину же никогда не покрывай лаком, силиконом или лентой: вода должна касаться дорожек.
- Держи запасную пластину: пластина — дешёвый расходник. Когда показания заметно уплыли или дорожки потемнели, просто замени пластину и заново измерь DRY и WET.
Автоматическое закрывание окна или маркизы сервоприводом
Самое популярное применение датчика дождя — система, которая автоматически закрывает окно, маркизу или крышу теплицы, когда начинается дождь. Её можно собрать на макете с сервоприводом SG90. Здесь важны два правила. Первое — подтверждение: одна капля или севшее на пластину насекомое не должны закрывать окно, поэтому перед закрытием ждём 3 мокрых измерения подряд. Второе — гистерезис: когда дождь кончается, пластина высыхает не сразу и значение колеблется около порога. Чтобы окно не открывалось и не закрывалось снова и снова, используются два отдельных порога для «дождь» и «сухо», а окно открывается только после того, как пластина остаётся сухой 10 минут без перерыва. О подключении сервопривода и управлении углом читай в статье Что такое сервопривод?


1// Yağmurda pencereyi servo ile kapatan sistem / Closes a window with a servo when it rains
2#include <Servo.h>
3
4const int SENSOR_POWER = 7; // modülün VCC'si / module VCC
5const int RAIN_AO = A0; // analog çıkış / analog output
6const int BUZZER = 8; // aktif buzzer / active buzzer
7const int SERVO_PIN = 9; // servo sinyal kablosu / servo signal wire
8
9const int DRY = 1015; // kuru panel / dry pad (kendin ölç / measure yours)
10const int WET = 350; // ıslak panel / wet pad (kendin ölç / measure yours)
11const int RAIN_ON = 25; // %25 ve üstü: yağıyor / 25% and above: raining
12const int RAIN_OFF = 8; // %8 ve altı: panel kurudu / 8% and below: pad is dry
13const int CONFIRM_COUNT = 3; // art arda 3 ıslak ölçüm / 3 wet readings in a row
14const unsigned long SAMPLE_MS = 2000UL; // 2 sn'de bir ölç / measure every 2 s
15const unsigned long DRY_MS = 600000UL; // 10 dk kuru kalmalı / must stay dry for 10 min
16
17const int OPEN_ANGLE = 90; // pencere açık / window open
18const int CLOSED_ANGLE = 0; // pencere kapalı / window closed
19
20Servo windowServo;
21bool closed = false;
22int wetCount = 0;
23unsigned long lastSample = 0;
24unsigned long drySince = 0;
25
26int readWetness() {
27 digitalWrite(SENSOR_POWER, HIGH);
28 delay(50); // değerin oturmasını bekle / let it settle
29 int raw = analogRead(RAIN_AO);
30 digitalWrite(SENSOR_POWER, LOW);
31 return constrain(map(raw, DRY, WET, 0, 100), 0, 100); // % ıslaklık / % wetness
32}
33
34void beep(int count) {
35 for (int i = 0; i < count; i++) {
36 digitalWrite(BUZZER, HIGH);
37 delay(150);
38 digitalWrite(BUZZER, LOW);
39 delay(150);
40 }
41}
42
43void setup() {
44 Serial.begin(9600);
45 pinMode(SENSOR_POWER, OUTPUT);
46 pinMode(BUZZER, OUTPUT);
47 windowServo.write(OPEN_ANGLE); // attach'tan önce açı ver, servo zıplamasın / set the angle before attach to avoid a jump
48 windowServo.attach(SERVO_PIN);
49}
50
51void loop() {
52 unsigned long now = millis();
53 if (now - lastSample < SAMPLE_MS) return; // ölçüm zamanı gelmedi / not time to measure yet
54 lastSample = now;
55
56 int wet = readWetness();
57 Serial.print(F("Islaklik / Wetness: %"));
58 Serial.println(wet);
59
60 if (wet >= RAIN_ON) {
61 drySince = now; // kuruma sayacını sıfırla / reset the drying timer
62 if (wetCount < CONFIRM_COUNT) wetCount++;
63 if (!closed && wetCount >= CONFIRM_COUNT) {
64 closed = true;
65 beep(3);
66 windowServo.write(CLOSED_ANGLE); // pencereyi kapat / close the window
67 Serial.println(F("Yagmur: pencere kapandi / Rain: window closed"));
68 }
69 } else {
70 wetCount = 0;
71 if (wet > RAIN_OFF) {
72 drySince = now; // ara bölge kuru sayılmaz / the middle zone does not count as dry
73 } else if (closed && now - drySince >= DRY_MS) {
74 closed = false;
75 windowServo.write(OPEN_ANGLE); // 10 dk kuruysa aç / open after 10 dry minutes
76 Serial.println(F("Kuru: pencere acildi / Dry: window opened"));
77 }
78 }
79}| Константа | Назначение | Начальное значение |
|---|---|---|
| DRY / WET | Значения сухой и мокрой пластины, измеренные на твоём модуле | 1015 / 350 |
| RAIN_ON | От этого процента и выше считается «дождь» | 25% |
| RAIN_OFF | От этого процента и ниже считается «сухо» | 8% |
| CONFIRM_COUNT | Сколько мокрых измерений подряд нужно, чтобы закрыть окно | 3 (около 6 с) |
| DRY_MS | Сколько пластина должна оставаться сухой, прежде чем окно откроется | 10 минут |
| OPEN_ANGLE / CLOSED_ANGLE | Угол сервопривода в открытом и закрытом положении | 90° / 0° |
Уведомления о дожде на телефон с ESP32
Чтобы узнать о начале дождя, когда тебя нет дома, можно использовать ESP32. Код ниже отправляет через Telegram сообщение «сними бельё», когда начинается дождь, и «дождь закончился», когда пластина остаётся сухой 15 минут. Понадобится установить библиотеки UniversalTelegramBot и ArduinoJson через «Менеджер библиотек» (Library Manager). Как создать бота и узнать свой chat ID, мы пошагово объясняем в статье Telegram-бот на ESP32.
1// ESP32 yağmur bildirimi (Telegram) / ESP32 rain notification (Telegram)
2#include <WiFi.h>
3#include <WiFiClientSecure.h>
4#include <UniversalTelegramBot.h> // ArduinoJson kütüphanesi de gerekir / also needs the ArduinoJson library
5
6const char* WIFI_SSID = "WIFI_ADI"; // Wi-Fi ağının adı / your Wi-Fi name
7const char* WIFI_PASS = "WIFI_SIFRESI"; // Wi-Fi şifren / your Wi-Fi password
8#define BOT_TOKEN "1234567890:ABCdefGhIJKlmNoPQRstuVWXyz" // BotFather'dan / from BotFather
9#define CHAT_ID "123456789" // senin chat ID'n / your chat ID
10
11const int SENSOR_POWER = 25; // modülün VCC'si (3,3 V) / module VCC (3.3 V)
12const int RAIN_AO = 34; // ADC1 pini, Wi-Fi ile çalışır / ADC1 pin, works with Wi-Fi
13const int DRY = 4095; // kuru panel / dry pad (kendin ölç / measure yours)
14const int WET = 1500; // ıslak panel / wet pad (kendin ölç / measure yours)
15const int RAIN_ON = 25; // %25 ve üstü: yağıyor / 25% and above: raining
16const int RAIN_OFF = 8; // %8 ve altı: kuru / 8% and below: dry
17const unsigned long SAMPLE_MS = 5000UL; // 5 sn'de bir ölç / measure every 5 s
18const unsigned long DRY_MS = 900000UL; // 15 dk kuru: yağmur bitti / 15 dry minutes: rain is over
19
20WiFiClientSecure client;
21UniversalTelegramBot bot(BOT_TOKEN, client);
22
23bool raining = false;
24int wetCount = 0;
25unsigned long lastSample = 0;
26unsigned long drySince = 0;
27
28int readWetness() {
29 digitalWrite(SENSOR_POWER, HIGH);
30 delay(50); // değerin oturmasını bekle / let it settle
31 int raw = analogRead(RAIN_AO); // 0-4095
32 digitalWrite(SENSOR_POWER, LOW);
33 return constrain(map(raw, DRY, WET, 0, 100), 0, 100);
34}
35
36void connectWiFi() {
37 WiFi.mode(WIFI_STA);
38 WiFi.begin(WIFI_SSID, WIFI_PASS);
39 unsigned long start = millis();
40 while (WiFi.status() != WL_CONNECTED && millis() - start < 15000) { // en fazla 15 sn bekle / wait up to 15 s
41 delay(500);
42 }
43}
44
45void notify(const String& text) {
46 if (WiFi.status() != WL_CONNECTED) connectWiFi(); // bağlantı koptuysa yeniden bağlan / reconnect if dropped
47 if (WiFi.status() == WL_CONNECTED) {
48 bot.sendMessage(CHAT_ID, text, "");
49 }
50}
51
52void setup() {
53 Serial.begin(115200);
54 pinMode(SENSOR_POWER, OUTPUT);
55 digitalWrite(SENSOR_POWER, LOW);
56 client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // api.telegram.org kök sertifikası / root certificate
57 connectWiFi();
58 notify("Yagmur sensoru devrede / Rain sensor is online");
59}
60
61void loop() {
62 unsigned long now = millis();
63 if (now - lastSample < SAMPLE_MS) return;
64 lastSample = now;
65
66 int wet = readWetness();
67 Serial.printf("Islaklik / Wetness: %%%d\n", wet);
68
69 if (!raining) {
70 wetCount = (wet >= RAIN_ON) ? wetCount + 1 : 0;
71 if (wetCount >= 2) { // art arda 2 ıslak ölçüm (~10 sn) / 2 wet readings in a row (~10 s)
72 raining = true;
73 drySince = now;
74 String msg = "Yagmur basladi, camasirlari topla! / It's raining, bring in the laundry! %";
75 msg += wet;
76 notify(msg);
77 }
78 } else {
79 if (wet > RAIN_OFF) {
80 drySince = now; // hâlâ ıslak / still wet
81 } else if (now - drySince >= DRY_MS) {
82 raining = false;
83 wetCount = 0;
84 notify("Yagmur durdu / The rain has stopped");
85 }
86 }
87}АЦП (ADC) ESP32 12-битный, поэтому значения лежат в диапазоне от 0 до 4095, и при питании модуля от 3,3 V сухая пластина обычно даёт значение, очень близкое к 4095; значения DRY и WET всё равно стоит измерить на своём модуле. Отправка сообщения может занимать секунду-две, поэтому интервал измерения оставлен 5 секунд, а флаг raining не даёт одному и тому же дождю вызывать сообщение за сообщением. Если система должна работать от батарей, ESP32 можно переводить в глубокий сон между измерениями, а если используется Home Assistant, данные можно отправлять по MQTT.
Датчик дождя на Raspberry Pi Pico и MicroPython
На Raspberry Pi Pico логика та же. Подай на модуль 3,3 V через GP15 и подключи AO к GP26, DO к GP14, активный зуммер к GP13, а сигнальный провод сервопривода к GP16. АЦП Pico через read_u16() возвращает значения от 0 до 65535. Код ниже трижды пищит при обнаружении дождя и убирает маркизу сервоприводом; когда пластина остаётся сухой 10 минут, маркиза снова открывается.
1# Raspberry Pi Pico yağmur sensörü + servo tente / Raspberry Pi Pico rain sensor + servo awning
2from machine import Pin, ADC, PWM
3import time
4
5power = Pin(15, Pin.OUT, value=0) # modülün VCC'si (3,3 V) / module VCC (3.3 V)
6rain_ao = ADC(26) # GP26 = ADC0, AO çıkışı / AO output
7rain_do = Pin(14, Pin.IN) # DO: yağmurda 0 / DO: 0 in rain
8buzzer = Pin(13, Pin.OUT, value=0) # aktif buzzer / active buzzer
9servo = PWM(Pin(16))
10servo.freq(50) # servolar 50 Hz ister / servos expect 50 Hz
11
12DRY, WET = 65000, 24000 # kendi değerlerinle değiştir / replace with your readings
13RAIN_ON, RAIN_OFF = 25, 8 # % eşikler / % thresholds
14DRY_MS = 10 * 60 * 1000 # 10 dk kuru kalmalı / must stay dry for 10 min
15OPEN_ANGLE, CLOSED_ANGLE = 90, 0
16
17def set_angle(deg):
18 us = 544 + deg * (2400 - 544) // 180 # Arduino Servo ile aynı aralık / same range as Arduino Servo
19 servo.duty_u16(us * 65535 // 20000) # 20 ms periyodun oranı / share of the 20 ms period
20
21def read_sensor():
22 power.value(1)
23 time.sleep_ms(50) # değerin oturmasını bekle / let it settle
24 raw = rain_ao.read_u16() # 0-65535
25 do_wet = rain_do.value() == 0
26 power.value(0)
27 pct = (DRY - raw) * 100 // (DRY - WET)
28 return max(0, min(100, pct)), do_wet
29
30def beep(count):
31 for _ in range(count):
32 buzzer.value(1)
33 time.sleep_ms(150)
34 buzzer.value(0)
35 time.sleep_ms(150)
36
37closed = False
38wet_count = 0
39dry_since = time.ticks_ms()
40set_angle(OPEN_ANGLE) # tente açık başlar / awning starts open
41
42while True:
43 wet, do_wet = read_sensor()
44 print("Islaklik / Wetness: %", wet, " DO:", "YAGMUR / RAIN" if do_wet else "KURU / DRY")
45 now = time.ticks_ms()
46 if wet >= RAIN_ON:
47 dry_since = now # kuruma sayacını sıfırla / reset the drying timer
48 wet_count += 1
49 if not closed and wet_count >= 3: # art arda 3 ıslak ölçüm / 3 wet readings in a row
50 closed = True
51 beep(3)
52 set_angle(CLOSED_ANGLE) # tenteyi kapat / retract the awning
53 else:
54 wet_count = 0
55 if wet > RAIN_OFF:
56 dry_since = now
57 elif closed and time.ticks_diff(now, dry_since) >= DRY_MS:
58 closed = False
59 set_angle(OPEN_ANGLE) # 10 dk kuruysa aç / open after 10 dry minutes
60 time.sleep(2)В MicroPython нет встроенного класса для сервопривода, поэтому угол переводится в длительность импульса вручную: положение сервопривода задаётся импульсами длиной примерно 0,5–2,5 мс, которые приходят каждые 20 мс. Функция set_angle() переводит 0–180 градусов в тот же диапазон 544–2400 микросекунд, что и библиотека Servo для Arduino, а затем пересчитывает это время в долю 0–65535 для duty_u16(). Если сохранить код на Pico в Thonny под именем main.py, он будет запускаться автоматически при каждом включении Pico.
Установка на улице: советы по размещению
- Ставь пластину под наклоном: наклон 20–45 градусов позволяет каплям стекать и помогает пластине быстрее высохнуть после дождя. На горизонтальной пластине вода собирается лужицами, и система может часами твердить «дождь».
- Выбирай место под открытым небом: не размещай пластину под карнизом, деревьями или капающим кондиционером: там она и настоящий дождь пропустит, и от случайных капель сработает.
- Электронику держи в помещении: снаружи должна быть только пластина. Помести плату управления и Arduino в водонепроницаемую коробку, а место входа кабеля загерметизируй кабельным вводом (сальником) или силиконом.
- Не удлиняй кабель без нужды: кабель между пластиной и платой можно удлинить до нескольких метров; на более длинных кабелях растут помехи. Усреднение показаний уменьшает эти колебания.
- Учитывай росу и туман: прохладными ночами влага, конденсирующаяся на пластине, может давать небольшое значение намокания. Чуть более высокий порог RAIN_ON и подтверждение несколькими измерениями подряд предотвращают большинство таких ложных срабатываний.
- Снег замечается с опозданием: сухой снег не проводит ток; датчик реагирует, только когда снег тает и превращается в воду. В холодном климате считай датчик надёжным только для дождя.
Датчик дождя, датчик влажности почвы и датчик уровня воды: в чём разница
| Датчик | Что измеряет? | Выход | Типичное применение |
|---|---|---|---|
| Датчик дождя (FC-37, YL-83) | Капли воды на поверхности | AO и DO | Сигнализация дождя, автоматика окон и маркиз |
| Датчик влажности почвы | Влажность почвы | AO и DO (та же плата на LM393) | Полив растений |
| Датчик уровня воды (параллельные дорожки) | Высота воды в ёмкости | Аналоговый (S) | Уровень в баке и аквариуме |
| Осадкомер с опрокидывающимся ковшом | Количество осадков (мм) | Один импульс на каждое опрокидывание | Метеостанция |


Датчик дождя не может ответить на вопрос «сколько выпало осадков?»; для этого нужен осадкомер с опрокидывающимся ковшом, который используют на метеостанциях. Вода из воронки наполняет маленький ковш, при определённом количестве он опрокидывается (в распространённых наборах метеостанций одно опрокидывание соответствует 0,2794 мм осадков), и при каждом опрокидывании магнит на мгновение замыкает геркон. Arduino считает эти импульсы через прерывание и умножает их число на цену одного опрокидывания, получая количество осадков в миллиметрах. Есть смысл использовать оба датчика вместе: датчик дождя сразу сообщает, что дождь начался, а ковшовый осадкомер записывает общее количество. Если нужно измерять высоту воды, собирающейся в ёмкости, лучше подойдёт датчик уровня воды.
Идеи проектов с датчиком дождя
- Напоминание о белье: зуммер и светодиод, которые срабатывают, когда начинается дождь; с ESP32 ещё и сообщение приходит на телефон.
- Крыша умной теплицы: в дождь закрывай форточку на крыше сервоприводом, а для проветривания открывай её в зависимости от температуры. Подробности — в статье про проект умной теплицы.
- Пропуск полива в дождь: пусть система автополива, собранная на датчике влажности почвы, не включает насос, пока идёт дождь.
- Мини-метеостанция: выводи состояние дождя на OLED-дисплей вместе с температурой, влажностью и давлением, которые измеряет BME280.
- Макет стеклоочистителя: забавный проект, который имитирует автоматические дворники автомобиля: чем сильнее дождь, тем быстрее качается сервопривод.
- Сценарий умного дома: для системы, которая с началом дождя закрывает окна, убирает маркизу и предупреждает тебя, загляни в руководство Умный дом на Arduino.
Частые ошибки и как их исправить
| Симптом | Возможная причина | Решение |
|---|---|---|
| AO всегда 1023 и не меняется | Кабель пластины не подключён или оборван; к A0 подключён DO вместо AO | Проверь два провода между пластиной и платой и подключение A0 |
| AO очень низкий даже при сухой пластине | Пластина грязная или ещё мокрая; что-то замыкает дорожки; измерение выполняется до включения питания модуля | Очисти и высуши пластину; в коде читай значение только после включения питания и паузы |
| DO никогда не меняется | Потенциометр выкручен до упора в одну сторону | Повтори шаги настройки чувствительности с начала |
| Сигнализация дождя в сухую погоду | Роса, туман, грязная пластина или слишком чувствительный порог | Подними RAIN_ON, подтверждай несколькими измерениями подряд, очисти пластину |
| Дождь закончился, а система всё ещё сообщает «дождь» | Пластина установлена горизонтально и медленно сохнет | Установи пластину под наклоном, настрой RAIN_OFF и DRY_MS |
| За несколько недель показания уплыли, а дорожки потемнели | Коррозия из-за постоянного питания | Питай модуль от пина, измеряй реже, замени пластину |
| На ESP32 показания портятся при включении Wi-Fi | AO подключён к пину ADC2 | Перенеси AO на пин из диапазона GPIO 32–39 |
| Сервопривод дёргается или Arduino перезагружается | Ток сервопривода просаживает линию 5V | Питай сервопривод от отдельного источника 5 V, соедини земли, поставь конденсатор 470 µF параллельно питанию |
Датчик дождя — дешёвый, но познавательный модуль, который сразу знакомит с делителями напряжения, компараторами, гистерезисом и реальными проблемами вроде коррозии. Если не забывать подавать питание на пластину только во время измерения и задавать пороги по собственным измерениям, он прослужит долго. В приложении BlueGrays есть пошаговые проекты со схемами и кодом, в которых используются детали из этой статьи: зуммер, сервопривод, «Умная станция полива» и сигнализация с Telegram на ESP32, — и в них легко добавить датчик дождя.
Частые вопросы
Как работает датчик дождя?
Две встречно-гребенчатые проводящие дорожки на сенсорной пластине в сухом состоянии изолированы друг от друга. Когда капли дождя замыкают дорожки, сопротивление пластины падает, и выход (AO) делителя напряжения на плате управления снижается. Компаратор LM393 сравнивает это напряжение с порогом, заданным потенциометром, и после превышения порога переводит выход DO в LOW.
Может ли датчик дождя измерять количество осадков?
Нет. Датчик дождя показывает, какая часть пластины мокрая: этого достаточно, чтобы понять, что дождь начался и насколько он примерно сильный, но количество осадков в миллиметрах он не даёт. Для измерения количества осадков используют осадкомер с опрокидывающимся ковшом, который при каждом опрокидывании выдаёт импульс через геркон.
Почему датчик дождя корродирует и сколько он служит?
Когда на пластину всё время подаётся постоянный ток, в воде между дорожками идёт электролиз, и металл дорожки на стороне плюса растворяется. Пластина, оставленная на улице под постоянными 5 V, может заметно износиться за несколько недель. Если питать модуль от цифрового пина и включать его лишь на несколько миллисекунд на каждое измерение, пластина живёт гораздо дольше и часто много месяцев работает без проблем.
Что выдаёт датчик дождя в дождь: LOW или HIGH?
На распространённых модулях с LM393 выход DO в сухую погоду в состоянии HIGH; когда вода на пластине превышает порог, заданный потенциометром, он переходит в LOW и загорается светодиод DO. Выход AO максимален, когда пластина сухая, и снижается по мере её намокания; на Arduino Uno сухая пластина обычно даёт больше 1000.
Работает ли датчик дождя с ESP32 и 3,3 V?
Да, модуль работает от 3,3 до 5 V. На ESP32 и Raspberry Pi Pico питай его от 3,3 V, чтобы выходы AO и DO тоже никогда не превышали 3,3 V. На ESP32 подключай AO к одному из пинов ADC1 (GPIO 32–39), которые продолжают работать при включённом Wi-Fi.
Может ли датчик дождя обнаружить снег, росу или туман?
Сухой снег не проводит ток, поэтому датчик замечает снег, только когда тот тает. А вот роса и густой туман могут оставить на пластине тонкую плёнку влаги, которая даёт небольшое значение намокания и иногда ложное срабатывание. Чтобы этого избежать, держи порог чуть выше, подтверждай тревогу несколькими измерениями подряд и ставь пластину под наклоном.
Что собрать после прочтения
Все проекты
Работа с зуммером
Интересно, как дверной звонок или сигнализация издают звук? Arduino заставляет маленький зуммер пищать через короткие промежутки: пик, пауза, пик, пауза. Ты видишь, как электричество превращается в зв

Температура и влажность с DHT11
Насколько тепло в твоей комнате и влажный ли воздух или сухой? Датчик DHT11 измеряет температуру и влажность, а Arduino выводит значения на двухстрочный LCD-экран и обновляет их каждые пару секунд. Ес

Работа с сервоприводом
Рычаг маленького сервопривода по очереди поворачивается в три положения: до упора в начало, ровно на середину и до упора в конец, задерживаясь на каждой остановке на две секунды. Arduino сообщает мото

Умная станция полива
Садовник, который сам поливает растения, чтобы они не засохли, пока ты в отпуске. Датчик влажности почвы измеряет, насколько влажная земля; когда она сохнет, Arduino на несколько секунд включает водян

Работа с датчиком пламени
Маленький страж, который замечает огонь на кухне или в мастерской раньше тебя. Датчик пламени улавливает невидимый свет, который испускает огонь; пока всё в порядке, горит зелёный светодиод, а когда о

Сигнализация движения на ESP32 (PIR + зуммер + светодиод + Telegram)
Умная охранная сигнализация, которая при обнаружении движения PIR-датчиком включает зуммер и светодиод и одновременно сразу отправляет владельцу уведомление в Telegram. В ней есть 30-секундная пауза, ограничивающая частоту повторных тревог; этот механизм не проверяет срабатывания PIR и не устраняет ложные тревоги. Подходит для дома, гаража, склада или мастерской. С ESP32-CAM можно добавить уведомления с фото, а с обычной ESP32 DevKit V1 приходят текстовые.

ESP32 HTTPClient + API погоды (с экраном LCD)
В этом проекте ESP32 через HTTPClient.h делает вызов REST API к сервису погоды (wttr.in) через интернет. Полученный ответ в JSON разбирается с помощью ArduinoJson v7, а город, температура, влажность, погода и ветер выводятся на I2C LCD на турецком и английском. wttr.in бесплатен и не требует ключа API — достаточно указать любое название города, чтобы получить текущую погоду. Данные автоматически обновляются каждые 30 минут.
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

