Водяной насос на Arduino: подключение и управление мини-погружным насосом
Водяной насос на Arduino: как управлять мини-погружным насосом на 3–6 V через MOSFET или реле, защитный диод, отдельное питание, расход, автополив и код для ESP32.
Почти в каждом проекте водяного насоса на Arduino используется одна и та же деталь: мини-погружной насос размером с палец, который работает от 3–6 V и полностью погружается в воду. Это сердце схем, которые поливают цветочные горшки, доливают воду в аквариум, отмеривают заданное количество жидкости, как кофемашина, или крутят маленький фонтан. Он дешёвый, тихий и у него всего два провода; но внутри стоит коллекторный DC-мотор, поэтому подключать насос напрямую к пину Arduino нельзя.
В этом руководстве ты шаг за шагом разберёшься, что находится внутри насоса, почему его нельзя вешать прямо на пин и как безопасно управлять им через MOSFET, транзистор или реле. Поговорим о роли обратного (защитного) диода, о том, зачем насосу собственный источник питания, как расход связан с высотой подъёма и почему работа всухую его убивает. Затем напишем код для регулировки скорости через ШИМ, дозатора жидкости с точностью до миллилитра, автополива по влажности почвы, управления с телефона через ESP32 и полива по расписанию на Raspberry Pi Pico.

