Датчики влажности для Arduino: лучшие проекты с автополивом
Для кого эта статья:
- Новички и любители в области электроники и программирования на Arduino
- Опыты профессионалы, интересующиеся проектами IoT и автоматизацией
Преподаватели и студенты, занимающиеся обучением в области технологий и робототехники
Arduino и датчики влажности — идеальный дуэт для создания проектов, решающих реальные задачи от автополива растений до профессиональных систем мониторинга. Если вы когда-либо забывали полить любимый фикус или, наоборот, губили растения чрезмерным увлажнением — пора автоматизировать этот процесс! В этой статье я разберу пять полноценных проектов с датчиками влажности: от простых схем для новичков до продвинутых систем с мобильными уведомлениями. Каждый проект сопровождается электронными схемами, кодом и советами по отладке. 🌱💧
Интересуетесь созданием собственных электронных устройств? Рекомендую также освоить Обучение Python-разработке от Skypro. Python идеально дополняет работу с Arduino, особенно в проектах с обработкой данных от датчиков. Вы сможете создавать серверные приложения для ваших IoT-устройств, анализировать показания влажности и строить продвинутые системы управления с понятным веб-интерфейсом.
Обзор датчиков влажности для Arduino-проектов
Датчики влажности для Arduino делятся на два основных типа: датчики влажности почвы и датчики влажности воздуха. Каждый тип имеет свои особенности подключения, диапазоны измерений и сферы применения.
Для измерения влажности почвы чаще всего используют резистивные датчики (FC-28, YL-69) или емкостные датчики. Резистивные работают по принципу измерения сопротивления между двумя электродами, погруженными в почву. Чем выше влажность, тем ниже сопротивление. Емкостные датчики работают по принципу измерения диэлектрической проницаемости почвы, которая меняется в зависимости от содержания воды.
Для измерения влажности воздуха стандартом стали датчики серии DHT (DHT11, DHT22) и BME280. Они обеспечивают измерение не только влажности, но и температуры воздуха.
| Тип датчика | Модель | Диапазон измерений | Точность | Особенности |
|---|---|---|---|---|
| Влажность почвы (резистивный) | FC-28 | 0-100% (относительная) | ±5% | Низкая цена, подвержен коррозии |
| Влажность почвы (емкостной) | Capacitive Soil Moisture Sensor v1.2 | 0-100% (относительная) | ±3% | Устойчив к коррозии, долговечный |
| Влажность воздуха | DHT11 | 20-80% RH | ±5% RH | Бюджетный, для несложных проектов |
| Влажность воздуха | DHT22 | 0-100% RH | ±2% RH | Высокая точность, более широкий диапазон |
| Комбинированный | BME280 | 0-100% RH | ±3% RH | Измеряет влажность, температуру и давление |
При выборе датчика важно учитывать:
- Условия эксплуатации: для уличного применения выбирайте датчики с защитой от влаги и пыли
- Питание: некоторые датчики требуют стабильного питания 3.3В, другие работают от 5В
- Интерфейс: аналоговый или цифровой (I2C, SPI, OneWire)
- Долговечность: резистивные датчики почвы подвержены коррозии при постоянной эксплуатации
Базовое подключение резистивного датчика влажности почвы к Arduino:
- VCC датчика подключается к 5В Arduino
- GND датчика подключается к GND Arduino
- Аналоговый выход (AO) подключается к аналоговому входу Arduino (например, A0)
Простой скетч для чтения данных:
int soilMoisturePin = A0; // Аналоговый пин для подключения датчика
void setup() {
Serial.begin(9600); // Инициализация Serial-порта
}
void loop() {
int moistureValue = analogRead(soilMoisturePin); // Считываем аналоговое значение
int moisturePercent = map(moistureValue, 0, 1023, 100, 0); // Преобразуем в проценты
Serial.print("Влажность почвы: ");
Serial.print(moisturePercent);
Serial.println("%");
delay(1000); // Пауза 1 секунда
}

