История о том, как микроконтроллер за 500 рублей помог вырастить клубнику ранней весной, и почему важно знать «анатомию» чипа
Пролог: Когда руки тянутся к земле, а за окномь уже вроде и весна, но все еще случается минус 10
Живу в обычной квартире. Места мало, света ещё меньше. Но хочется своего — без пестицидов, свеженького. Решил организовать домашнюю ферму на подоконнике: клубника, базилик, салат, щавель, лук.
Если более глобально: в Мире наблюдается перенасыщение людьми, еды на всех не хватит, Дальний Восток от Москвы далеко, а ездить за 80 км от МКАД очень часто ну точно неохота. Если летом можно использовать балкон, где много натурального солнца, то зимой и в переходные периоды (весна и осень) есть совсем маленький клочок на территории квартиры, где то ли горизонтальную ферму делать, то ли вообще вертикальную. Или гибрид вертикальной и горизонтальной.
Есть еще нюанс — 4-5 прямоугольных горшков, как показал мой опыт, Вам явно не хватит. Но этого уже будет достаточно, чтобы было некоторое количество урожая к Вашему столу. Не лучше ли закупать микрозелень и клубнику в магазина, где ее «везут с Краснодара»? Ну есть проблема — в этом капитализме нас повсюду обманывают: искусственное дозревание, пестициды и дешевые эффективные добавки, не лучшее качество воздуха при выращивании в теплице и так далее.
Поэтому если бумеры и поколение X ненавидели городское фермерство за то, что в загазованных условиях ты пытаешься что-то ростить, то сегодня все сложно. В небоскребе на 63 этаже вообще может быть воздух чище, чем на загородном участке в 3 метрах от забора. Все ситуативно, но на помощь приходят инструменты и средства Умного Дома и Интернета вещей. Именно сегодня наиболее актуально автоматизировать и роботизировать домашние фермы.
Если подоконник маленький, вообще кому-то актуальнее может быть сделать такое:
А, начиная с этой точки, уже думать, снизить ли расход электричества на освещение путем меньшего светового потока, использования солнечных элементов или же отраженных солнечных лучей.
Учитывая, что в прошлом я не только Главный специалист по робототехнике из Кванториума Мосгормаш, я нашел в этом явную золотую жилу, которую можно интересно и своеобразно решить в техническом плане. А также относительно последовательно, то есть я лично устал от этих инженерных «ставь задачу и цель, пиши ТЗ, делай расчет приход/расход, проектируй и, затем, разрабатывай». Я пошел по пути «есть освещение, идем дальше к поливу… есть полив – думаем о том, что и почему погибает…». Ну и тут должна быть дальнейшая логическая цепочка вплоть до сравнения нейросетью совокупности данных с разных ферм с учетом значений, получаемых с датчиков. Чтобы понять, почему у хорошего фермера компостные бананы спасают урожай, а у начинающего любителя единственная клубничка вообще перестала плодоносить.
Если собрать полный набор датчиков, то в итоге можно очень четко и конкретно выявить отличия между успешным урожаем и еле живыми ростками.
Купил самые обычные лампы и холодного, и теплого оттенков, грунт накопал просто на улице, нашел под это дело горшки. Посадил. И начался детектив:
-
Почему один куст растёт как на дрожжах, а другой чахнет?
-
Хватает ли света?
-
Не перелил ли я?
-
Может, температура ночью падает критически?
-
Реально надо удобрять раз в 2 недели? Чем? Дорогим покупным удобрением, либо же бананами из миксера?
Рукой не пощупаешь — растения не говорят. А если и говорят, то слишком поздно — когда уже желтеют листья или растение просто медленно и бесповоротно умирает за 3-4 дня.
Идея: а что если поставить «сторожа», который 24/7 будет следить за условиями и писать отчёты?
То есть освещение сделано быстро на умной розетке, полив тоже дело легкое — оросительная система + водяная помпа с достаточным создаваемым давлением. Если течет слабо — нужно либо более пробивную помпу, либо параллелить водные каналы, что также я решил сделать. Старый 3D-принтер пока молча курит в сторонке и разрешил нацепить на себя лампочку, вот он – настоящий киберпанк, который мы заслужили.
Знакомьтесь: ESP32 — мой новый агроном
Выбрал ESP32 по трём причинам:
-
Дешёвый — около $3-6
-
С Wi-Fi — может отправлять данные прямо на сервер
-
С аналоговыми входами — можно подключить датчики
Что я подключил :
|
Датчик |
Что измеряет |
Зачем |
|---|---|---|
|
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 для записи в память, или отправляйте пачками при восстановлении связи.
Философский эпилог: растения учат терпению
За три месяца «умной фермы» я понял:
-
Технологии — не самоцель, а инструмент. Главное — не графики, а здоровые растения.
-
Данные дают уверенность. Когда видишь цифры, перестаёшь паниковать и делать лишние движения.
-
Природа сложнее, чем кажется. Даже с датчиками иногда растения «капризничают» по непонятным причинам. И это нормально.
Сейчас на моём подоконнике:
-
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.1rn" +
"Host: " + host + "rn" +
"Connection: closernrn");
// 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 successfullyn");
} else {
Serial.println(" Connection failed");
}
// Wait 5 seconds before next send
delay(5000);
}
Этот код отправляет раз в 5 секунд данные на веб-сервер. После наблюдений за тем, как отработал код, получаем следующий график на веб-сервере:
Если посмотреть больший временной интервал, будет видно, как сначала были нулевые значения, потом датчик был погружен в стакан и получилось 4095, а затем значение стало опускаться в сторону нуля при последовательном высыхании датчика.
По рисунку можно понять, сколько раз датчик окунался в стакан за время наблюдения.
Автор: technofeya


