Простые IoT-проекты на Arduino UNO, ESP-01, ThingSpeak и MIT App Inventor
Компоненты и материалы
| Arduino UNO | × | 1 |
| ESP8266 ESP-01 | × | 1 |
| Датчик температуры и влажности DHT22 | × | 1 |
| DS18B20 (для почвы, 1-Wire) | × | 1 |
| Фоторезистор (LDR) | × | 1 |
| Модуль 2-канального реле 5 В | × | 1 |
Приложения и онлайн-сервисы
- Arduino IDE
- ThingSpeak API
- MIT App Inventor
О проекте
Цель: собирать данные с локального блока и отправлять их в интернет. Пользователь где угодно просматривает данные и отправляет команды исполнительным механизмам. В качестве «центра» используется ThingSpeak.com. Локальный блок (UNO + ESP-01) читает датчики и статус исполнительных механизмов, записывает в Status Channel на ThingSpeak, и читает команды из Actuator Channels.
Android-приложение (MIT App Inventor) читает Status Channel для отображения и пишет в Actuator Channels для управления.


Шаг 1: Введение

Собираемые данные датчиков:
- Температура и влажность воздуха (DHT22)
- Температура и влажность почвы (DS18B20 + YL-69)
- Освещенность (LDR)
Исполнительные механизмы (2 реле):
- Насос (полив)
- Лампа (подогрев/освещение)
Логика управления (пользователь решает на основе данных):
- Включить насос, если влажность почвы слишком низкая
- Включить лампу, если температура почвы слишком низкая
Шаг 2: Спецификация (BOM)
- Arduino UNO — $10
- ESP8266-01 — $3.50
- DHT22 — $9
- DS18B20 — $6
- YL-69 + LM393 (влажность почвы) — $2
- LDR — $0.20
- 2 светодиода (красный/зеленый)
- 2-канальный реле 5 В с оптопарой (Low Level Trigger) — $7
- Насос 5 В — $3
- Лампа 220 В
- Резисторы: 2×330 Ом (LED), 2×10 кОм (DHT22, LDR), 1×4.7 кОм (DS18B20)
- Макетная плата, перемычки, внешний 5 В для реле
Шаг 3: Аппаратная часть

Рекомендуемая последовательность:
- Установить и протестировать датчики локально
- Настроить ESP-01 (BareMinimum)
- Переключить ESP-01 в рабочую конфигурацию
- Создать Status Channel на ThingSpeak
- Загрузить код отправки данных на Arduino
- Разработать первое Android-приложение (мониторинг)
- Установить исполнительные механизмы (LED, реле)
- Создать Actuator Channels на ThingSpeak
- Загрузить код с управлением исполнителями
- Финализировать Android-приложение
Шаг 4: Подключение датчиков

Необходимые библиотеки и начальная конфигурация:
// DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
int soilTemp = 0;
// DHT22
#include "DHT.h"
#include <stdlib.h>
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT dht(pinoDHT, tipoDHT);
int airTemp = 0, airHum = 0;
// LDR
#define ldrPIN 1
int light = 0;
// Влажность почвы
#define soilHumPIN 0
int soilHum = 0;
void setup() {
Serial.begin(9600);
DS18B20.begin();
dht.begin();
}
void loop() {
readSensors();
displaySensors();
delay(10000);
}
void readSensors() {
airTemp = dht.readTemperature();
airHum = dht.readHumidity();
DS18B20.requestTemperatures();
soilTemp = DS18B20.getTempCByIndex(0);
soilHum = map(analogRead(soilHumPIN), 1023, 0, 0, 100);
light = map(analogRead(ldrPIN), 1023, 0, 0, 100);
}
void displaySensors() {
Serial.print("airTemp (oC): "); Serial.println(airTemp);
Serial.print("airHum (%): "); Serial.println(airHum);
Serial.print("soilTemp (oC): "); Serial.println(soilTemp);
Serial.print("soilHum (%): "); Serial.println(soilHum);
Serial.print("light (%): "); Serial.println(light);
Serial.println();
}

Шаг 5: Начальная настройка ESP-01

ESP-01 работает как Serial-бридж (AT-команды). Заводская скорость часто 115200 бод, нужно 9600.
- Подключите ESP-01 к Arduino (RX→TX, TX→RX, CH_PD→3.3V, RST→D8, VCC→3.3V, GND→GND).
- Загрузите в Arduino пустой скетч (BareMinimum), чтобы освободить Serial.
- Откройте монитор порта на 115200, отправьте
AT→ ожидайтеOK. - Смените скорость:
AT+UART_DEF=9600,8,1,0,0. - Переключите монитор на 9600, проверьте
AT→OK. - Режим Station (клиент):
AT+CWMODE=1. - Подключение к Wi-Fi:
AT+CWJAP="SSID","PASSWORD". - Успех:
WIFI CONNECTED,WIFI GOT IP. - Узнать IP:
AT+CIFSR.
Шаг 6: Тестирование ESP-01

