Мини-метеостанция на Arduino UNO с ESP8266 и ThingSpeak — DIY IoT-хаб
Компоненты и материалы
- Arduino UNO — 1 шт.
- ESP8266 ESP-01 — 1 шт.
- Arduino Proto Shield или макетная плата — 1 шт.
- Датчик температуры и влажности DHT22 — 1 шт.
- Grove Light Sensor (освещённость) — 1 шт.
- Grove UV Sensor (УФ-индекс) — 1 шт.
- Grove Barometer Sensor (BMP085/180, давление) — 1 шт.
- Grove Dust Sensor (пыль PM2.5/10) — 1 шт.
- Резисторы: 1 кОм (2 шт.), 4,75 кОм, 10 кОм
- Перемыжки
Программное обеспечение и сервисы
- Arduino IDE
- ThingSpeak API (бесплатный облачный сервис для IoT)
- Android-приложение ThingsView (для просмотра графиков на телефоне)
О проекте

Первое поколение компактной метеостанции на Arduino с Wi-Fi (ESP8266), отправляющей данные на ThingSpeak. Измеряемые параметры:
- Температура (DHT22 и BMP085)
- Влажность воздуха
- Атмосферное давление
- Освещённость
- УФ-индекс
- Концентрация пыли
Питание от USB (ПК или зарядка), можно добавить внешний источник на джек Arduino. Корпус не входит в проект.
Подключение
Все датчики подключаются к шилду/макетке согласно схеме. Grove-модули удобны кабелями, но можно использовать и обычные версии датчиков.


Необходимые библиотеки
DHT sensor library(Adafruit)Adafruit BMP085 LibrarySoftwareSerial(встроена) для общения с ESP8266
Настройка ThingSpeak
- Зарегистрируйтесь на ThingSpeak.
- Создайте новый Channel с 7 полями:
Field 1 = Light (освещённость)
Field 2 = Humidity (влажность)
Field 3 = Temperature DHT22
Field 4 = UV Index
Field 5 = Dust concentration
Field 6 = Pressure
Field 7 = Temperature BMP085 - Скопируйте Write API Key и вставьте в скетч вместо
ZZZZZ. - В скетче также замените
XXXXXна SSID WiFi,YYYYY— пароль.