Умная система автополива комнатных растений
Антон Петров, инженер-разработчик IoT-систем
Одним поздним вечером у меня произошло озарение, когда я вернулся после двухнедельного отпуска и обнаружил, что мои комнатные растения практически погибли без полива. Соседка, которая обещала их поливать, забыла об этом. В тот момент я понял, что могу решить эту проблему сам.
Через неделю экспериментов с Arduino и датчиками влажности, я создал свою первую автоматическую систему полива. Начал с одного горшка с любимым фикусом. Первая версия была примитивной – датчик влажности в почве, Arduino Nano, и маленький насос от аквариума. Но даже эта система спасла мой фикус, когда я уехал на конференцию в следующем месяце.
Постепенно я усовершенствовал систему, добавив WiFi-модуль и уведомления на телефон. Сейчас моя система обслуживает все 12 растений в квартире, включая капризные орхидеи. За два года использования я ни разу не столкнулся с проблемой пересыхания или переувлажнения почвы.
Создание умной системы автополива комнатных растений — идеальный стартовый проект для знакомства с датчиками влажности и Arduino. Система автоматически контролирует уровень влажности почвы и активирует насос, когда растению требуется полив. 🌿
Необходимые компоненты:
- Arduino UNO или Nano
- Датчик влажности почвы YL-69 или FC-28
- Реле 5В
- Насос для воды 12В
- Блок питания 12В для насоса
- Соединительные провода
- Шланги для воды
- Емкость для воды
Шаг 1: Подключение датчика влажности
- Подключите VCC датчика к 5В на Arduino
- GND датчика к GND Arduino
- Аналоговый выход датчика к пину A0 на Arduino
Шаг 2: Подключение реле и насоса
- Подключите VCC реле к 5В Arduino
- GND реле к GND Arduino
- Сигнальный пин реле к цифровому пину D7 Arduino
- Подключите насос к нормально разомкнутому контакту реле
- Подключите внешний источник питания 12В к реле и насосу
Важно помнить, что силовую часть (насос и его питание) нужно изолировать от схемы Arduino, чтобы избежать помех и повреждения микроконтроллера.
Шаг 3: Программирование
#define SOIL_MOISTURE_PIN A0
#define PUMP_PIN 7
// Пороговые значения влажности в процентах
const int DRY_THRESHOLD = 30; // Ниже этого значения почва считается сухой
const int WET_THRESHOLD = 70; // Выше этого значения почва считается влажной
void setup() {
Serial.begin(9600);
pinMode(PUMP_PIN, OUTPUT);
digitalWrite(PUMP_PIN, LOW); // Насос выключен по умолчанию
}
void loop() {
// Считываем значение с датчика влажности
int moistureRaw = analogRead(SOIL_MOISTURE_PIN);
// Преобразуем в проценты (0-100%)
// Примечание: значения map могут потребовать калибровки для вашего датчика
int moisturePercent = map(moistureRaw, 0, 1023, 100, 0);
Serial.print("Влажность почвы: ");
Serial.print(moisturePercent);
Serial.println("%");
// Логика управления насосом
if (moisturePercent < DRY_THRESHOLD) {
// Если почва сухая, включаем насос
Serial.println("Почва сухая, включаем полив");
digitalWrite(PUMP_PIN, HIGH);
delay(3000); // Поливаем 3 секунды
digitalWrite(PUMP_PIN, LOW);
Serial.println("Полив завершен");
delay(30000); // Ждем, чтобы вода впиталась и датчик дал новые показания
} else if (moisturePercent > WET_THRESHOLD) {
// Если почва слишком влажная, ничего не делаем
Serial.println("Почва влажная, полив не требуется");
} else {
// Нормальная влажность
Serial.println("Влажность в норме");
}
delay(10000); // Проверяем каждые 10 секунд
}
Шаг 4: Калибровка системы
После загрузки кода выполните калибровку датчика:
- Измерьте показания датчика в сухой почве и запишите значение
- Измерьте показания датчика во влажной почве и запишите значение
- Скорректируйте функцию map() в коде, используя полученные значения
- Настройте пороговые значения DRYTHRESHOLD и WETTHRESHOLD под потребности конкретного растения
Шаг 5: Финальная сборка
- Поместите датчик влажности в почву (на глубину около 1/3 от высоты горшка)
- Расположите емкость с водой рядом с растением
- Подключите один конец шланга к насосу, другой поместите в почву
- Запустите систему и наблюдайте за работой
Для дополнительной функциональности можно добавить:
- ЖК-дисплей для отображения текущей влажности
- Светодиодные индикаторы состояния
- Кнопки для ручного запуска полива
- Датчик уровня воды в резервуаре
Метеостанция для мониторинга влажности воздуха
Домашняя метеостанция на основе Arduino позволяет собирать и анализировать данные о микроклимате в помещении или на улице. Для мониторинга влажности воздуха идеально подойдут датчики DHT22 или BME280, обеспечивающие высокую точность измерений. 🌡️
Елена Соколова, преподаватель робототехники
В нашей школе проблема с постоянной сухостью воздуха стала критичной в зимний период. Дети жаловались на сухость в горле, а учителя на постоянную усталость. Администрация разводила руками – "так работает система отопления".
Я предложила ученикам старших классов создать сеть мини-метеостанций на Arduino с датчиками влажности. Проект занял две недели. Мы разместили 15 устройств в разных кабинетах школы. Каждая метеостанция измеряла температуру и влажность, отправляя данные на центральный сервер.
Результаты ошеломили даже меня: в некоторых кабинетах влажность опускалась до 15-20% при норме 40-60%. Наши данные стали неопровержимым аргументом для администрации. В школе установили увлажнители воздуха, а наш проект перерос в постоянно действующую систему мониторинга климата. Через месяц после внедрения системы увлажнения, учителя отметили снижение числа пропусков по болезни на 27%.
Компоненты для базовой метеостанции:
- Arduino UNO или Nano
- Датчик DHT22 (или DHT11 для более бюджетного варианта)
- ЖК-дисплей 16x2 с I2C-модулем
- Макетная плата и соединительные провода
- Корпус (можно распечатать на 3D-принтере)
- Опционально: модуль часов реального времени DS3231
- Опционально: модуль SD-карты для логирования данных
Шаг 1: Подключение датчика DHT22
- VCC датчика к 5В Arduino
- GND датчика к GND Arduino
- DATA пин к D2 на Arduino
- Между VCC и DATA поместите подтягивающий резистор 4.7-10 кОм
Шаг 2: Подключение LCD-дисплея с I2C
- VCC к 5В Arduino
- GND к GND Arduino
- SDA к пину A4 Arduino
- SCL к пину A5 Arduino
Шаг 3: Программирование базовой метеостанции
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 2 // Пин для подключения DHT22
#define DHTTYPE DHT22 // Тип датчика (DHT22 или DHT11)
// Инициализация дисплея I2C с адресом 0x27, 16 символов, 2 строки
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHTPIN, DHTTYPE);
// Переменные для хранения измерений
float humidity;
float temperature;
// Переменные для отслеживания изменений
float lastHumidity = -1;
float lastTemperature = -1;
void setup() {
Serial.begin(9600);
dht.begin();
// Инициализация дисплея
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Метеостанция");
lcd.setCursor(0, 1);
lcd.print("Запуск...");
delay(2000);
lcd.clear();
}
void loop() {
// Считываем влажность и температуру
humidity = dht.readHumidity();
temperature = dht.readTemperature();
// Проверяем, получены ли действительные показания
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Ошибка чтения датчика DHT!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ошибка датчика!");
delay(2000);
return;
}
// Выводим значения в Serial-монитор
Serial.print("Влажность: ");
Serial.print(humidity);
Serial.print("%\t");
Serial.print("Температура: ");
Serial.print(temperature);
Serial.println("°C");
// Обновляем дисплей только при изменении значений
if (humidity != lastHumidity || temperature != lastTemperature) {
lastHumidity = humidity;
lastTemperature = temperature;
lcd.clear();
// Вывод температуры
lcd.setCursor(0, 0);
lcd.print("Темп: ");
lcd.print(temperature, 1);
lcd.print(" C");
// Вывод влажности
lcd.setCursor(0, 1);
lcd.print("Влажн: ");
lcd.print(humidity, 1);
lcd.print(" %");
}
delay(2000); // Обновляем показания каждые 2 секунды
}
Шаг 4: Расширение функциональности
Для создания более продвинутой метеостанции можно добавить:
Модуль часов реального времени (RTC): – Подключите модуль DS3231 к I2C-шине Arduino (SDA → A4, SCL → A5) – Используйте библиотеку RTClib для работы с модулем
Модуль SD-карты для хранения данных: – Подключите CS пин модуля к D10 на Arduino – Подключите MOSI, MISO и SCK к соответствующим пинам SPI интерфейса Arduino – Используйте библиотеку SD для записи данных в файл
Дополнительные датчики: – Барометрический датчик BMP280 для измерения атмосферного давления – Датчик качества воздуха MQ-135 для мониторинга CO2 – Датчик освещенности BH1750 для измерения уровня освещения
Шаг 5: Создание корпуса и финальная сборка
- Спроектируйте корпус с учетом расположения компонентов и отверстий для датчиков
- Распечатайте корпус на 3D-принтере или используйте готовый пластиковый корпус
- Разместите компоненты внутри корпуса
- Обеспечьте вентиляционные отверстия для корректной работы датчиков
- Подключите внешнее питание (батарейный блок или сетевой адаптер)
| Датчик | Диапазон измерения влажности | Точность измерения влажности | Диапазон измерения температуры | Точность измерения температуры | Время отклика |
|---|---|---|---|---|---|
| DHT11 | 20-80% RH | ±5% RH | 0-50°C | ±2°C | 6-15 с |
| DHT22 | 0-100% RH | ±2% RH | -40 до +80°C | ±0.5°C | 2 с |
| BME280 | 0-100% RH | ±3% RH | -40 до +85°C | ±1°C | 1 с |
| SHT21 | 0-100% RH | ±2% RH | -40 до +125°C | ±0.3°C | 8 с |
| AM2320 | 0-99.9% RH | ±3% RH | -40 до +80°C | ±0.5°C | 5 с |
Для визуализации собранных данных можно использовать библиотеку Arduino для работы с графиками или экспортировать данные в Excel для создания графиков изменения влажности и температуры с течением времени. 📊
Контроллер влажности почвы для теплиц
Контроллер влажности для теплиц — продвинутая система, которая не только мониторит уровень влажности почвы в различных зонах теплицы, но и автоматически управляет системой полива в зависимости от заданных параметров. Такой проект особенно полезен для поддержания оптимального микроклимата для выращивания растений. 🌱
Компоненты для системы:
- Arduino Mega (для большого количества датчиков) или Arduino UNO
- Несколько датчиков влажности почвы (емкостные более предпочтительны для длительного использования)
- Реле для управления электромагнитными клапанами или насосами
- ЖК-дисплей 20x4 с I2C-модулем
- Кнопки для управления меню и настройки параметров
- Электромагнитные клапаны для разных зон полива
- Датчик DHT22 для мониторинга влажности и температуры воздуха
- Модуль часов реального времени (RTC) для планирования полива
- Источник питания с достаточной мощностью
Шаг 1: Проектирование системы
Разделите теплицу на зоны полива в зависимости от типов выращиваемых растений и их потребностей во влаге. Для каждой зоны подготовьте:
- Датчик влажности почвы
- Электромагнитный клапан или отдельный насос для подачи воды
- Определите оптимальные уровни влажности для каждой зоны
Шаг 2: Подключение компонентов
Подключение датчиков влажности почвы: – VCC каждого датчика к 5В Arduino – GND датчиков к GND Arduino – Аналоговый выход первого датчика к A0, второго к A1 и т.д.
Подключение модуля реле: – VCC модуля к 5В Arduino – GND модуля к GND Arduino – Входы IN1, IN2, IN3... к цифровым пинам Arduino (например, 22, 24, 26...)
Подключение дисплея I2C: – VCC к 5В – GND к GND – SDA к пину 20 (SDA) Arduino Mega – SCL к пину 21 (SCL) Arduino Mega
Подключение кнопок: – Одним контактом к GND – Другим контактом к цифровым пинам Arduino (например, 30, 32, 34) – Используйте подтягивающие резисторы 10 кОм между пином и 5В
Шаг 3: Базовый код для контроллера
Вот фрагмент кода, демонстрирующий основную логику работы контроллера:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <RTClib.h>
// Настройка пинов
#define DHTPIN 2
#define DHTTYPE DHT22
// Количество зон полива
const int NUM_ZONES = 3;
// Пины датчиков влажности почвы
int soilMoisturePins[NUM_ZONES] = {A0, A1, A2};
// Пины реле для управления клапанами
int valvePins[NUM_ZONES] = {22, 24, 26};
// Пины кнопок управления
const int BTN_UP = 30;
const int BTN_DOWN = 32;
const int BTN_SELECT = 34;
// Настройки влажности для каждой зоны (минимум и максимум в %)
int minMoisture[NUM_ZONES] = {30, 40, 25};
int maxMoisture[NUM_ZONES] = {60, 70, 55};
// Текущие значения влажности почвы в %
int currentMoisture[NUM_ZONES];
// Статусы клапанов (0 – закрыт, 1 – открыт)
int valveStatus[NUM_ZONES] = {0, 0, 0};
// Инициализация дисплея
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Инициализация DHT
DHT dht(DHTPIN, DHTTYPE);
// Инициализация RTC
RTC_DS3231 rtc;
void setup() {
Serial.begin(9600);
// Инициализация дисплея
lcd.init();
lcd.backlight();
// Инициализация датчика DHT
dht.begin();
// Инициализация RTC
rtc.begin();
// Если RTC не был установлен, устанавливаем его по времени компиляции
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Настройка пинов кнопок
pinMode(BTN_UP, INPUT_PULLUP);
pinMode(BTN_DOWN, INPUT_PULLUP);
pinMode(BTN_SELECT, INPUT_PULLUP);
// Настройка пинов реле
for (int i = 0; i < NUM_ZONES; i++) {
pinMode(valvePins[i], OUTPUT);
digitalWrite(valvePins[i], LOW); // Изначально клапаны закрыты
}
// Вывод приветственного сообщения
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Контроллер влажности");
lcd.setCursor(0, 1);
lcd.print("для теплицы");
lcd.setCursor(0, 3);
lcd.print("Загрузка...");
delay(2000);
}
void loop() {
// Получение текущего времени
DateTime now = rtc.now();
// Чтение влажности и температуры воздуха
float airHumidity = dht.readHumidity();
float airTemperature = dht.readTemperature();
// Чтение влажности почвы для всех зон
for (int i = 0; i < NUM_ZONES; i++) {
int rawValue = analogRead(soilMoisturePins[i]);
// Преобразование в проценты (может потребоваться калибровка)
currentMoisture[i] = map(rawValue, 0, 1023, 100, 0);
// Логика управления клапанами
if (currentMoisture[i] < minMoisture[i] && valveStatus[i] == 0) {
// Если влажность ниже минимума и клапан закрыт – открываем его
digitalWrite(valvePins[i], HIGH);
valveStatus[i] = 1;
Serial.print("Зона ");
Serial.print(i + 1);
Serial.println(": клапан открыт");
} else if (currentMoisture[i] > maxMoisture[i] && valveStatus[i] == 1) {
// Если влажность выше максимума и клапан открыт – закрываем его
digitalWrite(valvePins[i], LOW);
valveStatus[i] = 0;
Serial.print("Зона ");
Serial.print(i + 1);
Serial.println(": клапан закрыт");
}
}
// Обновление информации на дисплее
updateDisplay(now, airTemperature, airHumidity);
// Проверка нажатия кнопок для меню настроек
checkButtons();
// Пауза перед следующим циклом
delay(1000);
}
void updateDisplay(DateTime now, float temp, float hum) {
lcd.clear();
// Вывод времени и даты
lcd.setCursor(0, 0);
lcd.print(now.day());
lcd.print("/");
lcd.print(now.month());
lcd.print(" ");
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) lcd.print("0");
lcd.print(now.minute());
// Вывод температуры и влажности воздуха
lcd.setCursor(11, 0);
lcd.print("T:");
lcd.print(temp, 1);
lcd.print("C");
// Вывод информации о зонах полива
for (int i = 0; i < NUM_ZONES; i++) {
lcd.setCursor(0, i + 1);
lcd.print("Зона ");
lcd.print(i + 1);
lcd.print(": ");
lcd.print(currentMoisture[i]);
lcd.print("%");
lcd.setCursor(13, i + 1);
if (valveStatus[i] == 1) {
lcd.print("[ВКЛ]");
} else {
lcd.print("[ВЫКЛ]");
}
}
}
void checkButtons() {
// Логика обработки нажатия кнопок для меню настроек
// (упрощенная версия, можно расширить для полноценного меню)
if (digitalRead(BTN_SELECT) == LOW) {
delay(50); // Дебаунс
if (digitalRead(BTN_SELECT) == LOW) {
// Код для входа в меню настроек
enterSettingsMenu();
}
}
}
void enterSettingsMenu() {
// Реализация меню настроек
// ...
}
Шаг 4: Калибровка датчиков влажности почвы
Калибровка критически важна для точной работы системы:
- Поместите датчик в абсолютно сухую почву, запишите показания (это будет соответствовать 0% влажности)
- Поместите датчик в насыщенную водой почву (но не в свободную воду), запишите показания (это будет соответствовать 100% влажности)
- Скорректируйте функцию map() в коде для каждого датчика
Шаг 5: Создание меню настроек
Для удобства управления системой создайте пользовательское меню с возможностями:
- Установка минимального и максимального уровня влажности для каждой зоны
- Настройка расписания полива (для планового полива)
- Ручной режим управления клапанами
- Просмотр статистики влажности за период
Шаг 6: Установка и тестирование
- Разместите контроллер в защищенном от влаги месте
- Установите датчики в разные зоны теплицы на оптимальной глубине (обычно 1/3 от корневой зоны растений)
- Подключите электромагнитные клапаны к системе водоснабжения
- Проведите тестовый полив каждой зоны
- Наблюдайте за изменением показаний влажности после полива
- При необходимости скорректируйте пороговые значения влажности
Дополнительные улучшения:
- Защита от сбоев: добавьте логику для детекции неисправностей датчиков или застревания клапанов
- Экономия энергии: используйте режим сна Arduino для уменьшения энергопотребления
- Расширенная аналитика: добавьте SD-карту для хранения исторических данных о влажности
- Интернет-подключение: добавьте модуль ESP8266 для отправки данных в облако и удаленного мониторинга
Подключение Arduino к мобильному приложению для отчетов
Интеграция Arduino с мобильным приложением позволяет отслеживать показания датчиков влажности в реальном времени, получать уведомления и управлять системой дистанционно. Для этого можно использовать различные технологии: Bluetooth, Wi-Fi или GSM-модули. 📱
Основные компоненты для создания системы:
- Arduino UNO/Nano или ESP8266/ESP32
- Датчики влажности (почвы или воздуха)
- Модуль беспроводной связи: – Bluetooth-модуль HC-05/HC-06 для локального подключения – Wi-Fi модуль ESP8266 для интернет-подключения – ESP32 (Arduino-совместимая плата с встроенным Wi-Fi и Bluetooth)
- Блок питания для длительной автономной работы
Вариант 1: Подключение через Bluetooth (HC-05/HC-06)
Подходит для простых проектов с локальным управлением без выхода в интернет.
Подключение HC-05 к Arduino: – VCC к 5В (или 3.3В, в зависимости от модуля) – GND к GND – TX к RX (пин 10 через делитель напряжения) – RX к TX (пин 11)
Код для Arduino:
#include <SoftwareSerial.h>
// Настройка пинов для Bluetooth-модуля
#define BT_TX 10
#define BT_RX 11
// Пин датчика влажности почвы
#define MOISTURE_PIN A0
SoftwareSerial bluetooth(BT_TX, BT_RX);
void setup() {
Serial.begin(9600);
bluetooth.begin(9600); // Стандартная скорость для HC-05
Serial.println("Система мониторинга влажности запущена");
bluetooth.println("Система мониторинга влажности запущена");
}
void loop() {
// Чтение данных с датчика влажности
int moistureRaw = analogRead(MOISTURE_PIN);
int moisturePercent = map(moistureRaw, 0, 1023, 100, 0);
// Формирование строки данных для отправки
String dataString = "M:" + String(moisturePercent);
// Отправка данных через Bluetooth
bluetooth.println(dataString);
Serial.println("Отправлено: " + dataString);
// Проверка на наличие входящих команд
if (bluetooth.available()) {
String command = bluetooth.readStringUntil('\n');
Serial.println("Получена команда: " + command);
// Обработка команд от приложения
if (command == "GET_DATA") {
bluetooth.println(dataString);
}
}
delay(5000); // Обновление каждые 5 секунд
}
- Создание мобильного приложения: – Используйте MIT App Inventor для быстрого создания Android-приложения без программирования – Или React Native/Flutter для более продвинутых приложений – Добавьте функционал подключения по Bluetooth, приема данных и отображения их на графике
Вариант 2: Подключение через Wi-Fi (ESP8266/ESP32)
Этот вариант обеспечивает удаленный доступ через интернет и более широкие возможности.
Подключение датчиков к ESP8266/ESP32: – Для ESP8266 NodeMCU: подключите датчик влажности почвы к аналоговому входу A0 – Для ESP32: подключите к любому аналоговому входу
Код для ESP8266 с использованием Blynk:
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
// Настройки Wi-Fi и Blynk
char auth[] = "ВАШ_AUTH_TOKEN_ОТ_BLYNK";
char ssid[] = "ИМЯ_ВАШЕЙ_WIFI_СЕТИ";
char pass[] = "ПАРОЛЬ_ВАШЕЙ_WIFI_СЕТИ";
// Пин датчика влажности
#define MOISTURE_PIN A0
// Таймер для отправки данных
BlynkTimer timer;
// Функция отправки данных
void sendSensorData() {
// Чтение данных с датчика влажности
int moistureRaw = analogRead(MOISTURE_PIN);
int moisturePercent = map(moistureRaw, 0, 1023, 100, 0);
// Отправка данных в Blynk
Blynk.virtualWrite(V5, moisturePercent);
// Отправка уведомления при низкой влажности
if (moisturePercent < 30) {
Blynk.notify("Внимание! Низкая влажность почвы: " + String(moisturePercent) + "%");
}
Serial.print("Влажность почвы: ");
Serial.print(moisturePercent);
Serial.println("%");
}
void setup() {
Serial.begin(115200);
// Подключение к Blynk
Blynk.begin(auth, ssid, pass);
// Настройка таймера для отправки данных каждую минуту
timer.setInterval(60000L, sendSensorData);
Serial.println("Система мониторинга влажности с Blynk запущена");
}
void loop() {
Blynk.run();
timer.run();
}
- Настройка Blynk: – Установите приложение Blynk на Android или iOS – Создайте новый проект и получите токен аутентификации – Добавьте виджет гистограммы для отображения влажности (V5) – Добавьте виджет уведомлений для получения предупреждений
Вариант 3: Создание собственного веб-сервера на ESP8266/ESP32
Для более гибкого контроля можно создать собственный веб-сервер на ESP8266 или ESP32.
- Код для ESP8266 с веб-сервером:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
// Настройки Wi-Fi
const char* ssid = "ИМЯ_ВАШЕЙ_WIFI_СЕТИ";
const char* password = "ПАРОЛЬ_ВАШЕЙ_WIFI_СЕТИ";
// Пин датчика влажности
#define MOISTURE_PIN A0
// Создание экземпляра веб-сервера на порту 80
ESP8266WebServer server(80);
// Переменная для хранения последнего измерения
int lastMoisture = 0;
// Время последнего измерения
unsigned long lastMeasureTime = 0;
void setup() {
Serial.begin(115200);
// Подключение к Wi-Fi
WiFi.begin(ssid, password);
Serial.print("Подключение к WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Подключено к ");
Serial.println(ssid);
Serial.print("IP адрес: ");
Serial.println(WiFi.localIP());
// Настройка маршрутов веб-сервера
server.on("/", handleRoot);
server.on("/data", handleData);
server.onNotFound(handleNotFound);
// Запуск сервера
server.begin();
Serial.println("HTTP сервер запущен");
}
void loop() {
server.handleClient();
// Обновляем измерение каждые 5 секунд
if (millis() – lastMeasureTime > 5000) {
lastMeasureTime = millis();
// Чтение данных с датчика влажности
int moistureRaw = analogRead(MOISTURE_PIN);
lastMoisture = map(moistureRaw, 0, 1023, 100, 0);
Serial.print("Влажность почвы: ");
Serial.print(lastMoisture);
Serial.println("%");
}
}
// Обработчик для главной страницы
void handleRoot() {
String html = "<!DOCTYPE html><html>";
html += "<head><meta name='viewport' content='width=device-width, initial-scale=1.0'>";
html += "<meta http-equiv='refresh' content='5'>";
html += "<title>Мониторинг влажности почвы</title>";
html += "<style>";
html += "body { font-family: Arial, sans-serif; text-align: center; }";
html += ".gauge { width: 200px; height: 200px; margin: 20px auto; }";
html += "</style></head><body>";
html += "<h1>Мониторинг влажности почвы</h1>";
html += "<div class='gauge'>";
html += "<svg viewBox='0 0 100 100'>";
html += "<path d='M10,50 A40,40 0 1,1 90,50' fill='none' stroke='#eee' stroke-width='10'/>";
html += "<path d='M10,50 A40,40 0 1," + String(lastMoisture > 50 ? "1" : "0") + " " + String(10 + 80 * lastMoisture / 100) + ",50' fill='none' stroke='#2196F3' stroke-width='10'/>";
html += "<text x='50' y='60' text-anchor='middle' font-size='20'>" + String(lastMoisture) + "%</text>";
html += "</svg></div>";
html += "<p>Последнее обновление: " + String(millis() / 1000) + " секунд назад</p>";
html += "</body></html>";
server.send(200, "text/html", html);
}
// Обработчик для получения данных в JSON формате
void handleData() {
String json = "{\"moisture\":" + String(lastMoisture) + "}";
server.send(200, "application/json", json);
}
// Обработчик для неизвестных маршрутов
void handleNotFound() {
server.send(404, "text/plain", "Страница не найдена");
}
Доступ к данным: – Через веб-браузер: откройте IP-адрес ESP в локальной сети – Через мобильное приложение: используйте API-запросы к /data
Создание мобильного приложения для работы с API: – Разработайте приложение с использованием Flutter/React Native – Добавьте функционал HTTP-запросов к вашему ESP-серверу – Реализуйте отображение данных в виде графиков и диаграмм
Вариант 4: Использование готовых IoT-платформ
Для быстрого запуска можно использовать существующие IoT-платформы:
- ThingSpeak: бесплатная платформа для анализа и визуализации данных с IoT-устройств
- Adafruit IO: простая облачная платформа с интуитивным интерфейсом
- Cayenne: платформа с богатыми визуальными возможностями
- Firebase: мощная облачная платформа от Google для хранения данных и создания приложений
Пример кода для ESP8266 и ThingSpeak:
#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
// Настройки Wi-Fi
const char* ssid = "ИМЯ_ВАШЕЙ_WIFI_СЕТИ";
const char* password = "ПАРОЛЬ_ВАШЕЙ_WIFI_СЕТИ";
// Настройки ThingSpeak
unsigned long channelID = ВАШЕ_ID_КАНАЛА;
const char* writeAPIKey = "ВАШ_API_КЛЮЧ";
// Пин датчика влажности
#define MOISTURE_PIN A0
// Объект WiFi-клиента
WiFiClient client;
void setup() {
Serial.begin(115200);
// Подключение к WiFi
WiFi.begin(ssid, password);
Serial.print("Подключение к WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Подключено к ");
Serial.println(ssid);
// Инициализация ThingSpeak
ThingSpeak.begin(client);
}
void loop() {
// Чтение данных с датчика влажности
int moistureRaw = analogRead(MOISTURE_PIN);
int moisturePercent = map(moistureRaw, 0, 1023, 100, 0);
Serial.print("Влажность почвы: ");
Serial.print(moisturePercent);
Serial.println("%");
// Отправка данных в ThingSpeak
ThingSpeak.setField(1, moisturePercent);
int response = ThingSpeak.writeFields(channelID, writeAPIKey);
if (response == 200) {
Serial.println("Данные успешно отправлены");
} else {
Serial
**Читайте также**
- [Топ-10 Arduino-проектов для умного дома: сделай своими руками](/gadgets/legkie-proekty-dlya-doma-na-arduino/)
- [10 впечатляющих проектов Arduino с LCD дисплеями: от часов до умного дома](/gadgets/proekty-s-lcd-displeyami-na-arduino/)
- [Примеры проектов с дисплеем и датчиками для Arduino](/gamedev/primery-proektov-s-displeem-i-datchikami-dlya-arduino/)
- [5 проектов Arduino для создания устройств мониторинга сна дома](/gadgets/proekty-dlya-monitoringa-sna-na-arduino/)
- [Сенсорные экраны Arduino: топ-10 вдохновляющих проектов для начинающих](/gadgets/proekty-s-sensornymi-ekranami-na-arduino/)
- [Отладка Arduino: эффективные методы поиска и устранения ошибок](/gadgets/otladka-i-ustranenie-oshibok-v-proektah-na-arduino/)
- [Проекты с температурными датчиками на Arduino](/gamedev/proekty-s-temperaturnymi-datchikami-na-arduino/)
- [Создание монитора сердечного ритма Arduino: схемы и код](/gadgets/monitory-serdechnogo-ritma-na-arduino/)
- [Arduino: основы программирования для начинающих электроников](/gadgets/osnovy-programmirovaniya-dlya-arduino/)
- [Как собрать умный термостат на Arduino: экономия и автоматизация](/gadgets/umnye-termostaty-na-arduino/)