История о том, как микроконтроллер за 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 credentials
const char* ssid = "M.....";
const char* password = "d.....";

//  Server settings
const 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 pin
const 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

Комментарии (4)


  1. p0isk
    19.04.2026 20:59

    Как только засовываешь его полностью специально созданной для этого металлизацией в воду

    Надолго датчика хватает? Он резистивный или ёмкостной?


  1. beatleboy
    19.04.2026 20:59


    Тоже уже примерно год занимаюсь автоматизацией теплицы и полива газона
    Во многом более простой и мощный способ привязать ESP32 к HomeAssistant. У него есть ряд несомненных плюсов, можно собирать данные с различных датчиков строить автоматизации как через UI так и через скрипты (нейросети неплохо пишут yaml конфиги автоматизаций под HA), графики с сенсоров это фича из коробки в HA

    На данный момент сделал так, что все умные датчики, розетки и все что можно добавить я добавил в локальный HA.
    Для теплицы сделал умное открывание окна для вентиляции в жаркую погоду, сценарий в HA смотрит реальную температуру теплицы, и если требуется начинает проветривание открывая окно, учитывается также погода на улице, например в дождь или в большой ветер окно не будет открываться на все 100%

    Также для газона построил свой контроллер полива, на Raspberry PI Zero W2.
    Контррллер полива имеет свой UI и бекенд и берет данные из HA, у меня есть два датчика влажности от Tuya в HA, и данные о погоде (яндекс погода для умного дома)
    Раз в час через локальную LLM принимается решение о поливе, Нейронка видя все данные + прогноз на ближайшие 12 часов решает стоит включать полив или нет. Например если влажность почвы газона низкая и казалось бы нужно полить но через час начнется дождь то нейросеть не будет поливать а просто дождется дождя, после чего померит влажность и если потребуется то дольет
    Также она не будет поливать в момент жары и сильного солнца, чтобы не пожечь траву, ну и т.д., условия задаются через промпт.

    Пример решения по поливу газона от LLM
    Пример решения по поливу газона от LLM




  1. PoksPoks
    19.04.2026 20:59

    Сначала ты просто хочешь вырастить базилик на подоконнике, а потом у тебя уже телеграм-бот, графики, сервер и микроконтроллер следит, не пересох ли щавель. Киберпанк действительно не подвёл


  1. dsrk_dev
    19.04.2026 20:59

    У меня zigbee датчики прокинуты в home assistant. Но по факту они не оч точные. Поливал всё сегодня, стоят на одном подоконнике, и данные сильно расходятся. Освещаю фито лентами подключенным через zigbee розетку, и это прям рабочая штука. Если освещение ниже 1000, свет включается, ниже выключается, в период с 10 утра до 10 вечера. Для полива купил wifi поливалку, но лениво стало заморачиваться, там всего пара выводов, надо как-то растения в группы организовывать, подбирать колво и частоту...