Здесь могла бы быть реклама
Она помогает блогу развиваться.
Кажется, сегодня она немного загрустила.

Главная страница » DIY проекты » Умная теплица на ESP32 и Raspberry Pi: автоматизация от А до Я
Умная теплица на ESP32 и Raspberry Pi: автоматизация от А до Я
DIY проекты

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

31.03.2026 217
Умная теплица на 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: Тестирование и проверка результата

После развёртывания всей системы проведите комплексную проверку:

  1. Проверка связи: В Node-RED добавьте ноду debug к выходу MQTT-ноды. Убедитесь, что сообщения от ESP32 приходят. В терминале Pi можно слушать топик: mosquitto_sub -h localhost -t "greenhouse/sensors/#" -v.
  2. Проверка записи в БД: В веб-интерфейсе InfluxDB перейдите в Data Explorer. Выполните простой запрос: flux from(bucket: "sensor_data") |> range(start: -1h) |> filter(fn: (r) => r._measurement == "sensor_data") Должны появиться записи.
  3. Проверка дашборда: Откройте созданную вами страницу дашборда Node-RED (обычно http://<ip_pi>:1880/ui). Убедитесь, что значения датчиков отображаются и обновляются.
  4. Тест исполнительных устройств:
    • На дашборде Node-RED нажмите переключатель помпы. Должно щёлкнуть реле. Предварительно убедитесь, что помпа не в воде и не подключена к питанию 12В во время теста!
    • Для сервопривода создайте слайдер, отправляющий угол (0-180) в топик greenhouse/actuators/vent. Сервопривод должен поворачиваться.
  5. Тест логики: Полейте датчик влажности почвы из пульверизатора. Сработает ли автоматическое отключение полива? Имитируйте высокую температуру, отправив вручную в топик greenhouse/sensors/temperature значение 40. Откроется ли форточка?

Типичные проблемы на этом этапе: * Нет данных в InfluxDB: Проверьте токен и правильность имени бакета в ноде influxdb out. Смотрите лог Node-RED (вкладка Debug). * ESP32 не подключается к MQTT: Проверьте IP-адрес Pi в скетче, убедитесь, что брокер запущен, и нет блокировки брандмауэром. * Сервопривод дёргается: Ему может не хватать питания. Используйте внешний источник 5В-6В и общий GND с ESP32.

Заключение и дальнейшее развитие

Мы построили полноценный каркас умной теплицы. Система уже работоспособна, но это только начало. Куда можно развивать проект дальше?

  1. Добавьте камеру для наблюдения за растениями. Для этого отлично подойдёт ESP32-CAM — недорогой модуль с камерой, который можно интегрировать в эту же систему через MQTT. У меня есть отдельная статья про это: ESP32-CAM: Веб-камера и распознавание лиц своими руками.
  2. Повысьте точность измерений. Вместо набора отдельных датчиков можно использовать компактные многофункциональные платы. О выборе датчиков я писал здесь: [ESP32 и три в одном: измеряем температуру, влажность и давление на одной плате](/esp32-i-tri-v-odnom-izmeriaem-temperaturu-vlazhn

Понравилась статья?

Поставьте лайк и сохраните полезный материал в закладки.

Комментарии (0)
Добавить комментарий
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Мониторинг качества воздуха: CO2, PM2.5 и VOC своими руками на ESP32
DIY проекты
31.03.2026
Мониторинг качества воздуха: CO2, PM2.5 и VOC своими руками на ESP32
Соберите систему мониторинга качества воздуха своими руками на ESP32. Измеряйте CO2, PM2.5 и VOC. Подробное руководство: схема, код, интеграция с Home Assistant.
DIY ИБП для Raspberry Pi: как не дать умному дому «уснуть» при отключении света
DIY проекты
31.03.2026
DIY ИБП для Raspberry Pi: как не дать умному дому «уснуть» при отключении света
Пошаговое руководство по сборке источника бесперебойного питания для Raspberry Pi на аккумуляторе 18650. Гарантируем корректное выключение при отключении электричества.
Умный аквариум своими руками: автодолив, контроль температуры и освещение по расписанию
DIY проекты
31.03.2026
Умный аквариум своими руками: автодолив, контроль температуры и освещение по расписанию
Собираем умный аквариум с автодоливом, контролем температуры и освещением по расписанию.
Умная кормушка для кота на ESP32: кормим питомца по расписанию
DIY проекты
31.03.2026
Умная кормушка для кота на ESP32: кормим питомца по расписанию
Пошаговый проект умной кормушки для кота на ESP32 с Wi-Fi и веб-интерфейсом. Собираем своими руками: схема, код, сборка. Автоматическое кормление по расписанию.
Как печатать резьбу на 3D-принтере: зазоры, допуски и настройки для болтов и гаек
DIY проекты
09.09.2026
Как печатать резьбу на 3D-принтере: зазоры, допуски и настройки для болтов и гаек
Практическое руководство по печати резьбы на FDM-принтере: расчёт зазоров и допусков для PLA, PETG и ABS, настройки слайсера, калибровочная печать и типичные ошибки.
DIY умный звонок с камерой на ESP32-CAM и Home Assistant
DIY проекты
31.03.2026
DIY умный звонок с камерой на ESP32-CAM и Home Assistant
Собираем умный дверной звонок на ESP32-CAM с камерой, уведомлениями и интеграцией в Home Assistant.

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