IoT-полив растений на ESP32 (датчик почвы + насос)
Пусть насос включается сам, когда земля в горшке пересыхает, а влажность почвы видна на телефоне вживую. Этот проект — пошаговое руководство к IoT-шаблону «Влажность почвы + насос» в приложении, собранному на ESP32, датчике влажности почвы, реле и мини-помпе для воды. Открой Мастерская › Устройства › Добавить устройство; Ohmi подготовит код с твоим собственным ключом устройства. Код на этой странице — пример: ключ и данные Wi-Fi в нём заглушки.

Управляй этим устройством из приложения
Подключи ESP32 или Raspberry Pi Pico W к Wi-Fi — и включай, выключай и смотри показания в реальном времени с телефона. Код готовит Ohmi, тебе остаётся ввести данные Wi-Fi и загрузить его.
Шаблон в приложении: Влажность почвы + насос
- Где это в приложении?Добавь новое устройство на вкладке «Утилиты» или в разделе «Мастерская › Устройства» и выбери этот шаблон.
- Библиотека ArduinoОткрой менеджер библиотек в Arduino IDE, найди BlueGraysIoT и установи её.
В бесплатном плане — 1 устройство, 1 график и история за 24 часа. С Premium — больше устройств и графиков и более длинная история.
Схема

Исходный код
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// IoT-полив растений на ESP32 (датчик почвы + насос)
4// ─────────────────────────────────────────
5// IoT-шаблон "Влажность почвы + насос" из приложения BlueGrays: датчик
6// влажности почвы измеряет каждые 2 секунды и отправляет значение в
7// приложение, реле запускает насос, когда влажность падает ниже порога
8// полива, и останавливает его на 10 пунктов выше; насосом и порогом можно
9// также управлять с телефона. Настоящий код Ohmi готовит в приложении с
10// твоим собственным ключом устройства (Мастерская › Устройства › Добавить
11// устройство); код здесь — пример, ключ устройства и данные Wi-Fi —
12// заглушки. Library Manager: BlueGraysIoT (с зависимостями). Плата
13// подключается только к сетям Wi-Fi 2.4 GHz. Реле срабатывает по LOW.
14// Безопасность: питай насос от собственного батарейного отсека (4 x AA), а
15// не от платы; держи плату, реле и батарейки подальше от воды в закрытой
16// коробке; никогда не включай насос всухую.
17//
18// Пины:
19// GPIO34 -> AO датчика влажности почвы
20// 3V3, GND -> Датчик влажности почвы VCC, GND
21// GPIO26 -> IN модуля реле
22// 5V, GND -> Модуль реле VCC, GND
23// Реле COM -> батарейный отсек (+), NO -> насос (+), насос (-) -> батарейный отсек (-); насос
24// работает от собственных 4 x AA Pico W: датчик влажности AO GP26, реле IN GP15
25
26/*
27 * Влажность почвы + насос · BlueGrays IoT
28 * BlueGrays · bluegrays.com
29 * Не делись этим кодом: в нём ключ твоего устройства и пароль Wi-Fi.
30 */
31
32#include <BlueGraysIoT.h>
33
34const char *DEVICE_KEY = "YOUR_DEVICE_KEY";
35const char *WIFI_NAME = "YOUR_WIFI_NAME";
36const char *WIFI_PASSWORD = "YOUR_WIFI_PASSWORD";
37
38BlueGraysIoT bg(DEVICE_KEY);
39
40const int RELAY_PIN = 26;
41const bool RELAY_ACTIVE_LOW = true; // большинство модулей реле включаются по LOW
42void setRelay(bool on) { digitalWrite(RELAY_PIN, (on != RELAY_ACTIVE_LOW) ? HIGH : LOW); }
43const int SOIL_PIN = 34;
44const int SOIL_DRY = 3200; // показание в сухой почве
45const int SOIL_WET = 1300; // показание во влажной почве
46int threshold = 30; bool pump = false; unsigned long lastReadMs = 0;
47
48void setup() {
49 Serial.begin(115200);
50 pinMode(RELAY_PIN, OUTPUT);
51 setRelay(false);
52 analogReadResolution(12);
53 bg.onSwitch("pompa", [](bool on) { pump = on; setRelay(on); });
54 bg.onNumber("esik", [](float v) { threshold = (int)v; });
55 bg.setDeadband("toprak", 1.0);
56 bg.setDebug(Serial);
57 bg.setLanguage(BG_LANG_EN);
58 bg.begin(WIFI_NAME, WIFI_PASSWORD);
59}
60
61void loop() {
62 bg.loop(); // избегай здесь долгих вызовов delay()
63 if (millis() - lastReadMs >= 2000) {
64 lastReadMs = millis();
65 int pct = constrain(map(analogRead(SOIL_PIN), SOIL_DRY, SOIL_WET, 0, 100), 0, 100);
66 bg.send("toprak", pct);
67 // Включать насос ниже порога, выключать на 10 пунктов выше
68 if (pct < threshold && !pump) { pump = true; setRelay(true); bg.send("pompa", true); }
69 if (pct > threshold + 10 && pump) { pump = false; setRelay(false); bg.send("pompa", false); }
70 }
71}
72Частые вопросы
Можно ли загрузить код с этой страницы прямо на плату?
Можно, но подключения не будет: ключ устройства и данные Wi-Fi в нём — заглушки. В приложении открой Мастерская › Устройства › Добавить устройство и выбери шаблон «Влажность почвы + насос»; Ohmi подготовит код с твоим ключом, именем сети и паролем. Скопируй этот код и загрузи его. Полный код позже можно посмотреть в разделе Устройство › Код и ключ.
Работает ли это с Pico W?
Да. При добавлении устройства выбери плату Pico W; код остаётся тем же, меняются только пины и значения калибровки: датчик влажности идёт к GP26 (аналоговый вход), а реле — к GP15. В Arduino IDE установи пакет «pico» из менеджера плат. Схема и фото на этой странице сделаны с ESP32.
Почему у насоса свои батарейки?
Ток, который потребляет насос, и помехи от его мотора могут перезапустить плату. Поэтому насос питается от отсека на 4 x AA и проходит только через клеммы COM и NO реле; проводами с платой он не связан. Держи плату, реле и батарейный отсек подальше от воды в закрытом корпусе, а места соединения проводов — сухими. Насос должен работать только под водой; всухую он нагревается и выходит из строя за несколько минут. Вынимай батарейки, пока надеваешь шланг или достаёшь насос из воды.
Когда работает насос и что будет, если переключить его вручную?
Плата измеряет влажность каждые 2 секунды. Когда она падает ниже «Порога полива» в приложении (сначала 30%), насос включается, а выключается на 10 пунктов выше порога; этот промежуток не даёт насосу щёлкать туда-сюда. Переключатель «Насос» можно нажать и вручную, но побеждает автоматическое правило: если выключить его, когда почва ниже порога, он снова включится в течение 2 секунд, а если включить, когда почва на 10 пунктов выше порога, он сразу выключится. Подбери порог под свой горшок.
