Умный подоконник: как ESP32 спас мой домашний огород (и что я узнал про «невидимые» пины)

от автора

История о том, как микроконтроллер за 500 рублей помог вырастить клубнику ранней весной, и почему важно знать «анатомию» чипа


 Пролог: Когда руки тянутся к земле, а за окномь уже вроде и весна, но все еще случается минус 10

Живу в обычной квартире. Места мало, света ещё меньше. Но хочется своего — без пестицидов, свеженького. Решил организовать домашнюю ферму на подоконнике: клубника, базилик, салат, щавель, лук.

Если более глобально: в Мире наблюдается перенасыщение людьми, еды на всех не хватит, Дальний Восток от Москвы далеко, а ездить за 80 км от МКАД очень часто ну точно неохота. Если летом можно использовать балкон, где много натурального солнца, то зимой и в переходные периоды (весна и осень) есть совсем маленький клочок на территории квартиры, где то ли горизонтальную ферму делать, то ли вообще вертикальную. Или гибрид вертикальной и горизонтальной.

Концепция вертикальных ферм на крыше небоскреба

Концепция вертикальных ферм на крыше небоскреба

Есть еще нюанс — 4-5 прямоугольных горшков, как показал мой опыт, Вам явно не хватит. Но этого уже будет достаточно, чтобы было некоторое количество урожая к Вашему столу. Не лучше ли закупать микрозелень и клубнику в магазина, где ее «везут с Краснодара»? Ну есть проблема — в этом капитализме нас повсюду обманывают: искусственное дозревание, пестициды и дешевые эффективные добавки, не лучшее качество воздуха при выращивании в теплице и так далее.

Поэтому если бумеры и поколение X ненавидели городское фермерство за то, что в загазованных условиях ты пытаешься что-то ростить, то сегодня все сложно. В небоскребе на 63 этаже вообще может быть воздух чище, чем на загородном участке в 3 метрах от забора. Все ситуативно, но на помощь приходят инструменты и средства Умного Дома и Интернета вещей. Именно сегодня наиболее актуально автоматизировать и роботизировать домашние фермы.

Если подоконник маленький, вообще кому-то актуальнее может быть сделать такое:

Вертикальная, но горизонтальная ферма

Вертикальная, но горизонтальная ферма

А, начиная с этой точки, уже думать, снизить ли расход электричества на освещение путем меньшего светового потока, использования солнечных элементов или же отраженных солнечных лучей.

Учитывая, что в прошлом я не только Главный специалист по робототехнике из Кванториума Мосгормаш, я нашел в этом явную золотую жилу, которую можно интересно и своеобразно решить в техническом плане. А также относительно последовательно, то есть я лично устал от этих инженерных «ставь задачу и цель, пиши ТЗ, делай расчет приход/расход, проектируй и, затем, разрабатывай». Я пошел по пути «есть освещение, идем дальше к поливу… есть полив – думаем о том, что и почему погибает…». Ну и тут должна быть дальнейшая логическая цепочка вплоть до сравнения нейросетью совокупности данных с разных ферм с учетом значений, получаемых с датчиков. Чтобы понять, почему у хорошего фермера компостные бананы спасают урожай, а у начинающего любителя единственная клубничка вообще перестала плодоносить.

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

Купил самые обычные лампы и холодного, и теплого оттенков, грунт накопал просто на улице, нашел под это дело горшки. Посадил. И начался детектив:

  • Почему один куст растёт как на дрожжах, а другой чахнет?

  • Хватает ли света?

  • Не перелил ли я?

  • Может, температура ночью падает критически?

  • Реально надо удобрять раз в 2 недели? Чем? Дорогим покупным удобрением, либо же бананами из миксера?

Моя версия фермы, с которой я начал

Моя версия фермы, с которой я начал

Рукой не пощупаешь — растения не говорят. А если и говорят, то слишком поздно — когда уже желтеют листья или растение просто медленно и бесповоротно умирает за 3-4 дня.

Идея: а что если поставить «сторожа», который 24/7 будет следить за условиями и писать отчёты?

