Умный подоконник: как 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 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("  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) ", 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  " +                  "Host: " + host + "  " +                  "Connection: close    ");          //  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(' ');       Serial.println(line);       lines++;     }          client.stop();     Serial.println(" Data sent successfully ");   } else {     Serial.println(" Connection failed");   }      //  Wait 5 seconds before next send   delay(5000); }  

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

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

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

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

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

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

Телеграм: t.me/ainewsline

Источник: habr.com

Комментарии: