Датчики влажности для Arduino: лучшие проекты с автополивом

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Новички и любители в области электроники и программирования на 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:

  1. VCC датчика подключается к 5В Arduino
  2. GND датчика подключается к GND Arduino
  3. Аналоговый выход (AO) подключается к аналоговому входу Arduino (например, A0)

Простой скетч для чтения данных:

cpp
Скопировать код
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: Подключение датчика влажности

  1. Подключите VCC датчика к 5В на Arduino
  2. GND датчика к GND Arduino
  3. Аналоговый выход датчика к пину A0 на Arduino

Шаг 2: Подключение реле и насоса

  1. Подключите VCC реле к 5В Arduino
  2. GND реле к GND Arduino
  3. Сигнальный пин реле к цифровому пину D7 Arduino
  4. Подключите насос к нормально разомкнутому контакту реле
  5. Подключите внешний источник питания 12В к реле и насосу

Важно помнить, что силовую часть (насос и его питание) нужно изолировать от схемы Arduino, чтобы избежать помех и повреждения микроконтроллера.

Шаг 3: Программирование

cpp
Скопировать код
#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: Калибровка системы

После загрузки кода выполните калибровку датчика:

  1. Измерьте показания датчика в сухой почве и запишите значение
  2. Измерьте показания датчика во влажной почве и запишите значение
  3. Скорректируйте функцию map() в коде, используя полученные значения
  4. Настройте пороговые значения DRYTHRESHOLD и WETTHRESHOLD под потребности конкретного растения

Шаг 5: Финальная сборка

  1. Поместите датчик влажности в почву (на глубину около 1/3 от высоты горшка)
  2. Расположите емкость с водой рядом с растением
  3. Подключите один конец шланга к насосу, другой поместите в почву
  4. Запустите систему и наблюдайте за работой

Для дополнительной функциональности можно добавить:

  • ЖК-дисплей для отображения текущей влажности
  • Светодиодные индикаторы состояния
  • Кнопки для ручного запуска полива
  • Датчик уровня воды в резервуаре

Метеостанция для мониторинга влажности воздуха

Домашняя метеостанция на основе Arduino позволяет собирать и анализировать данные о микроклимате в помещении или на улице. Для мониторинга влажности воздуха идеально подойдут датчики DHT22 или BME280, обеспечивающие высокую точность измерений. 🌡️

Елена Соколова, преподаватель робототехники

В нашей школе проблема с постоянной сухостью воздуха стала критичной в зимний период. Дети жаловались на сухость в горле, а учителя на постоянную усталость. Администрация разводила руками – "так работает система отопления".

Я предложила ученикам старших классов создать сеть мини-метеостанций на Arduino с датчиками влажности. Проект занял две недели. Мы разместили 15 устройств в разных кабинетах школы. Каждая метеостанция измеряла температуру и влажность, отправляя данные на центральный сервер.

Результаты ошеломили даже меня: в некоторых кабинетах влажность опускалась до 15-20% при норме 40-60%. Наши данные стали неопровержимым аргументом для администрации. В школе установили увлажнители воздуха, а наш проект перерос в постоянно действующую систему мониторинга климата. Через месяц после внедрения системы увлажнения, учителя отметили снижение числа пропусков по болезни на 27%.

Компоненты для базовой метеостанции:

  • Arduino UNO или Nano
  • Датчик DHT22 (или DHT11 для более бюджетного варианта)
  • ЖК-дисплей 16x2 с I2C-модулем
  • Макетная плата и соединительные провода
  • Корпус (можно распечатать на 3D-принтере)
  • Опционально: модуль часов реального времени DS3231
  • Опционально: модуль SD-карты для логирования данных

Шаг 1: Подключение датчика DHT22

  1. VCC датчика к 5В Arduino
  2. GND датчика к GND Arduino
  3. DATA пин к D2 на Arduino
  4. Между VCC и DATA поместите подтягивающий резистор 4.7-10 кОм

Шаг 2: Подключение LCD-дисплея с I2C

  1. VCC к 5В Arduino
  2. GND к GND Arduino
  3. SDA к пину A4 Arduino
  4. SCL к пину A5 Arduino

Шаг 3: Программирование базовой метеостанции

cpp
Скопировать код
#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: Расширение функциональности

Для создания более продвинутой метеостанции можно добавить:

  1. Модуль часов реального времени (RTC): – Подключите модуль DS3231 к I2C-шине Arduino (SDA → A4, SCL → A5) – Используйте библиотеку RTClib для работы с модулем

  2. Модуль SD-карты для хранения данных: – Подключите CS пин модуля к D10 на Arduino – Подключите MOSI, MISO и SCK к соответствующим пинам SPI интерфейса Arduino – Используйте библиотеку SD для записи данных в файл

  3. Дополнительные датчики: – Барометрический датчик BMP280 для измерения атмосферного давления – Датчик качества воздуха MQ-135 для мониторинга CO2 – Датчик освещенности BH1750 для измерения уровня освещения

Шаг 5: Создание корпуса и финальная сборка

  1. Спроектируйте корпус с учетом расположения компонентов и отверстий для датчиков
  2. Распечатайте корпус на 3D-принтере или используйте готовый пластиковый корпус
  3. Разместите компоненты внутри корпуса
  4. Обеспечьте вентиляционные отверстия для корректной работы датчиков
  5. Подключите внешнее питание (батарейный блок или сетевой адаптер)