Салат растет нормально. Лук и в бутылке бы рос нормально

Салат растет нормально. Лук и в бутылке бы рос нормально

То есть освещение сделано быстро на умной розетке, полив тоже дело легкое — оросительная система + водяная помпа с достаточным создаваемым давлением. Если течет слабо — нужно либо более пробивную помпу, либо параллелить водные каналы, что также я решил сделать. Старый 3D-принтер пока молча курит в сторонке и разрешил нацепить на себя лампочку, вот он – настоящий киберпанк, который мы заслужили.

Сосуд с помпой внутри для автополива

Сосуд с помпой внутри для автополива

 Знакомьтесь: ESP32 — мой новый агроном

Выбрал ESP32 по трём причинам:

  1. Дешёвый — около $3-6

  2. С Wi-Fi — может отправлять данные прямо на сервер

  3. С аналоговыми входами — можно подключить датчики

Что я подключил :

Датчик

Что измеряет

Зачем

FC-28 (влажность почвы)

Сопротивление грунта

Не пересушить и не залить

BH1750 (освещённость)

Люксы

Хватает ли света от фитолампы

DHT22 (температура/влажность воздуха)

°C и %RH

Комфортный микроклимат

Фоторезистор (через ADC)

Интенсивность света

Дублирующая проверка освещения


 Первый успех: данные пошли!

Написал скетч. Подключил датчики. Запустил.

В Serial Monitor побежали цифры:

 Влажность почвы: 1842 (1490 mV) — норма Освещённость: 4500 lux — маловато Температура: 23.5°C — отлично Влажность воздуха: 58% — суховато

Отлично! Теперь я вижу невооружённым глазом:

  • Базилик стоит при 1200 mV — земля сухая, пора поливать

  • Ночью температура падает до 18°C при открытии форточки — растения в стрессе

  • Когда я выключаю мощную лампу, то в определенных точках получается всего 3000 lux при норме 10000+

Кстати, для увлажнения воздуха достаточно открыть окно, либо поставить увлажнитель, но с этим как раз и надо экспериментировать. Я заметил, что когда открываю окно, то растениям становится плохо. Сначала я думал, что это именно вредители, но помогла не обработка растворенным в воде нашатырным спиртом, а попытка не открывать окно некоторое время и понаблюдать за итогами роста.

Результат за неделю:

  • Урожайность выросла на 40% (субъективно, но листья жирнее и выше)

  • Перестал заливать растения (датчик влажности не врал)

  • Перенёс ферму ближе к окну + добавил вторую лампу

Кстати, невооруженным глазом, конечно, видно, что растения у окна быстрее растут ввысь. Возможно, это потому, что я взял не лампы полного спектра, а самые обычные. Лампы надо ставить на расстоянии 20-30 см от растений.


 Шаг второй: отправляем данные в облако

Но смотреть в Serial Monitor неудобно. Хочется графиковуведомленийистории.

Добавил в код Wi-Fi и отправку данных на свой сервер:

WiFi.begin("MeurchWiFi", "cooltheBestpass");// ... отправка GET-запроса на iot.tfeya.ru

Теперь каждые 5 секунд ESP32 шлёт пакет:

/sensorData.php?login=eug&sensor_id=1&val=1842&json=1

На сервере — PHP-скрипт, который пишет в базу. А я вижу красивые графики в браузере: как меняется влажность почвы в течение дня, когда включается лампа, какая динамика роста.


 И тут всё сломалось. Вернее, «замолчало»

Добавил Wi-Fi. Запустил. И вместо живых данных увидел:

 ADC: 0 (0 mV) ADC: 0 (0 mV) ADC: 0 (0 mV)

Шок. Датчики на месте. Провода не трогал. Код тот же (почти).

Расследование: оказалось, я использовал GPIO2 для фоторезистора. А это — ADC2, который блокируется при включённом Wi-Fi.


 Анатомия проблемы: почему ESP32 — это не «просто Arduino»

ESP32 — мощный чип. Но у него есть архитектурная особенность:

  • ADC1 (6 пинов: 32-39) — работает всегда

  • ADC2 (10 пинов: 0, 2, 4, 12-15, 25-27) — отключается, когда работает Wi-Fi или Bluetooth