Просмотр на Android
- Установите ThingsView из Google Play.
- Введите Channel ID (виден в настройках канала ThingSpeak).
- Графики всех переменных будут доступны на телефоне.
Исходный код (weatherBox.ino)
#include#include #include #include #include #include #define SSID "XXXXX" // Ваш WiFi SSID #define PASS "YYYYY" // Ваш WiFi пароль #define IP "184.106.153.149" // IP thingspeak.com #define DHT22_PIN 2 String GET = "GET /update?key=ZZZZZ&field1="; // ZZZZZ = Write API Key SoftwareSerial monitor(10, 11); // RX, TX к ESP8266 dht DHT; Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); // Пины датчиков int luminancePin = A0; int uvPin = A1; int dustPin = 8; // Переменные для пыли unsigned long duration, starttime; unsigned long sampletime_ms = 30000; unsigned long delay_time = 60000; unsigned long lowpulseoccupancy = 0; float ratio = 0, concentration = 0; void setup() { Serial.begin(9600); monitor.begin(9600); Serial.println("Initializing..."); pinMode(dustPin, INPUT); Serial.println("Detecting BMP085..."); if (!bmp.begin()) { Serial.println("BMP085 not found! Check wiring/I2C address."); while (1); } Serial.println("BMP085 detected!"); // Инициализация ESP8266 monitor.flush(); monitor.println("AT"); delay(2000); if (monitor.find("OK")) Serial.println("ESP8266 OK"); else Serial.println("ESP8266 ERROR"); connectWiFi(); Serial.print("Sampling ("); Serial.print(sampletime_ms / 1000); Serial.println("s)..."); starttime = millis(); } void loop() { // Измерение пыли (Shinyei PPD42NS) duration = pulseIn(dustPin, LOW); lowpulseoccupancy += duration; if ((millis() - starttime) >= sampletime_ms) { ratio = lowpulseoccupancy / (sampletime_ms * 10.0); concentration = 1.1 * pow(ratio, 3) - 3.8 * pow(ratio, 2) + 520 * ratio + 0.62; // по даташиту lowpulseoccupancy = 0; // Остальные датчики char buffer[10]; float luminance = analogRead(luminancePin); float uv = analogRead(uvPin) * 0.0049 * 307 / 200; // В -> мВт/м² -> UV index int chk = DHT.read22(DHT22_PIN); float humidity = DHT.humidity; float temperature = DHT.temperature; sensors_event_t event; bmp.getEvent(&event); float pressure = 0, temperature1 = 0; if (event.pressure) { pressure = event.pressure; bmp.getTemperature(&temperature1); } // Преобразование в строки String luminanceStr = dtostrf(luminance, 4, 1, buffer); luminanceStr.replace(" ", ""); String uvStr = dtostrf(uv, 4, 1, buffer); uvStr.replace(" ", ""); String humidityStr = dtostrf(humidity, 4, 1, buffer); humidityStr.replace(" ", ""); String temperatureStr = dtostrf(temperature, 4, 1, buffer); temperatureStr.replace(" ", ""); String dustStr = dtostrf(concentration, 4, 1, buffer); dustStr.replace(" ", ""); String pressureStr = dtostrf(pressure, 4, 1, buffer); pressureStr.replace(" ", ""); String temperature1Str = dtostrf(temperature1, 4, 1, buffer); temperature1Str.replace(" ", ""); // Отправка на ThingSpeak updateSensors(luminanceStr, humidityStr, temperatureStr, uvStr, dustStr, pressureStr, temperature1Str); Serial.print("Wait "); Serial.print(delay_time / 1000); Serial.println("s for next sampling"); delay(delay_time); Serial.println(); Serial.print("Sampling ("); Serial.print(sampletime_ms / 1000); Serial.println("s)..."); starttime = millis(); } } void updateSensors(String luminanceStr, String humidityStr, String temperatureStr, String uvStr, String dustStr, String pressureStr, String temperature1Str) { String cmd = "AT+CIPSTART=\"TCP\",\"" + String(IP) + "\",80"; monitor.println(cmd); delay(2000); cmd = GET + luminanceStr + "&field2=" + humidityStr + "&field3=" + temperatureStr + "&field4=" + uvStr + "&field5=" + dustStr + "&field6=" + pressureStr + "&field7=" + temperature1Str + "\r\n"; delay(1000); int strsize = cmd.length(); monitor.println("AT+CIPSEND=" + String(strsize)); delay(2000); monitor.print(cmd); if (monitor.find("OK")) Serial.println("Transmission success"); else Serial.println("Transmission failed!"); } boolean connectWiFi() { Serial.println("Connecting WiFi..."); monitor.println("AT+CWMODE=1"); delay(2000); monitor.flush(); String cmd = "AT+CWJAP=\"" + String(SSID) + "\",\"" + String(PASS) + "\""; monitor.println(cmd); delay(5000); if (monitor.find("OK")) { Serial.println("WiFi connected!"); return true; } else { Serial.println("WiFi connection failed!"); return false; } }
Производственный процесс
- Создание метеостанции на Raspberry Pi с ежедневными email-отчётами о погоде
- Робот для поиска людей на базе Arduino Uno: пошаговая интеграция датчиков
- Датчик CO2 K30: мониторинг качества воздуха в реальном времени на Arduino
- Цифровой стадиометр на Arduino: отслеживание роста лазерным датчиком VL53L0X
- Веб-сервер на Arduino Uno WiFi: управление LED через браузер
- Простой калькулятор на Arduino UNO — базовый проект для начинающих
- Сенсорная башня на Arduino Cloud: Мониторинг температуры, движения и газа
- Сборка портативного дисплея на основе эффекта сохранения изображения с Arduino UNO и ATtiny85
- Погодная станция на Arduino Nano: BMP280, DHT11, UV, DS3231, OLED 0.96″
- Умная станция мониторинга здоровья: Arduino, Bluetooth и датчики