Введение
Приветствую, меня зовут Алексей Морозов. В этой статье я покажу как сделать простой и практичный автополив на arduino.
Подбор комплектующих
Для этого проекта я подобрал следующие компоненты:
-
Arduino Nano в качестве контроллера
-
модуль mosfet транзистора для управления помпой
-
помпа для аквариумов
-
датчик влажности почвы v2
Фото деталей
Сборка
Вот схема подключения:
Теперь по сборке:

Есть помпа, и к ней нужно приделать трубку, для этого можно взять трубку от катетера бабочки:


Отрезаем крышечку

И крепим на термоусадку прямо к отводу на помпе.
Готово!
Код
Вот полный код полива:
// --- НАСТРОЙКИ ОБОРУДОВАНИЯ ---#define SNSR_PIN A0 // Аналоговый пин, к которому подключен датчик влажности почвы#define PUMP_PIN 3 // Цифровой пин, управляющий реле или драйвером насоса// --- НАСТРОЙКИ ЛОГИКИ АВТОМАТИКИ ---#define THRESHOLD_HUMD 50 // Пороговое значение влажности (в процентах). // Если влажность ниже этого значения, насос включается.#define HYSTERESIS 10 // Гистерезис (разница в процентах). // Нужен, чтобы избежать частого включения/выключения насоса // при колебаниях влажности около порога. // Насос выключится, только когда влажность превысит (THRESHOLD_HUMD + HYSTERESIS)./** * @brief Считывает показания с датчика и преобразует их в проценты влажности. * @return Влажность почвы в процентах (0 - сухо, 100 - мокро). */uint8_t get_humd() { // analogRead(SNSR_PIN) возвращает значение от 0 до 1023. // Функция map() преобразует этот диапазон в проценты от 100 до 0. // Логика инвертирована: чем выше напряжение на датчике (больше воды), тем ниже значение АЦП, // но для удобства восприятия мы переводим это в "процент влажности", где 100 — это максимум. return map(analogRead(SNSR_PIN), 0, 1023, 100, 0);}/** * @brief Управляет состоянием насоса на основе текущей влажности. * @param humd Текущее значение влажности почвы в процентах. */void turn_pump(uint8_t humd) { // Если влажность почвы упала ниже порога, включаем насос. if (humd < THRESHOLD_HUMD) { digitalWrite(PUMP_PIN, HIGH); } // Если влажность поднялась выше порога с учетом гистерезиса, выключаем насос. // Это условие сработает только когда почва станет достаточно влажной, // чтобы предотвратить "дребезг" (циклическое включение-выключение). else if (humd > THRESHOLD_HUMD + HYSTERESIS) { digitalWrite(PUMP_PIN, LOW); }}/** * @brief Блок начальной настройки микроконтроллера. Выполняется один раз при включении. */void setup() { // Инициализация последовательного порта для вывода данных в монитор (Serial Monitor) Serial.begin(115200); // Настройка пинов: pinMode(SNSR_PIN, INPUT); // Пин датчика как вход pinMode(PUMP_PIN, OUTPUT); // Пин насоса как выход}/** * @brief Основной рабочий цикл. Выполняется бесконечно после завершения setup(). */void loop() { // Статическая переменная для хранения времени последнего измерения. // Статическая переменная сохраняет свое значение между вызовами loop(). static uint32_t tmr; // Проверяем, прошло ли достаточно времени с прошлого измерения (каждые 10 миллисекунд). // Использование millis() вместо delay() позволяет не блокировать выполнение программы. if (millis() - tmr >= 10) { tmr = millis(); // Обновляем таймер // Получаем текущее значение влажности uint8_t humd = get_humd(); // Передаем значение в функцию управления насосом turn_pump(humd); // Выводим текущее значение влажности в Serial Monitor для отладки Serial.println(humd); }}
Итоги
Мы собрали автополив. И эту тему можно долго развивать, но вот ключевые моменты которые нужно обязательно добавить в следующей версии:
-
Энергосбережение
-
Несколько помп
-
Контроль уровня воды в бачке
Спасибо за внимание, удачи в ваших проектах!
ссылка на оригинал статьи https://habr.com/ru/articles/1055346/