Почему? Радиомодуль использует ADC2 для внутренней калибровки и не делится им с пользователем.

Мораль: если используешь Wi-Fi — забудь про пины 0, 2, 4, 12-15, 25-27 для аналоговых датчиков.


 Решение: переезд на «безопасную территорию»

Заменил в коде одну строчку:

// Было const int analogPin = 2;  // GPIO2 — ADC2 — мёртв с Wi-Fi// Стало   const int analogPin = 34; // GPIO34 — ADC1 — жив и здоров!

Переcтавил провод с пина 2 на пин 34. Загрузил. И — о чудо:

 ADC: 1842 (1490 mV) Connected to server Data sent successfully

Всё заработало. Данные пошли на сервер. Графики рисуются.


 Что я получил в итоге

1. Объективные данные вместо догадок

Раньше: «Кажется, суховато, полью-ка я».
Теперь: «Влажность почвы 980 mV — критически сухо, включаю автополив».

2. Историю изменений

Вижу, что:

  • Ночью влажность воздуха падает до 40% — растения в стрессе

  • После полива датчик показывает 2100 mV, через 3 дня — 800 mV

  • Фитолампа работает 14 часов, даёт стабильные 8000 lux

3. Уведомления

Настроил на сервере простой скрипт: если влажность почвы < 1000 mV — Telegram-бот шлёт сообщение: «Пора поливать базилик!».

4. Экономию времени и нервов

Больше не бегаю с гигрометром. Не гадаю. Не переливаю. Растения говорят сами — через датчики.


 Практические советы для вашего умного подоконника

1. Выбирайте правильные пины

 Безопасные (ADC1): GPIO32, 33, 34, 35, 36(VP), 39(VN) Опасные (ADC2): GPIO0, 2, 4, 12, 13, 14, 15, 25, 26, 27

2. Калибруйте датчики

  • Воткните датчик влажности в сухой грунт — запишите значение (например, 800 mV)

  • Воткните в воду — запишите (2200 mV)

  • Теперь знаете диапазон: 800 = сухо, 2200 = болото, 1500 = норма

3. Защищайте от влаги

ESP32 боится воды. Все соединения — в сухом боксе или залейте термоклеем.

4. Используйте внешнее питание

USB от ноутбука может не выдать ток для Wi-Fi + датчиков + ламп. Лучше — блок питания 5V/2A.

5. Локальный бэкап

Если Wi-Fi отвалился — данные не должны теряться. Используйте SPIFFS/LittleFS для записи в память, или отправляйте пачками при восстановлении связи.


 Философский эпилог: растения учат терпению

За три месяца «умной фермы» я понял:

  1. Технологии — не самоцель, а инструмент. Главное — не графики, а здоровые растения.

  2. Данные дают уверенность. Когда видишь цифры, перестаёшь паниковать и делать лишние движения.

  3. Природа сложнее, чем кажется. Даже с датчиками иногда растения «капризничают» по непонятным причинам. И это нормально.

Сейчас на моём подоконнике:

  • 3 куста помидоров черри (уже собрали первый урожай!)

  • Базилик (растёт как сорняк)

  • Салат (срезаем листья каждую неделю)

  • Острый перец (ждём цветения)

И ESP32, который молча делает свою работу: измеряет, отправляет, напоминает.


 Что нужно для старта (бюджет ~1000₽)

Компонент

Цена

Где купить

ESP32 DevKit V1

300₽

AliExpress, Чип и Дип

Датчик влажности почвы FC-28

100₽

AliExpress

Датчик DHT22

250₽

AliExpress

Фоторезистор + резистор 10кОм

50₽

Любой радиомагазин

Провода, макетка

200₽

Местный магазин

Итого

~900₽


 Заключение теоретической части

ESP32 — это не просто «ещё один микроконтроллер». Это мост между миром растений и миром данных.

Когда вы видите, как на графике растёт влажность после полива, или как скачет температура ночью — вы понимаете свои растения лучше. Вы говорите с ними на одном языке.