Переподключите ESP-01 к рабочим пинам: RX→D7, TX→D6, CH_PD→3.3V, RST→D8, VCC→3.3V, GND→GND.
Тестовый скетч для прозрачного моста:
#include <SoftwareSerial.h>
SoftwareSerial esp8266(6,7); // Rx=6, Tx=7
#define speed8266 9600
void setup() {
esp8266.begin(speed8266);
Serial.begin(speed8266);
Serial.println("ESP8266 Setup test - use AT commands");
}
void loop() {
while(esp8266.available()) Serial.write(esp8266.read());
while(Serial.available()) esp8266.write(Serial.read());
}
Проверьте команды: AT, AT+RST, AT+GMR, AT+CWMODE?, AT+CWLAP, AT+CIFSR.
Функция автоподключения при сбросе:
void connectWiFi() {
sendData("AT+RST\r\n", 2000, 0);
sendData("AT+CWJAP=\"YOUR_SSID\",\"YOUR_PASS\"\r\n", 2000, 0);
delay(3000);
sendData("AT+CWMODE=1\r\n", 1000, 0);
sendData("AT+CIFSR\r\n", 1000, 0);
Serial.println("8266 Connected");
}
String sendData(String command, const int timeout, boolean debug) {
String response = "";
EspSerial.print(command);
long int time = millis();
while ((time + timeout) > millis()) {
while (EspSerial.available()) {
char c = EspSerial.read();
response += c;
}
}
if (debug) Serial.print(response);
return response;
}
Шаг 7: Датчики + ESP-01 вместе

Шаг 8: ThingSpeak

Создайте канал Status с полями:
- Field 1: Actuator 1 (Pump)
- Field 2: Actuator 2 (Lamp)
- Field 3: Air Temp (°C)
- Field 4: Air Hum (%)
- Field 5: Soil Temp (°C)
- Field 6: Soil Hum (%)
- Field 7: Light (%)
- Field 8: Spare (счетчик ошибок)
Сохраните Write API Key.

Шаг 9: Отправка статуса в облако

Отправка GET-запросом в 3 этапа:
AT+CIPSTART="TCP","184.106.153.149",80AT+CIPSEND=116(длина)GET /update?api_key=YOUR_KEY&field1=pump&field2=lamp&field3=airTemp&field4=airHum&field5=soilTemp&field6=soilHum&field7=light&field8=spare
Полный код отправки (функции writeThingSpeak(), startThingSpeakCmd(), sendThingSpeakGetCmd(), EspHardwareReset()) доступен на GitHub (файл SendingStatusTS_EXT.ino).
Шаг 10: Android-приложение (часть 1 — мониторинг)

Интерфейс: метки для каждого датчика, индикатор WebSocket. Каждые 2 сек (Clock1) вызывается процедура readArduino, которая делает GET к Status Channel ThingSpeak, парсит JSON, обновляет глобальные переменные и отображает. Значения 0/1 реле преобразуются в OFF/ON. Процедура Alarm проверяет пороги почвы (temp < 10°C, hum < 60%) и мигает сообщением (Clock2 каждую сек).

Файл проекта: ArduFarmBot_Status_App_EXT.aia на GitHub.
Шаг 11: Установка исполнительных механизмов (LED и реле)

Реле с оптопарой и Low Level Trigger. Питание реле 5 В отдельно от Arduino (GND реле не соединять с GND Arduino для снижения шумов).
Шаг 12: Настройка Actuator Channels на ThingSpeak

Два канала (по одному на актуатор), используем только Field 1:
- Channel 375598 (Red LED → Pump): 0=OFF, 1=ON
- Channel 375599 (Green LED → Lamp): 0=OFF, 1=ON
Шаг 13: Код Arduino с чтением команд

Чтение последнего значения Field 1 каждые 10 сек: GET /channels/CHANNEL_ID/fields/1/last. Функция readThingSpeak(channelID) возвращает 0, 1 или 9 (ошибка). Код: ReadingCommandTS_EXT.ino на GitHub.
Шаг 14: Тест команд через браузер
Включить насос: https://api.thingspeak.com/update?api_key=ACT1_WRITE_KEY&field1=1
Выключить насос: ...&field1=0
Аналогично для лампы (ACT2_WRITE_KEY).
Шаг 15: Финал Android-приложения (управление)

Добавлены пары кнопок ON/OFF для каждого актуатора. Нажатие пишет 1 или 0 в соответствующий Actuator Channel через Web-компонент. Цвет текста кнопки меняется (ON=синий, OFF=красный). Файл: ArduFarmBot_V1_EXT.aia.
Шаг 16: Объединение всего в один скетч

Итоговый код периодически читает и пишет в ThingSpeak, проверяет связь с ESP-01 (AT-командой) и при необходимости делает аппаратный сброс. Полный код: ArduFarmBot_Light_EXT.ino на GitHub.
Шаг 17: Заключение

Много возможностей для IoT с Arduino Uno и ESP8266-01. Следите за новыми уроками MJRoBot!
GitHub: ArduFarmBot_Light
Блог: MJRoBot.org
Схемы
Электрическая схема (Fritzing): GitHub
Производственный процесс
- Сборка параллельного C++17 SYCL кода на Raspberry Pi 4B+ IoT платах
- IoT-монитор пульса в реальном времени на Arduino и MAX30100
- Веб-сервер на Arduino Uno WiFi: управление LED через браузер
- Простой калькулятор на Arduino UNO — базовый проект для начинающих
- Сборка портативного дисплея на основе эффекта сохранения изображения с Arduino UNO и ATtiny85
- Бесконтактный термометрический шлюз для быстрого и точного скрининга
- Arduino UNO + WiFi Shield: реальный график температуры в вебе через Serial
- Метеостанция на Arduino и ThingSpeak: температура и влажность в облаке
- Использование термистора: пошаговое руководство для Arduino
- Система управления бассейном на Azure IoT: умные датчики и удаленный мониторинг