Что такое мини-погружной насос и как он работает?
Мини-погружной насос — это центробежный насос. В пластиковом корпусе стоит маленький коллекторный DC-мотор, а на его валу закреплена крыльчатка с лопастями. Когда мотор вращается, крыльчатка отбрасывает наружу воду, которая входит через нижнее отверстие, и выталкивает её через штуцер для шланга сбоку или сверху. Отсек мотора герметично закрыт, а камера крыльчатки заполнена водой. У такой конструкции два важных следствия: насос не самовсасывающий (воздух он качать не может, поэтому должен стоять ниже уровня воды), и именно перекачиваемая вода охлаждает крыльчатку и смазывает её подшипник.
| Параметр | Типичное значение (мини-погружной насос на 3–6 V) |
|---|---|
| Рабочее напряжение | 2,5–6 V DC (эффективнее всего на 3–5 V) |
| Рабочий ток | 130–220 mA (до 300 mA при 6 V) |
| Пусковой ток | В 2–3 раза больше рабочего в течение нескольких миллисекунд |
| Мощность | 0,4–1,5 W |
| Расход (открытый выход) | 80–120 л/ч, то есть примерно 1,3–2 л/мин |
| Максимальный напор | 40–110 см (на этой высоте расход падает до нуля) |
| Шланг | Силиконовый шланг, внутренний диаметр 5 мм, внешний 7–8 мм |
| Ресурс непрерывной работы | Около 500 часов (коллекторный мотор) |
Значения в таблице меняются от модели к модели; всегда сверяйся с этикеткой своего насоса или данными продавца. По-настоящему важны две строки: ток и пусковой ток. Насос на 200 mA в момент старта может кратковременно потреблять 400–600 mA, потому что мотор ещё не набрал обороты. Если не рассчитать схему на этот бросок тока, Arduino будет перезагружаться при каждом включении насоса.
Почему насос нельзя подключать прямо к пину Arduino?
Самая частая ошибка новичков — воткнуть красный провод насоса в цифровой пин, чёрный в GND и пытаться запустить его командой digitalWrite(HIGH). Здесь сразу три отдельные проблемы. Первая — ток: пин Arduino Uno выдерживает максимум 40 mA, а безопасный предел 20 mA, тогда как насосу нужно в десять раз больше. Вторая — выбросы напряжения: обмотка мотора — это катушка, и в момент отключения тока она может выдать короткий импульс обратной полярности в сотни вольт. Третья — электрические помехи: щётки коллекторного мотора искрят на каждом обороте и разносят помехи по линии питания. В итоге насос либо вообще не крутится, либо пин навсегда выходит из строя.
| Плата | Безопасный ток на пин | Абсолютный предел пина | По сравнению с насосом |
|---|---|---|---|
| Arduino Uno / Nano (5 V) | 20 mA | 40 mA | Насосу нужно в 5–10 раз больше |
| ESP32 (3,3 V) | ≈ 20 mA | 40 mA | Не хватает тока, и напряжение тоже низкое |
| Raspberry Pi Pico (3,3 V) | 4 mA (по умолчанию) | 12 mA (максимальная настройка) | Насосу нужно больше чем в 20 раз |
Решение — чтобы пин управлял не насосом, а ключом. Пин даёт только сигнал в несколько миллиампер; основной ток насоса идёт от отдельного источника питания через этот ключ. Вариантов ключа четыре: MOSFET с логическим уровнем управления, NPN-транзистор, готовый модуль MOSFET или модуль реле. Таблица ниже показывает, когда какой из них уместен.
| Способ управления | Регулировка скорости ШИМ | С платами на 3,3 V | Примечание |
|---|---|---|---|
| MOSFET с логическим уровнем (IRLZ44N, AO3400A) | Да | AO3400A отлично, IRLZ44N достаточно | Лучший выбор; почти не греется |
| NPN-транзистор (2N2222A, BC337) | Да | Да, с базовым резистором поменьше | До 300 mA; падение ≈ 0,2–0,3 V |
| Модуль MOSFET IRF520 | Да | Нет, открывается лишь наполовину | Справляется примерно до 1 A при 5 V |
| Модуль реле | Нет, только вкл/выкл | Нужен модуль с управлением от 3,3 V | Щёлкает, контакты изнашиваются; для насосов на 12 V или от сети |
| Драйвер моторов L298N / L9110S | Да | Да | Реверс не нужен; L298N съедает до 2 V |
Подключение водяного насоса к Arduino: MOSFET, диод и общая земля
Самая надёжная и гибкая схема — N-канальный MOSFET с логическим уровнем, который коммутирует насос в нижнем плече (low-side). Плюсовой провод насоса идёт прямо на плюс внешнего источника питания, минусовой — на сток (drain) MOSFET. Исток (source) MOSFET подключается к GND, а затвор (gate) через резистор — к пину Arduino. Когда на пине HIGH, MOSFET открывается, соединяет минус насоса с GND, и насос крутится. У IRLZ44N, если повернуть его надписью к себе, выводы слева направо идут так: Gate, Drain, Source.
| Соединение | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| Управляющий пин → резистор затвора → затвор | D9 (ШИМ), 220 Ω | GPIO 25, 100 Ω | GP15, 100 Ω |
| Стягивающий резистор между затвором и GND | 10 kΩ | 10 kΩ | 10 kΩ |
| Исток MOSFET (source) | GND | GND | GND |
| Сток MOSFET (drain) | Минусовой (чёрный) провод насоса | Минусовой (чёрный) провод насоса | Минусовой (чёрный) провод насоса |
| Плюсовой (красный) провод насоса | Плюс внешнего источника 5 V | Плюс внешнего источника 5 V | Плюс внешнего источника 5 V |
| Минус внешнего источника | GND Arduino (общая земля) | GND ESP32 (общая земля) | GND Pico (общая земля) |
| Диод 1N5819 встречно-параллельно насосу | Катод (конец с полоской) к плюсу насоса | Катод к плюсу насоса | Катод к плюсу насоса |
Резистор затвора ограничивает бросок тока из пина, пока заряжается ёмкость затвора MOSFET; стягивающий резистор на 10 kΩ держит затвор на GND, пока Arduino загружается или в неё загружается код, а состояние пина ещё не определено. Без этого резистора насос может сам включаться на несколько секунд при каждом сбросе; рядом с цветочным горшком это означает стакан воды, пролитый на стол. Диод и общая земля настолько важны, что заслуживают отдельных разделов.
Обратный диод: выброс напряжения при выключении насоса
Обмотка мотора ведёт себя как катушка, а катушка не даёт току через себя резко прекратиться. В тот момент, когда MOSFET закрывается, энергия, накопленная в обмотке, ищет выход и создаёт на стоке короткий выброс напряжения намного выше напряжения питания. Со временем этот импульс пробивает MOSFET или транзистор и сбрасывает любую Arduino на той же линии. Решение — диод, подключённый к двум выводам насоса в обратном направлении: катод (конец с полоской) к плюсу, анод к минусу. В обычном режиме через диод ток вообще не идёт; когда MOSFET закрывается, ток катушки замыкается через диод обратно в насос, и энергия безопасно рассеивается.
Если насос будет быстро переключаться через ШИМ, диод открывается в каждом периоде, поэтому лучший выбор — быстрый диод Шоттки, например 1N5819. Если насос только включается и выключается, хватит и завалявшегося в ящике 1N4007. Чтобы уменьшить помехи от щёток, можно ещё припаять керамический конденсатор на 100 nF прямо к выводам насоса. Типы диодов и то, как определить их полярность, мы разбираем в статье что такое диод.
Отдельное питание и общая земля: почему Arduino перезагружается?
Питание насоса от пина 5V на Arduino Uno с первого раза вроде бы работает, но надёжным его не назовёшь. Uno с питанием от USB целиком стоит за самовосстанавливающимся предохранителем (polyfuse) на 500 mA, и USB-порт компьютера обычно тоже выдаёт 500 mA. При старте насоса бросок тока в 400–600 mA на мгновение роняет напряжение ниже 4 V; микроконтроллер перезагружается, монитор порта отключается или код ведёт себя странно. Если вместо этого подключить адаптер к гнезду питания (DC) на Uno, начинает греться стабилизатор 5 V на плате: при входе 9 V и насосе на 250 mA стабилизатор превращает в тепло (9 − 5) × 0,25 = 1 W.
- Адаптер 5 V (1–2 A): самое практичное решение. Насос и при необходимости Arduino питаются от одного адаптера, но по отдельным проводам.
- 4 батарейки AA (6 V): идеально для насосов на 6 V; свежие элементы дают 6,4 V, и это безопасно для насоса.
- Li-ion 18650 (3,7–4,2 V): подходит для насосов на 3–5 V; заряжать его можно модулем TP4056.
- Модуль питания для макетной платы: модули вроде MB102 подают на макетную плату 5 V и 3,3 V; для маленького насоса этого хватает, подробности в руководстве по модулю питания для макетной платы.
- Если система на 12 V: понизь напряжение до 5 V понижающим преобразователем LM2596; никогда не подавай 12 V прямо на насос на 6 V.
Расход и напор: на какую высоту насос поднимает воду?
Расход 100–120 л/ч, который указывают продавцы, относится к насосу без шланга, у которого выход находится на уровне поверхности воды. В реальной работе, по мере того как вода поднимается по шлангу, насос работает против силы тяжести, и расход падает. Высота, на которую насос уже вообще не может поднять воду, называется максимальным напором; в этой точке крыльчатка вращается, но из шланга ничего не течёт. Длинный, тонкий или перегнутый шланг даёт тот же эффект за счёт трения. В таблице ниже показано, как ведёт себя на разной высоте типичный насос, который при 5 V с открытым выходом даёт около 100 л/ч.
| Высота от поверхности воды до конца шланга | Примерный расход | В секунду |
|---|---|---|
| 0 см | 100 л/ч | ≈ 28 мл |
| 25 см | 75 л/ч | ≈ 21 мл |
| 50 см | 50 л/ч | ≈ 14 мл |
| 75 см | 25 л/ч | ≈ 7 мл |
| 100 см | Почти ноль | По капле |
Поэтому не рассчитывай время полива по цифре из каталога, а измерь его на своей установке. Держи шланг над мерным стаканом на той высоте, которая будет в реальной работе, включи насос ровно на 10 секунд и посмотри, сколько воды набралось. Например, если в стакане 185 мл, расход равен 18,5 мл/с; чтобы подать 250 мл, насос должен проработать 250 / 18,5 ≈ 13,5 секунды. Если повторить замер три раза и взять среднее, погрешность из-за напряжения батареи и различий в шланге уменьшится. Когда меняется напряжение насоса (по мере разряда батарей), меняется и расход; для точного дозирования используй стабильный источник 5 V.
Работа всухую и эффект сифона: два скрытых врага насоса
Именно вода смазывает подшипник насоса и охлаждает его мотор. Когда бак пустеет, насос крутится в воздухе, подшипник крыльчатки греется от трения, пластиковые детали размягчаются, а мотор разгоняется выше нормальных оборотов. Несколько секунд всухую большинство насосов не убьют, но насос, который минутами работает без воды, либо заклинивает, либо начинает звучать иначе и теряет расход. В автоматических системах есть два способа это предотвратить: поставить в бак датчик уровня воды или поплавковый выключатель и ограничить в коде, сколько насос может работать за один раз. Код автополива ниже делает и то и другое.
Шаг за шагом: первый тест насоса
- Полностью погрузи насос в ёмкость с водой и надень на выход 30–50 см силиконового шланга; конец шланга направь во вторую ёмкость.
- Установи IRLZ44N на макетную плату. Подключи затвор к D9 через 220 Ω и ещё к GND через 10 kΩ; исток подключи к GND.
- Подключи чёрный провод насоса к стоку, а красный — к плюсу внешнего источника 5 V. Поставь диод 1N5819 на выводы насоса так, чтобы конец с полоской был со стороны плюса.
- Соедини минус внешнего источника с GND Arduino; ещё раз проверь подключение и только потом включи питание.
- Загрузи код ниже и открой монитор порта на скорости 9600 бод. Насос должен работать 3 секунды и стоять 10.
1const byte PUMP_PIN = 9; // MOSFET gate (220 Ω üzerinden) / MOSFET gate (through 220 Ω)
2
3void setup() {
4 pinMode(PUMP_PIN, OUTPUT);
5 digitalWrite(PUMP_PIN, LOW); // açılışta pompa kapalı / pump off at start-up
6 Serial.begin(9600);
7}
8
9void loop() {
10 Serial.println(F("Pompa calisiyor / pump on"));
11 digitalWrite(PUMP_PIN, HIGH); // MOSFET iletimde, pompa döner / MOSFET on, pump runs
12 delay(3000); // 3 saniye su bas / pump for 3 seconds
13 Serial.println(F("Pompa durdu / pump off"));
14 digitalWrite(PUMP_PIN, LOW);
15 delay(10000); // 10 saniye bekle / wait 10 seconds
16}Если насос не включается, сначала проверь общую землю, затем порядок выводов MOSFET; если он не выключается, возможно, перепутаны сток и исток. Чтобы измерить расход, достаточно в том же коде заменить delay(3000) на delay(10000) и держать шланг над мерным стаканом. Так как в этом коде используется delay(), пока насос работает, Arduino не может делать ничего другого; в следующих примерах будем отсчитывать время через millis(). Если интересна разница, загляни в статью millis против delay.
Регулировка скорости насоса через ШИМ
Главное преимущество MOSFET в том, что скорость насоса можно регулировать через ШИМ. Медленный поток выглядит естественнее в фонтане, меньше взмучивает грязь в аквариумном фильтре и позволяет дозировать точнее. Тут есть две практические проблемы. Первая: маленькие насосы не могут стартовать при низком коэффициенте заполнения (обычно ниже 30–40%) и только гудят; поэтому код сначала толкает насос коротким импульсом на полной мощности, а затем снижает скорость до заданной. Вторая: ШИМ 490 Hz на пине D9 у Uno заставляет насос слышимо пищать; код поднимает эту частоту до 3,9 kHz.
1const byte PUMP_PIN = 9; // MOSFET gate, Timer1 PWM pini / Timer1 PWM pin
2const byte POT_PIN = A0; // hız potansiyometresi / speed potentiometer
3const byte MIN_DUTY = 90; // bunun altında pompa dönmez (≈ %35) / pump stalls below this (≈ 35 %)
4
5byte duty = 0;
6
7void setup() {
8 // D9-D10 PWM frekansı 490 Hz yerine 3,9 kHz (daha az vızıltı) / D9-D10 PWM at 3.9 kHz instead of 490 Hz (less whine)
9 TCCR1B = (TCCR1B & 0b11111000) | 0x02;
10 pinMode(PUMP_PIN, OUTPUT);
11 Serial.begin(9600);
12}
13
14void loop() {
15 int raw = analogRead(POT_PIN); // 0-1023
16 byte target = map(raw, 0, 1023, 0, 255);
17 if (target < MIN_DUTY) target = 0; // çok yavaşsa tamamen durdur / stop completely if too slow
18
19 if (duty == 0 && target > 0) { // pompa duruyordu, şimdi kalkacak / pump was stopped, now starting
20 analogWrite(PUMP_PIN, 255); // kısa tam güç darbesi / short full-power kick
21 delay(150);
22 }
23 duty = target;
24 analogWrite(PUMP_PIN, duty);
25
26 Serial.print(F("PWM: "));
27 Serial.print(duty);
28 Serial.print(F(" (%"));
29 Serial.print(duty * 100 / 255);
30 Serial.println(F(")"));
31 delay(100);
32}Средний вывод потенциометра подключи к A0, а крайние — к 5V и GND. Строка TCCR1B влияет только на Timer1, то есть на пины D9 и D10; millis() и delay() используют Timer0, поэтому продолжают работать. Однако библиотека Servo тоже использует Timer1, так что, если в проекте есть сервопривод, убери эту строку. Значение MIN_DUTY подбери под свой насос: медленно поворачивай потенциометр, найди в мониторе порта самое низкое значение, при котором насос стартует без помощи, и добавь небольшой запас. Снижение напряжения насоса уменьшает и напор: на половине скорости насос поднимает воду лишь примерно на четверть высоты, доступной на полной скорости, потому что давление центробежного насоса пропорционально квадрату скорости вращения.
Дозатор жидкости: ровно 50 мл по нажатию кнопки
Когда расход измерен, превратить насос в дозатор легко: раздели нужный объём на расход и получишь, сколько должен работать насос. Код ниже выдаёт 50 мл при каждом нажатии кнопки, подключённой между D2 и GND; повторное нажатие, пока насос работает, отменяет дозу. Время измеряется через millis(), поэтому цикл никогда не ждёт и может постоянно опрашивать кнопку. Это основа таких проектов, как дозатор мыла, дозатор удобрений для растений или коктейльный автомат.
1const byte PUMP_PIN = 9; // MOSFET gate / MOSFET gate
2const byte BUTTON_PIN = 2; // buton: D2 ile GND arası / button between D2 and GND
3const float ML_PER_SECOND = 18.5; // kendi ölçtüğün debi / the flow rate you measured
4const float DOSE_ML = 50.0; // bir basışta verilecek miktar / amount per press
5
6unsigned long doseTime = 0; // ms cinsinden doz süresi / dose time in ms
7unsigned long startTime = 0;
8unsigned long lastPress = 0;
9bool pumping = false;
10bool lastButton = HIGH;
11
12void setPump(bool on) {
13 pumping = on;
14 digitalWrite(PUMP_PIN, on ? HIGH : LOW);
15 if (on) startTime = millis();
16}
17
18void setup() {
19 pinMode(PUMP_PIN, OUTPUT);
20 digitalWrite(PUMP_PIN, LOW);
21 pinMode(BUTTON_PIN, INPUT_PULLUP); // basılıyken LOW / LOW while pressed
22 Serial.begin(9600);
23 doseTime = (unsigned long)(DOSE_ML / ML_PER_SECOND * 1000.0);
24 Serial.print(F("Doz suresi / dose time (ms): "));
25 Serial.println(doseTime); // 50 / 18,5 = 2703 ms
26}
27
28void loop() {
29 bool button = digitalRead(BUTTON_PIN);
30 if (button == LOW && lastButton == HIGH && millis() - lastPress > 200) { // yeni basış, 200 ms debounce / new press, 200 ms debounce
31 lastPress = millis();
32 setPump(!pumping); // ilk basış başlatır, ikincisi iptal eder / first press starts, second cancels
33 Serial.println(pumping ? F("Doz basladi / dose started") : F("Iptal / cancelled"));
34 }
35 lastButton = button;
36
37 if (pumping && millis() - startTime >= doseTime) { // süre doldu / time is up
38 setPump(false);
39 Serial.println(F("Doz tamam / dose done"));
40 }
41}Если первая доза получается меньше остальных, причина, скорее всего, в пустом шланге: насос сначала заполняет шланг и только потом выдаёт жидкость. Если держать конец шланга чуть выше уровня воды в баке, шланг остаётся заполненным, и все дозы получаются одинаковыми. С густыми жидкостями вроде масла, сиропа или мыла расход намного ниже, чем с водой, поэтому калибровку всегда делай с той же жидкостью. Для проектов, где есть контакт с пищей, используй пищевой силиконовый шланг и после каждого использования промывай насос чистой водой.
Автополив по влажности почвы
Самый популярный проект водяного насоса на Arduino — цветочный горшок, который поливает себя сам, когда почва высыхает. Ловушка для новичков — гонять насос, пока влажность почвы не дойдёт до цели: вода добирается до датчика несколько минут, а за это время горшок уже переполнится. Правильный способ — полив короткими импульсами: насос работает 4 секунды, затем система ждёт 1 минуту, пока вода разойдётся по почве, и снова измеряет влажность. Кроме того, код вообще не включает насос, если бак пуст, а если после 6 импульсов влажность так и не выросла (датчик мог выскочить из почвы или слететь шланг), блокирует систему и зажигает светодиод. Калибровку датчика мы подробно разбираем в руководстве по датчику влажности почвы.
1const byte PUMP_PIN = 9; // MOSFET gate / MOSFET gate
2const byte SOIL_PIN = A0; // kapasitif toprak nem sensörü AOUT / capacitive soil sensor AOUT
3const byte FLOAT_PIN = 3; // şamandıra: D3 ile GND arası / float switch between D3 and GND
4const byte LED_PIN = 13; // uyarı LED'i / warning LED
5
6const int DRY_VALUE = 600; // sensör kuru havadayken / sensor in dry air
7const int WET_VALUE = 280; // sensör bardak sudayken / sensor in a glass of water
8const int START_PERCENT = 35; // bunun altında sulamaya başla / start watering below this
9const int STOP_PERCENT = 55; // buna ulaşınca dur / stop once this is reached
10const unsigned long PULSE_MS = 4000; // bir darbede pompa süresi / pump time per pulse
11const unsigned long SOAK_MS = 60000; // suyun toprağa yayılma süresi / time for the water to soak in
12const byte MAX_PULSES = 6; // bir sulamada en fazla darbe / max pulses per watering
13
14byte pulses = 0;
15bool locked = false;
16unsigned long lastCheck = 0;
17
18bool waterAvailable() {
19 return digitalRead(FLOAT_PIN) == LOW; // şamandıra yukarıda: kontak kapalı / float up: contact closed
20}
21
22int readMoisture() {
23 long sum = 0;
24 for (byte i = 0; i < 10; i++) { // 10 ölçümün ortalaması / average of 10 readings
25 sum += analogRead(SOIL_PIN);
26 delay(5);
27 }
28 int percent = map(sum / 10, DRY_VALUE, WET_VALUE, 0, 100);
29 return constrain(percent, 0, 100);
30}
31
32void runPump(unsigned long ms) {
33 unsigned long t0 = millis();
34 digitalWrite(PUMP_PIN, HIGH);
35 while (millis() - t0 < ms) {
36 if (!waterAvailable()) break; // su biterse hemen dur / stop at once if the water runs out
37 }
38 digitalWrite(PUMP_PIN, LOW);
39}
40
41void setup() {
42 pinMode(PUMP_PIN, OUTPUT);
43 digitalWrite(PUMP_PIN, LOW);
44 pinMode(FLOAT_PIN, INPUT_PULLUP);
45 pinMode(LED_PIN, OUTPUT);
46 Serial.begin(9600);
47 lastCheck = millis() - SOAK_MS; // ilk ölçüm hemen yapılsın / take the first reading right away
48}
49
50void loop() {
51 if (!waterAvailable()) { // depo boş: yavaş yanıp sön / tank empty: slow blink
52 digitalWrite(LED_PIN, (millis() / 500) % 2);
53 return;
54 }
55 if (locked) { // arıza: LED sürekli yanar / fault: LED stays on
56 digitalWrite(LED_PIN, HIGH);
57 return;
58 }
59 digitalWrite(LED_PIN, LOW);
60 if (millis() - lastCheck < SOAK_MS) return;
61 lastCheck = millis();
62
63 int moisture = readMoisture();
64 Serial.print(F("Nem / moisture: %"));
65 Serial.println(moisture);
66
67 if (pulses == 0 && moisture >= START_PERCENT) return; // sulama gerekmiyor / no watering needed
68 if (moisture >= STOP_PERCENT) { // hedefe ulaşıldı / target reached
69 pulses = 0;
70 return;
71 }
72 if (pulses >= MAX_PULSES) { // nem yükselmiyor: sensör ya da hortum sorunu / moisture not rising: sensor or hose problem
73 locked = true;
74 Serial.println(F("Kilitlendi, kontrol et / locked, check the setup"));
75 return;
76 }
77 runPump(PULSE_MS);
78 pulses++;
79}Два отдельных порога в коде выбраны намеренно: полив начинается, когда влажность падает ниже 35%, но продолжается, пока она не поднимется до 55%. Благодаря такому гистерезису насос не включается и не выключается без конца из-за показаний, которые колеблются прямо на пороге. Значения DRY_VALUE и WET_VALUE измерь со своим датчиком; у ёмкостных датчиков они зависят от напряжения питания и длины кабеля. Если провод поплавкового выключателя оборвётся, пин прочитает HIGH, и код посчитает бак пустым; то есть при неисправности система остаётся на безопасной стороне и останавливает насос. Если нужен полив только в определённое время суток, добавь модуль часов реального времени RTC и проверку времени в условие.
Когда для управления насосом есть смысл брать реле?
Если под рукой есть только модуль реле, мини-насос можно запустить и с ним: плюсовой провод насоса идёт от внешнего источника на контакт COM реле, а от контакта NO — к насосу; минусовой провод подключается к минусу источника. Реле полностью изолирует насос от схемы платы, и тот же модуль может коммутировать большие насосы на 12 V или аквариумные насосы от сети. С другой стороны, реле не умеет регулировать скорость через ШИМ, щёлкает при каждом переключении, его контакты со временем изнашиваются, а одна только катушка потребляет около 70 mA. Если насос включается несколько раз в день, реле справится; если нужно дозирование или регулировка скорости, MOSFET всегда лучше. Даже с реле диод на выводах насоса уменьшает искрение контактов.
Управление водяным насосом с телефона через ESP32
Благодаря Wi-Fi на ESP32 насос можно запускать из браузера телефона. Код ниже поднимает на ESP32 небольшой веб-сервер; если открыть на телефоне в той же сети IP-адрес, который показан в мониторе порта, появятся кнопки полива на 5 и 15 секунд и кнопка остановки. Дополнительная библиотека не нужна: WebServer входит в ядро ESP32. Ради безопасности насос никогда не работает дольше 30 секунд; даже если связь пропадёт, он сам остановится, когда время выйдет. Так как ESP32 работает от 3,3 V, выбирай MOSFET, который полностью открывается при 3,3 V: лучше всего AO3400A, а IRLZ44N с запасом хватает для 300 mA мини-насоса.
1#include <WiFi.h>
2#include <WebServer.h>
3
4const char* WIFI_SSID = "AgAdi"; // Wi-Fi adın (2,4 GHz) / your Wi-Fi name (2.4 GHz)
5const char* WIFI_PASS = "Sifre123"; // Wi-Fi şifren / your Wi-Fi password
6const int PUMP_PIN = 25; // MOSFET gate, 100 Ω üzerinden / through 100 Ω
7const unsigned long MAX_RUN_MS = 30000; // güvenlik: en uzun çalışma / safety: longest run
8
9WebServer server(80);
10bool pumpOn = false;
11unsigned long pumpStart = 0;
12unsigned long pumpDuration = 0;
13
14void startPump(unsigned long ms) {
15 if (ms > MAX_RUN_MS) ms = MAX_RUN_MS;
16 pumpDuration = ms;
17 pumpStart = millis();
18 pumpOn = true;
19 digitalWrite(PUMP_PIN, HIGH);
20}
21
22void stopPump() {
23 pumpOn = false;
24 digitalWrite(PUMP_PIN, LOW);
25}
26
27void handleRoot() {
28 String html = F("<!DOCTYPE html><html><head><meta charset='utf-8'>"
29 "<meta name='viewport' content='width=device-width,initial-scale=1'>"
30 "<title>Pompa</title></head><body style='font-family:sans-serif;text-align:center'>"
31 "<h2>BlueGrays Pompa</h2><p>");
32 html += pumpOn ? "Pompa çalışıyor / pump is on" : "Pompa kapalı / pump is off";
33 html += F("</p><p><a href='/run?s=5'><button>5 sn</button></a> "
34 "<a href='/run?s=15'><button>15 sn</button></a> "
35 "<a href='/stop'><button>Durdur / Stop</button></a></p></body></html>");
36 server.send(200, "text/html", html);
37}
38
39void goHome() { // ana sayfaya geri dön / go back to the main page
40 server.sendHeader("Location", "/");
41 server.send(303);
42}
43
44void handleRun() {
45 long seconds = server.arg("s").toInt(); // /run?s=5 → 5 saniye / 5 seconds
46 if (seconds > 0) startPump(seconds * 1000UL);
47 goHome();
48}
49
50void handleStop() {
51 stopPump();
52 goHome();
53}
54
55void setup() {
56 pinMode(PUMP_PIN, OUTPUT);
57 digitalWrite(PUMP_PIN, LOW);
58 Serial.begin(115200);
59 WiFi.mode(WIFI_STA);
60 WiFi.begin(WIFI_SSID, WIFI_PASS);
61 while (WiFi.status() != WL_CONNECTED) {
62 delay(500);
63 Serial.print(".");
64 }
65 Serial.println();
66 Serial.print(F("Tarayicida ac / open in the browser: http://"));
67 Serial.println(WiFi.localIP());
68
69 server.on("/", handleRoot);
70 server.on("/run", handleRun);
71 server.on("/stop", handleStop);
72 server.begin();
73}
74
75void loop() {
76 server.handleClient();
77 if (pumpOn && millis() - pumpStart >= pumpDuration) { // süre doldu / time is up
78 stopPump();
79 }
80}Эта страница открывается только из домашней сети Wi-Fi. Если нужно управлять насосом и снаружи или получать уведомление, когда бак опустел, можно добавить в этот код способы из руководств Telegram-бот на ESP32 или Blynk. Чтобы превратить страницу в панель, которая мгновенно обновляется через WebSocket, загляни в руководство ESP32 Async Web Server. Пины ESP32 выдают 3,3 V, поэтому модуль IRF520 здесь работать не будет; если нужен модуль, выбирай вариант с MOSFET с логическим уровнем.
Полив по расписанию на Raspberry Pi Pico (MicroPython)
На Pico насосом можно управлять через MOSFET на GP15 и делать плавный старт через ШИМ. Плавный старт растягивает пусковой ток насоса на несколько сотен миллисекунд и не даёт напряжению питания резко просесть; если Pico и насос питаются от одного источника, это защищает от случайных перезагрузок. Код ниже поливает 8 секунд каждые 12 часов и добавляет ещё 3 секунды при нажатии кнопки на GP14. Пины Pico выдают только 3,3 V, поэтому и здесь лучше взять MOSFET с гарантированным открытием при 3,3 V, например AO3400A. Если MicroPython в новинку, сначала загляни в статью что такое Raspberry Pi Pico.
1from machine import Pin, PWM
2import time
3
4pump = PWM(Pin(15)) # MOSFET gate, 100 Ω üzerinden / through 100 Ω
5pump.freq(1000) # 1 kHz PWM
6pump.duty_u16(0) # açılışta kapalı / off at start-up
7button = Pin(14, Pin.IN, Pin.PULL_UP) # buton: GP14 ile GND arası / button between GP14 and GND
8
9INTERVAL_MS = 12 * 60 * 60 * 1000 # 12 saatte bir / every 12 hours
10WATER_MS = 8000 # her seferde 8 saniye / 8 seconds each time
11SPEED = 0.8 # %80 hız / 80 % speed
12
13def water(ms):
14 top = int(65535 * SPEED)
15 for d in range(0, top, 2000): # yumuşak kalkış (≈ 0,3 s) / soft start (≈ 0.3 s)
16 pump.duty_u16(d)
17 time.sleep_ms(10)
18 pump.duty_u16(top)
19 time.sleep_ms(ms)
20 pump.duty_u16(0) # pompayı durdur / stop the pump
21 print("Sulandi / watered:", ms, "ms")
22
23last = time.ticks_ms()
24while True:
25 if time.ticks_diff(time.ticks_ms(), last) >= INTERVAL_MS:
26 last = time.ticks_ms()
27 water(WATER_MS)
28 if button.value() == 0: # elle sulama / manual watering
29 water(3000)
30 while button.value() == 0: # bırakılmasını bekle / wait for release
31 time.sleep_ms(10)
32 time.sleep_ms(50)Код измеряет время функцией time.ticks_diff(), которая возвращает правильную разницу даже при переполнении счётчика. Собственные часы Pico сбрасываются при отключении питания и могут уходить на несколько секунд в сутки, поэтому, если нужно расписание по реальному времени, например «поливать каждое утро в 07:00», добавь модуль RTC или возьми Pico W и получай время из интернета (NTP). После отключения электричества 12-часовой счётчик начинает отсчёт заново с нуля; для большинства растений это не страшно, но учитывай это в проектах, которые работают, пока ты в долгом отпуске.
Идеи проектов с мини-насосом
- Система полива на время отпуска: поливай растения две недели с помощью ведра воды, нескольких горшков и тонких шлангов, которые расходятся к каждому горшку; полная сборка — в статье проект умной теплицы.
- Автоматическая поилка для питомца: когда уровень воды в миске падает, насос доливает её из бака; для уровня хорошо подходит бесконтактный датчик уровня жидкости.
- Бесконтактный дозатор мыла или антисептика: когда HC-SR04 или ИК-датчик видит руку, насос работает полсекунды.
- Коктейльный автомат и машина для напитков: 3–4 насоса, каждый в своей бутылке и с отдельно измеренным расходом, смешивают напитки по рецепту.
- Настольный водопад и декоративный пруд: фонтан, поток которого ночью замедляется через ШИМ и выключается, когда фоторезистор (LDR) замечает, что в комнате стемнело.
- Автодолив аквариума: система, которая восполняет испарившуюся воду из отдельного бака, когда поплавковый выключатель показывает, что уровень упал.
- Интеграция в умный дом: свяжи насос с другими устройствами через MQTT и Home Assistant на ESP32.
Частые ошибки и как их исправить
| Симптом | Вероятная причина | Решение |
|---|---|---|
| Насос гудит, но не качает воду | Внутри остался воздух, или насос выше уровня воды | Полностью погрузи насос и аккуратно потряси, чтобы вышел воздух; уложи шланг без перегибов |
| Arduino перезагружается при старте насоса | Насос питается от пина 5V на Arduino, или нет диода | Питай насос от отдельного источника 5 V, добавь встречно-параллельный 1N5819 и 100 nF |
| Насос вообще не работает | Нет общей земли, или выводы MOSFET перепутаны | Соедини минус внешнего источника с GND Arduino и проверь порядок G-D-S |
| Насос ненадолго включается при загрузке Arduino | Затвор «висит в воздухе», нет стягивающего резистора | Поставь 10 kΩ между затвором и GND |
| После остановки насоса вода продолжает течь | Эффект сифона: конец шланга ниже уровня в баке | Подними шланг или сделай маленькое воздушное отверстие в верхней точке шланга |
| Расход со временем падает | Забита входная сетка, сели батарейки или износ от работы всухую | Почисти вход, измерь питание, добавь датчик уровня воды |
| Насос не крутится при низком ШИМ | Коэффициент заполнения ниже порога старта мотора | Дай короткий толчок на полной мощности при старте и увеличь MIN_DUTY |
При правильном управлении мини-погружной насос — дешёвая и тихая деталь, которая годами работает без проблем: с MOSFET с логическим уровнем, обратным диодом, отдельным источником 5 V и общей землёй Arduino остаётся в полной безопасности. Остальное зависит от фантазии; зная измеренный расход, можно дозировать с точностью до миллилитра, поливать по влажности почвы или управлять насосом с телефона через ESP32. В приложении BlueGrays есть проект «Умная станция полива», а также проекты веб-сервера на ESP32 и часов RTC, с пошаговыми схемами подключения и кодом.
Частые вопросы
Как подключить водяной насос к Arduino?
Мини-насос не подключают напрямую к пину Arduino: пин выдаёт 20–40 mA, а насосу нужно 150–300 mA. Подключи плюс насоса к внешнему источнику 5 V, а минус — к стоку MOSFET с логическим уровнем, например IRLZ44N; затвор соедини с пином через 220 Ω, а исток — с GND. Поставь встречно-параллельно насосу диод 1N5819 и объедини земли обоих источников.
Какой ток потребляет мини-насос?
Мини-погружные насосы на 3–6 V в работе обычно потребляют 130–220 mA, а при 6 V до 300 mA. При старте ток на несколько миллисекунд может вырасти в 2–3 раза. Поэтому источник питания должен быть рассчитан минимум на 1 A, а насос не стоит питать от пина 5V на Arduino.
Чем управлять водяным насосом: реле или MOSFET?
Для мини-насосов на 3–6 V лучше MOSFET с логическим уровнем: он бесшумный, не изнашивается и позволяет регулировать скорость через ШИМ. Реле умеет только включать и выключать, щёлкает, а его катушка дополнительно потребляет около 70 mA. Реле имеет смысл для больших насосов на 12 V или насосов от сети, а также когда насос работает всего несколько раз в день.
Что будет, если мини-насос поработает всухую?
Такие насосы охлаждаются водой, и она же смазывает их подшипник. Несколько секунд всухую обычно не вредят, но у насоса, который минутами работает без воды, перегревается подшипник, изнашиваются пластиковые детали, и его может заклинить. В автоматических системах ставь в бак датчик уровня воды или поплавковый выключатель и ограничивай в коде максимальное время работы.
На какую высоту мини-насос может поднять воду?
Максимальный напор мини-погружных насосов на 3–6 V обычно от 40 до 110 см. По мере приближения к этой высоте расход быстро падает, а на пределе из шланга почти не идёт вода. Если воду нужно подать выше, используй более мощный насос на 12 V или мембранный насос.
Можно ли регулировать скорость водяного насоса с Arduino?
Да. Если насос подключён через MOSFET с логическим уровнем, скорость можно задавать функцией analogWrite() на ШИМ-пине. Маленькие насосы не стартуют при коэффициенте заполнения ниже примерно 30–40%, поэтому сначала нужен короткий толчок на полной мощности, а потом можно снизить скорость. Через реле скорость регулировать нельзя.
Что собрать после прочтения
Все проекты
Умная станция полива
Садовник, который сам поливает растения, чтобы они не засохли, пока ты в отпуске. Датчик влажности почвы измеряет, насколько влажная земля; когда она сохнет, Arduino на несколько секунд включает водян