Датчик Диапазон измерения влажности Точность измерения влажности Диапазон измерения температуры Точность измерения температуры Время отклика
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: Проектирование системы

Разделите теплицу на зоны полива в зависимости от типов выращиваемых растений и их потребностей во влаге. Для каждой зоны подготовьте:

  1. Датчик влажности почвы
  2. Электромагнитный клапан или отдельный насос для подачи воды
  3. Определите оптимальные уровни влажности для каждой зоны

Шаг 2: Подключение компонентов

  1. Подключение датчиков влажности почвы: – VCC каждого датчика к 5В Arduino – GND датчиков к GND Arduino – Аналоговый выход первого датчика к A0, второго к A1 и т.д.

  2. Подключение модуля реле: – VCC модуля к 5В Arduino – GND модуля к GND Arduino – Входы IN1, IN2, IN3... к цифровым пинам Arduino (например, 22, 24, 26...)

  3. Подключение дисплея I2C: – VCC к 5В – GND к GND – SDA к пину 20 (SDA) Arduino Mega – SCL к пину 21 (SCL) Arduino Mega

  4. Подключение кнопок: – Одним контактом к GND – Другим контактом к цифровым пинам Arduino (например, 30, 32, 34) – Используйте подтягивающие резисторы 10 кОм между пином и 5В

Шаг 3: Базовый код для контроллера

Вот фрагмент кода, демонстрирующий основную логику работы контроллера:

cpp
Скопировать код
#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: Калибровка датчиков влажности почвы

Калибровка критически важна для точной работы системы:

  1. Поместите датчик в абсолютно сухую почву, запишите показания (это будет соответствовать 0% влажности)
  2. Поместите датчик в насыщенную водой почву (но не в свободную воду), запишите показания (это будет соответствовать 100% влажности)
  3. Скорректируйте функцию map() в коде для каждого датчика

Шаг 5: Создание меню настроек

Для удобства управления системой создайте пользовательское меню с возможностями:

  • Установка минимального и максимального уровня влажности для каждой зоны
  • Настройка расписания полива (для планового полива)
  • Ручной режим управления клапанами
  • Просмотр статистики влажности за период

Шаг 6: Установка и тестирование

  1. Разместите контроллер в защищенном от влаги месте
  2. Установите датчики в разные зоны теплицы на оптимальной глубине (обычно 1/3 от корневой зоны растений)
  3. Подключите электромагнитные клапаны к системе водоснабжения
  4. Проведите тестовый полив каждой зоны
  5. Наблюдайте за изменением показаний влажности после полива
  6. При необходимости скорректируйте пороговые значения влажности

Дополнительные улучшения:

  • Защита от сбоев: добавьте логику для детекции неисправностей датчиков или застревания клапанов
  • Экономия энергии: используйте режим сна 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)

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

  1. Подключение HC-05 к Arduino: – VCC к 5В (или 3.3В, в зависимости от модуля) – GND к GND – TX к RX (пин 10 через делитель напряжения) – RX к TX (пин 11)

  2. Код для Arduino:

cpp
Скопировать код
#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 секунд
}

  1. Создание мобильного приложения: – Используйте MIT App Inventor для быстрого создания Android-приложения без программирования – Или React Native/Flutter для более продвинутых приложений – Добавьте функционал подключения по Bluetooth, приема данных и отображения их на графике

Вариант 2: Подключение через Wi-Fi (ESP8266/ESP32)

Этот вариант обеспечивает удаленный доступ через интернет и более широкие возможности.

  1. Подключение датчиков к ESP8266/ESP32: – Для ESP8266 NodeMCU: подключите датчик влажности почвы к аналоговому входу A0 – Для ESP32: подключите к любому аналоговому входу

  2. Код для ESP8266 с использованием Blynk:

cpp
Скопировать код
#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();
}

  1. Настройка Blynk: – Установите приложение Blynk на Android или iOS – Создайте новый проект и получите токен аутентификации – Добавьте виджет гистограммы для отображения влажности (V5) – Добавьте виджет уведомлений для получения предупреждений

Вариант 3: Создание собственного веб-сервера на ESP8266/ESP32

Для более гибкого контроля можно создать собственный веб-сервер на ESP8266 или ESP32.

  1. Код для ESP8266 с веб-сервером:
cpp
Скопировать код
#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", "Страница не найдена");
}

  1. Доступ к данным: – Через веб-браузер: откройте IP-адрес ESP в локальной сети – Через мобильное приложение: используйте API-запросы к /data

  2. Создание мобильного приложения для работы с API: – Разработайте приложение с использованием Flutter/React Native – Добавьте функционал HTTP-запросов к вашему ESP-серверу – Реализуйте отображение данных в виде графиков и диаграмм

Вариант 4: Использование готовых IoT-платформ

Для быстрого запуска можно использовать существующие IoT-платформы:

  • ThingSpeak: бесплатная платформа для анализа и визуализации данных с IoT-устройств
  • Adafruit IO: простая облачная платформа с интуитивным интерфейсом
  • Cayenne: платформа с богатыми визуальными возможностями
  • Firebase: мощная облачная платформа от Google для хранения данных и создания приложений

Пример кода для ESP8266 и ThingSpeak:

cpp
Скопировать код
#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/)

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какие датчики влажности чаще всего используются в проектах на Arduino?
1 / 5

Загрузка...