А если вдруг что-то «замолчит» — вспомните про ADC1 и ADC2. Иногда достаточно переставить один провод, чтобы всё заработало.

Растите с умом! 

 Практика, с которой предлагаю Вам начать

Посмотрим мой кейс в упрощенной конкретике на примере Water Sensor — датчика влаги. Этот датчик выдает 0, если он совсем сухой. Как только засовываешь его полностью специально созданной для этого металлизацией в воду — выдает 4096 в мониторе порта Arduino.

Датчик воды

Датчик воды

Если после того, как Вы окунули датчик воды, вы вытащите его, то на нем останется несколько капель, и этого будет достаточно, чтобы сигнал был не 4096 и не 0, а посередине между этих двух значений. Например, 3769.

Влага на датчике

Влага на датчике

Код для работы устройства:

#include <WiFi.h>#include <WiFiClientSecure.h>//  WiFi credentialsconst char* ssid = "M.....";const char* password = "d.....";//  Server settingsconst char* host = "iot.tfeya.ru";const int httpsPort = 443;//  Your API parameters (secret kept as provided)const char* login = "eug";const char* sensor_id = "1";const char* secret = "001.......";//  ADC pinconst int analogPin = 34;  // GPIO2 / D2//  Certificate fingerprint (optional, see note below)// const char* fingerprint = "YOUR_CERT_FINGERPRINT_HERE";WiFiClientSecure client;void setup() {  Serial.begin(115200);    // Set ADC resolution  analogReadResolution(12);    // Connect to WiFi  Serial.print("Connecting to WiFi");  WiFi.begin(ssid, password);  while (WiFi.status() != WL_CONNECTED) {    delay(500);    Serial.print(".");  }  Serial.println("\n WiFi connected");  Serial.print("IP address: ");  Serial.println(WiFi.localIP());    // Configure SSL (for development: skip verification)  client.setInsecure();  //  Отключает проверку сертификата - только для тестов!  // Для продакшена используйте:  // client.setCACert(root_ca); или client.verify(fingerprint, host);}void loop() {  //  Read analog value  int analogValue = analogRead(analogPin);  int analogVolts = analogReadMilliVolts(analogPin);    Serial.printf(" ADC: %d (%d mV)\n", analogValue, analogVolts);    //  Build URL with dynamic value  String url = "/sensorData.php?login=" + String(login) +               "&sensor_id=" + String(sensor_id) +               "&secret=" + String(secret) +               "&val=" + String(analogValue) +               "&json=1";    //  Send HTTP GET request  if (client.connect(host, httpsPort)) {    Serial.println(" Connected to server");        client.print(String("GET ") + url + " HTTP/1.1\r\n" +                 "Host: " + host + "\r\n" +                 "Connection: close\r\n\r\n");        //  Wait for response (optional: read and print it)    unsigned long timeout = millis();    while (client.available() == 0) {      if (millis() - timeout > 5000) {        Serial.println(" Client timeout");        client.stop();        delay(5000);        return;      }    }        //  Read response (first 500 chars for debug)    Serial.println(" Response:");    int lines = 0;    while (client.available() && lines < 20) {      String line = client.readStringUntil('\n');      Serial.println(line);      lines++;    }        client.stop();    Serial.println(" Data sent successfully\n");  } else {    Serial.println(" Connection failed");  }    //  Wait 5 seconds before next send  delay(5000);}

Этот код отправляет раз в 5 секунд данные на веб-сервер. После наблюдений за тем, как отработал код, получаем следующий график на веб-сервере:

По мере высыхания датчика значение, полученное с него, снижается

По мере высыхания датчика значение, полученное с него, снижается

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

Видно,  сколько раз датчик опускался в стакан с водой

Видно, сколько раз датчик опускался в стакан с водой

По рисунку можно понять, сколько раз датчик окунался в стакан за время наблюдения.

Подключение датчика влаги к ESP32 DEVKIT

Подключение датчика влаги к ESP32 DEVKIT

ссылка на оригинал статьи https://habr.com/ru/articles/1025358/