Метеостанция на Arduino: соберите в симуляторе за вечер
Классическая первая метеостанция живёт в корзине маркетплейса две-три недели: DHT22, барометр, дисплей, провода. Потом выясняется, что DHT молчит из-за перепутанного питания, LCD пустой из-за адреса 0x3F вместо 0x27, а барометр «не найден» на шине I2C. Три компонента — три точки отказа, и все три ловятся в браузере за полчаса, до того как посылка выехала со склада.
Ниже — состав станции с пинами и токами, логика прогноза по давлению с рабочими порогами и скетч под LCD 1602 I2C. Все три компонента лежат в палитре «Макетка» нашего симулятора: ползунки температуры, влажности и давления крутятся — значения уходят в скетч и на экран дисплея.
Состав: три компонента и одна общая шина
DHT22 держит температуру и влажность на своём однопроводном протоколе: данные на D2, питание 5 В, подтяжка 10 кОм между VCC и линией данных (на модулях уже стоит). BMP280 меряет атмосферное давление по I2C: SDA на A4, SCL на A5, адрес 0x76. LCD 1602 с I2C-переходником висит на той же паре A4/A5 — у него адрес другой, 0x27, и шина разводит устройства по адресам сама. В этом вся прелесть I2C для метеостанции: два устройства на двух проводах. Токи скромные: DHT22 берёт около 1,5 мА при опросе, BMP280 — меньше миллиампера, львиную долю съедает подсветка дисплея, 20-30 мА. Вся станция — 30-40 мА, и любой USB-порт или повербанк её тянет.
| Компонент | Что делает | Диапазон | Куда подключён |
|---|---|---|---|
| DHT22 | температура и влажность | −40…+80 °C, 0-100 % | D2, однопроводный протокол |
| BMP280 | атмосферное давление | 300-1200 гПа | I2C: A4 (SDA), A5 (SCL), адрес 0x76 |
| LCD 1602 I2C | вывод: 2 строки по 16 символов | — | I2C: A4/A5, адрес 0x27 |
Прогноз по давлению: пороги, которые реально работают
Барометр прогнозирует не погоду, а её смену: давление падает — пришёл циклон, растёт — уходит. Рабочие пороги такие: минус 3-4 гПа за три часа — с высокой вероятностью осадки; плюс столько же — прояснение; ровное плато в районе нормы (в средней полосе 1010-1020 гПа) — погода стоит. Скетч ниже сравнивает текущее давление с запомненным при старте: для учебного стенда этого достаточно, а в связке с часами разность можно считать честно, за трёхчасовое окно — как добавить DS3231, показывает урок про часы на RTC.
Скетч: DHT22 и BMP280 с выводом на LCD 1602 I2C
В симуляторе соберите стенд из трёх карточек палитры «Макетка»: «Датчик DHT11/DHT22» на пин D2, «Барометр BMP280» и «LCD 1602» на I2C. Код один и тот же для браузера и реальной платы: ползунки двигаются — readTemperature(), readHumidity() и readPressure() возвращают ровно их значения, дисплею всё равно, откуда пришли цифры.
#include <Wire.h>#include <LiquidCrystal_I2C.h>#include <DHT.h>#include <Adafruit_BMP280.h> DHT dht(2, DHT22); // данные DHT22 — на пин D2Adafruit_BMP280 bmp; // I2C: A4=SDA, A5=SCL, адрес 0x76LiquidCrystal_I2C lcd(0x27, 16, 2); // дисплей на той же шине float pStart = 1013.0; // давление при старте — точка отсчётаunsigned long tLast = 0; void setup() { dht.begin(); bmp.begin(); lcd.init(); lcd.backlight(); pStart = bmp.readPressure() / 100.0; // Па -> гПа} void loop() { if (millis() - tLast < 5000) return; // опрос раз в 5 с tLast = millis(); float t = dht.readTemperature(); // °C float h = dht.readHumidity(); // % float p = bmp.readPressure() / 100.0; // гПа float dp = p - pStart; // уход давления от старта lcd.clear(); lcd.setCursor(0, 0); lcd.print(t, 1); lcd.print("C "); lcd.print(h, 0); lcd.print("%"); lcd.setCursor(0, 1); lcd.print(p, 0); lcd.print("hPa "); if (dp < -3) lcd.print("DOZHD"); // упало — жди фронта else if (dp > 3) lcd.print("YASNO"); // растёт — проясняется else lcd.print("RAVNO"); // плато — погода стоит}Два нюанса из практики. Опрашивать DHT22 чаще, чем раз в две секунды, бессмысленно: датчик не успевает пересчитать показания, и вы читаете одно и то же число. А вот BMP280 можно дёргать хоть каждый оборот loop(). В симуляторе двигайте ползунок давления вниз на 4-5 гПа — через пять секунд вторая строка дисплея сменится на DOZHD: прогноз пересчитался без вашего участия.
Проверка в симуляторе: пять минут по шагам
- Откройте симулятор и возьмите в палитре «Макетка» три карточки: «Датчик DHT11/DHT22» (пин D2), «Барометр BMP280» и «LCD 1602» — барометр и дисплей живут на I2C-пинах A4/A5, ползунки карточек читаются скетчем напрямую.
- Вставьте скетч из раздела выше и запустите: на дисплее появятся значения из ползунков — сначала стандартные 22 °C, 40 % и 1013 гПа.
- Крутите ползунок давления вниз на 5 гПа: через пять секунд вторая строка экрана сменится на DOZHD — прогноз пересчитался без правок кода.
- Верните ползунок на место: вернётся RAVNO, и вы увидите, что логика держит плато ровно, без дрожи между состояниями — тот же тест на живой плате делают, подышав на датчик.
Полный вечер на макетку не нужен: откройте симулятор, соберите три компонента из палитры «Макетка» и погоняйте ползунки — станция отвечает в реальном времени. Пара к станции: датчик уровня воды в роли дождемера и урок про метеостанцию DHT с BMP280, где к показаниям добавляется лог на SD-карту.