Умная теплица на ESP32 и Raspberry Pi: автоматизация от А до Я

Собираем умную теплицу на ESP32 и Raspberry Pi: датчики, полив, освещение, автоматика и удалённый контроль.
Всем привет! Если вы, как и я, любите выращивать свои овощи и зелень, но вечная беготня с поливом и проветриванием отнимает всё удовольствие, этот проект — для вас. Сегодня мы соберём с нуля умную теплицу, которая сама будет следить за микроклиматом. В основе — дуэт из ESP32, отвечающего за сбор данных и непосредственное управление, и Raspberry Pi, который станет мозгом системы, хранилищем данных и веб-интерфейсом. Это не просто инструкция по сборке, а рассказ о моём личном опыте, с костылями, ошибками и найденными решениями.
Зачем это нужно? От идеи к прототипу
Идея родилась из простой проблемы: мои томаты в обычной плёночной теплице то сохли, то покрывались конденсатом. Ручное управление форточками и поливом было неэффективно. Нужна была система, которая круглосуточно поддерживала бы идеальные условия: температуру, влажность воздуха и почвы, а также уровень освещённости. ESP32 был выбран за его беспроводную связь, низкое энергопотребление и обилие аналоговых и цифровых пинов. Raspberry Pi — за стабильность, возможность развернуть базу данных и красивый дашборд, доступный из любой точки дома.
Что нам понадобится: железо и софт
Аппаратная часть: * Контроллер управления: ESP32 (я использовал DevKit V1). * Мозг и сервер: Raspberry Pi (подойдёт любая модель, начиная с 3B+, у меня — Pi 4 с 2 ГБ ОЗУ). * Датчики: * DHT22 (DHT11) — температура и влажность воздуха. * Capacitive Soil Moisture Sensor — влажность почвы (аналоговый). * Фоторезистор или цифровой датчик освещённости BH1750. * Исполнительные устройства: * Сервопривод (SG90) для автоматической форточки. * Реле модуль на 5В для управления помпой полива. * Прочее: Макетная плата, провода «папа-папа», резисторы, блок питания 5В для ESP32, помпа для воды (12В), транзистор/драйвер для помпы (если реле не поддерживает ток помпы).
Программный стек: * На ESP32: Arduino IDE или PlatformIO, библиотеки для датчиков (DHT sensor library, Adafruit_Sensor, BH1750). * На Raspberry Pi: ОС Raspberry Pi OS Lite, Mosquitto (MQTT-брокер), InfluxDB (база данных временных рядов), Grafana (визуализация), Node-RED (логика и веб-интерфейс). Мы пойдём этим путём, как наиболее гибким.
Часть 1: Развёртывание инфраструктуры на Raspberry Pi
Сначала подготовим «мозговой центр». Подключаемся к Raspberry Pi по SSH.
Установка и настройка MQTT-брокера (Mosquitto)
MQTT — это лёгкий протокол обмена сообщениями, идеальный для IoT. ESP32 будет публиковать в него данные, а Node-RED — подписываться и обрабатывать их.
# Обновляем список пакетов
sudo apt update && sudo apt upgrade -y
# Устанавливаем Mosquitto и клиенты
sudo apt install -y mosquitto mosquitto-clients
# Включаем и запускаем службу
sudo systemctl enable mosquitto
sudo systemctl start mosquitto
Проверим, что брокер работает:
# В одной сессии терминала подписываемся на тестовый топик
mosquitto_sub -h localhost -t "test/topic"
# В другой сессии (новое SSH-окно) публикуем сообщение
mosquitto_pub -h localhost -t "test/topic" -m "Hello, Smart Greenhouse!"
В первом окне должно появиться Hello, Smart Greenhouse!. Если нет — проверьте статус службы sudo systemctl status mosquitto.
Типичная ошибка: Брандмауэр на Pi может блокировать порт 1883 (MQTT). Если подключаться будут с других устройств в сети, откройте его: sudo ufw allow 1883.
Установка InfluxDB и Grafana
InfluxDB будет хранить историю всех измерений, а Grafana — рисовать красивые графики.
# Добавляем репозитории и ключи для InfluxDB 2.x (более новая версия)
wget -q https://repos.influxdata.com/influxdata-archive.key
echo '23a1c8836f0afc5ed24e0486339d7cc8f6790b83886c4c96995b88a061c5bb5d influxdata-archive.key' | sha256sum -c && cat influxdata-archive.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata.gpg > /dev/null
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list
# То же самое для Grafana
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
# Устанавливаем
sudo apt update
sudo apt install -y influxdb2 grafana
# Запускаем и добавляем в автозагрузку
sudo systemctl enable influxdb grafana-server
sudo systemctl start influxdb grafana-server
Теперь нужно настроить InfluxDB через веб-интерфейс. Откройте в браузере http://<ваш_ip_raspberry_pi>:8086. Создайте аккаунт, организацию (smartgreenhouse) и бакет (sensor_data). Запомните сгенерированный токен (Token) — он понадобится позже.
Grafana будет доступна на http://<ваш_ip_raspberry_pi>:3000. Стандартные логин/пароль: admin/admin. Первым делом добавьте источник данных (Data Source) — InfluxDB (версия Flux). URL: http://localhost:8086. Укажите организацию, бакет и токен.
Установка Node-RED
Node-RED — это визуальный инструмент для программирования потоков, который идеально подходит для быстрой сборки логики умного дома.
# Установка Node.js и Node-RED (официальный скрипт)
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) --confirm-install --confirm-pi
# Делаем Node-RED службой и запускаем
sudo systemctl enable nodered.service
sudo systemctl start nodered.service
Node-RED будет доступен на http://<ваш_ip_raspberry_pi>:1880. Позже мы вернёмся к нему для создания логики.
Часть 2: Прошивка и настройка ESP32
Теперь займёмся «нервной системой» теплицы. Подключаем датчики к ESP32: * DHT22: DATA -> GPIO4, VCC -> 3.3V, GND -> GND. * Влажность почвы: AO -> GPIO34 (это аналоговый пин), VCC -> 3.3V, GND -> GND. * Фоторезистор: Через делитель напряжения к GPIO35. * Сервопривод: Signal -> GPIO13, VCC -> 5V, GND -> GND. * Реле: IN -> GPIO12, VCC -> 5V, GND -> GND.
Важный момент: Аналоговые пины ESP32 (GPIO34, 35, 36, 39) работают только на вход и не имеют подтяжки. Это нормально для датчиков.
Устанавливаем в Arduino IDE плату ESP32 Dev Module и библиотеки через менеджер библиотек: DHT sensor library, PubSubClient (для MQTT), BH1750 (если используете).
Вот основа прошивки (sketch) для ESP32. Заполните своими данными WiFi и MQTT.
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// Конфигурация WiFi
const char* ssid = "ВАША_СЕТЬ_SSID";
const char* password = "ВАШ_ПАРОЛЬ";
// Конфигурация MQTT
const char* mqtt_server = "IP_ВАШЕГО_RASPBERRY_PI"; // Например, "192.168.1.100"
const char* mqtt_topic_temp = "greenhouse/sensors/temperature";
const char* mqtt_topic_humidity = "greenhouse/sensors/humidity";
const char* mqtt_topic_soil = "greenhouse/sensors/soil_moisture";
const char* mqtt_topic_light = "greenhouse/sensors/light";
// Пины
#define DHTPIN 4
#define DHTTYPE DHT22
#define SOIL_MOISTURE_PIN 34
#define LIGHT_SENSOR_PIN 35
#define SERVO_PIN 13
#define RELAY_PIN 12
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
Serial.println("Подключение к WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi подключен");
}
void reconnect_mqtt() {
while (!client.connected()) {
Serial.print("Попытка подключения к MQTT...");
if (client.connect("ESP32GreenhouseClient")) {
Serial.println("подключено");
} else {
Serial.print("ошибка, rc=");
Serial.print(client.state());
Serial.println(" пробуем снова через 5 секунд");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // Реле выключено по умолчанию (активно-низкий уровень, зависит от модуля)
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void loop() {
if (!client.connected()) {
reconnect_mqtt();
}
client.loop();
// Чтение данных с DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Чтение аналогового значения влажности почвы (0-4095)
int soilMoistureRaw = analogRead(SOIL_MOISTURE_PIN);
// Конвертация в проценты (калибровка под ваш датчик!)
int soilMoisturePercent = map(soilMoistureRaw, 4095, 1500, 0, 100); // Примерные значения! Калибруйте!
soilMoisturePercent = constrain(soilMoisturePercent, 0, 100);
// Чтение освещённости
int lightValue = analogRead(LIGHT_SENSOR_PIN);
// Публикация в MQTT
if (!isnan(temperature)) {
client.publish(mqtt_topic_temp, String(temperature).c_str());
}
if (!isnan(humidity)) {
client.publish(mqtt_topic_humidity, String(humidity).c_str());
}
client.publish(mqtt_topic_soil, String(soilMoisturePercent).c_str());
client.publish(mqtt_topic_light, String(lightValue).c_str());
Serial.printf("Темп: %.1fC, Влаж: %.1f%%, Почва: %d%%, Свет: %dn", temperature, humidity, soilMoisturePercent, lightValue);
delay(10000); // Отправляем данные каждые 10 секунд
}
Критически важный шаг — калибровка датчика влажности почвы! Запустите скетч, который выводит сырое значение (soilMoistureRaw) в монитор порта. Запишите значение для абсолютно сухой почвы (датчик в воздухе) и для погружённого в стакан с водой. Подставьте эти значения в функцию map(). Без этого проценты будут бессмысленными.
Часть 3: Создание логики в Node-RED
Открываем Node-RED (http://<ip_pi>:1880). Нам нужно создать поток, который:
1. Получает MQTT-сообщения от ESP32.
2. Записывает их в InfluxDB.
3. Принимает решения (например, если почва сухая — включить полив).
4. Предоставляет веб-дашборд.
Добавьте ноды:
* mqtt in (подключитесь к localhost:1883, топик greenhouse/sensors/#).
* function (для разбора сообщений и формирования объекта данных).
* influxdb out (настройте соединение с вашим бакетом в InfluxDB).
* dashboard ноды (gauge, chart, switch) для визуализации.
* function для логики (если soil_moisture < 30 -> отправить 1 на топик greenhouse/actuators/pump).
Пример функции для разбора данных:
// Нода Function: Parse Sensor Data
var topic = msg.topic;
var payload = parseFloat(msg.payload);
var measurement = {};
if (topic.includes('temperature')) {
measurement.temperature = payload;
} else if (topic.includes('humidity')) {
measurement.humidity = payload;
} else if (topic.includes('soil')) {
measurement.soil_moisture = payload;
} else if (topic.includes('light')) {
measurement.light = payload;
}
msg.payload = measurement;
return msg;
В ноде influxdb out укажите поле (field) как msg.payload. Тег (tag) можно добавить, например, location: greenhouse.
Для управления помпой создайте ещё один поток: mqtt in на топик greenhouse/actuators/pump -> function (для обработки команды) -> rpi gpio out (выбрать GPIO12). Не забудьте в настройках Node-RED разрешить доступ к GPIO (в файле settings.js).
Часть 4: Тестирование и проверка результата
После развёртывания всей системы проведите комплексную проверку:
- Проверка связи: В Node-RED добавьте ноду
debugк выходу MQTT-ноды. Убедитесь, что сообщения от ESP32 приходят. В терминале Pi можно слушать топик:mosquitto_sub -h localhost -t "greenhouse/sensors/#" -v. - Проверка записи в БД: В веб-интерфейсе InfluxDB перейдите в Data Explorer. Выполните простой запрос:
flux from(bucket: "sensor_data") |> range(start: -1h) |> filter(fn: (r) => r._measurement == "sensor_data")Должны появиться записи. - Проверка дашборда: Откройте созданную вами страницу дашборда Node-RED (обычно
http://<ip_pi>:1880/ui). Убедитесь, что значения датчиков отображаются и обновляются. - Тест исполнительных устройств:
- На дашборде Node-RED нажмите переключатель помпы. Должно щёлкнуть реле. Предварительно убедитесь, что помпа не в воде и не подключена к питанию 12В во время теста!
- Для сервопривода создайте слайдер, отправляющий угол (0-180) в топик
greenhouse/actuators/vent. Сервопривод должен поворачиваться.
- Тест логики: Полейте датчик влажности почвы из пульверизатора. Сработает ли автоматическое отключение полива? Имитируйте высокую температуру, отправив вручную в топик
greenhouse/sensors/temperatureзначение 40. Откроется ли форточка?
Типичные проблемы на этом этапе:
* Нет данных в InfluxDB: Проверьте токен и правильность имени бакета в ноде influxdb out. Смотрите лог Node-RED (вкладка Debug).
* ESP32 не подключается к MQTT: Проверьте IP-адрес Pi в скетче, убедитесь, что брокер запущен, и нет блокировки брандмауэром.
* Сервопривод дёргается: Ему может не хватать питания. Используйте внешний источник 5В-6В и общий GND с ESP32.
Заключение и дальнейшее развитие
Мы построили полноценный каркас умной теплицы. Система уже работоспособна, но это только начало. Куда можно развивать проект дальше?
- Добавьте камеру для наблюдения за растениями. Для этого отлично подойдёт ESP32-CAM — недорогой модуль с камерой, который можно интегрировать в эту же систему через MQTT. У меня есть отдельная статья про это: ESP32-CAM: Веб-камера и распознавание лиц своими руками.
- Повысьте точность измерений. Вместо набора отдельных датчиков можно использовать компактные многофункциональные платы. О выборе датчиков я писал здесь: [ESP32 и три в одном: измеряем температуру, влажность и давление на одной плате](/esp32-i-tri-v-odnom-izmeriaem-temperaturu-vlazhn
Понравилась статья?
Поставьте лайк и сохраните полезный материал в закладки.
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Мониторинг качества воздуха: CO2, PM2.5 и VOC своими руками на ESP32
DIY ИБП для Raspberry Pi: как не дать умному дому «уснуть» при отключении света
Умный аквариум своими руками: автодолив, контроль температуры и освещение по расписанию
Умная кормушка для кота на ESP32: кормим питомца по расписанию
Как печатать резьбу на 3D-принтере: зазоры, допуски и настройки для болтов и гаек
DIY умный звонок с камерой на ESP32-CAM и Home Assistant