Асинхронный веб-сервер на ESP32 (с выводом IP на LCD)
В этом проекте ESP32 превращается в асинхронный веб-сервер, которым можно управлять с телефона или компьютера в той же сети Wi-Fi. Благодаря библиотеке ESPAsyncWebServer сервер может обрабатывать несколько запросов одновременно (в отличие от классического WebServer.h, который блокируется на одном запросе). Открыв IP-адрес ESP32 в браузере, ты нажимаешь кнопки ON/OFF (маршруты /on и /off) и включаешь и выключаешь светодиод на GPIO 5.

Подключение ESP32 к Wi-Fi в режиме STA (с экраном LCD)
В этом проекте ESP32 надёжно и устойчиво к сбоям подключается к домашней сети Wi-Fi в режиме станции (STA). SSID и пароль хранятся в отдельном файле secrets.h, чтобы не утекли в Git; настроено автоматическое переподключение, а уровень сигнала RSSI и IP-адрес выводятся на I2C LCD-экран. Встроенный светодиод служит индикатором состояния. Это менеджер подключения уровня реальных устройств.

Цифровые часы на ESP32 и DS1307 RTC (I2C + LCD)
В этом проекте время и дата из модуля часов реального времени (RTC) DS1307 выводятся на I2C LCD-экран 16x2. DS1307 — RTC с резервной батарейкой, который хранит время даже при выключенной ESP32. Оба модуля делят одну шину I2C (SDA/SCL), и ты узнаёшь, как управлять несколькими устройствами всего по двум сигнальным проводам. Проект даёт практические знания о протоколе I2C, работе модуля RTC и динамическом выводе данных на LCD-экран.

Настройка модуля часов DS1302 RTC
Ты запускаешь маленький модуль часов, который никогда не забывает время, даже когда Arduino выключена. У модуля своя крошечная батарейка, и после установки часов дата и время каждую секунду выводятся

Управление светодиодом с телефона по Bluetooth
Небольшая репетиция того, как включать и выключать свет в комнате с телефона. Bluetooth-модуль передаёт в Arduino буквы, отправленные с телефона; одна буква включает красный светодиод, другая — зелёны

Умное освещение на ESP32 (PIR + LDR + реле + OLED)
Сделай умное освещение для коридора, ванной или кладовки на ESP32! С PIR-датчиком движения, датчиком освещённости LDR и модулем реле собирается классический сценарий «свет включается при движении в темноте»: если вокруг уже светло, движение свет НЕ включает, и днём энергия экономится. Свет горит 30 секунд; если движение продолжается, таймер сбрасывается, и свет горит дольше. OLED SSD1306 крупно показывает состояние (ON / DAYTIME / WAITING) и обратный отсчёт.
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

