Портативная метеостанция на Arduino Nano за $10: DHT22, BMP180 и LCD
Компоненты и материалы
| Arduino Nano R3 | 1 |
| Датчик температуры и влажности DHT22 | 1 |
| Датчик давления BMP180 | 1 |
| LCD-дисплей 16x2 с I2C (синий на белом) | 1 |
Необходимые инструменты
| Паяльник |
Приложения и онлайн-сервисы
| Arduino IDE |
О проекте




Недавно в колледже была научная выставка. Учитель попросил подготовить проект за два дня, чтобы показать школьникам основы электроники. Учитывая переменчивый климат (34–40 °C), решил сделать метеостанцию.
Что делает метеостанция?
Собирает данные о погоде и окружающей среде с помощью различных датчиков: ветер, влажность, дождь, температура, давление, высота.
Цель — создать портативную станцию с функциями:
- Температура
- Влажность
- Давление
- Высота
Шаг 1: Закупка компонентов







Список деталей и бюджет:
- DHT22 (температура + влажность) — ~$3.00
- BMP180 (давление) — ~$2.00 (BMP280 дешевле, но в моём регионе дороже)
- Arduino Nano — ~$1.89
- LCD с I2C драйвером — ~$3.00
- Текстолит, разъёмы, пайка
Инструменты: паяльник, кусачки, провода. И немного времени.
Шаг 2: Температура и влажность — DHT22







Популярные датчики: DHT22, DHT11, SHT1x. DHT22 (AM2302) выдаёт калиброванный цифровой сигнал, имеет малый размер, низкое потребление, дальность передачи до 100 м.
Сравнение:
DHT11: дешевый, быстрый старт, дальность 20 м. Погрешность: ±2 °C, ±5% RH. Диапазон 0–50 °C.
DHT22: чуть дороже, плавная кривая, минимальная погрешность, большой диапазон, дальность 20 м. Чувствителен, медленно отслеживает температуру. Идеален для экологического мониторинга.
SHT1x: быстрый отклик, низкое потребление, авто-спящий режим, высокая стабильность. Два цифровых интерфейса, тот же диапазон влажности, что у DHT11. Для тяжёлых условий.
Подключение DHT22:
- VCC → 5V или 3.3V
- GND → GND
- DATA → пин 2 Arduino
Шаг 3: Барометр и датчик давления — BMP180



BMP180 — барометрический датчик с I2C-интерфейсом. Измеряет абсолютное давление, которое меняется с погодой и высотой.
Важно: Мой модуль имел стабилизатор 662k на 3.3V, который я сжёг. Приштал подать 3.3V прямо на чип. Питание выше 3.3V убьёт датчик! Проверьте свой модуль.
Подключение (I2C шина Nano/Uno):
- SDA → A4
- SCL → A5
- VCC → 3.3V
- GND → GND
Физика: давление, высота и погода
Атмосферное давление меняется из-за вращения Земли, наклона оси и других факторов. Падение давления — приближается дождь/шторм (циклон). Рост — ясная погода (антициклон).
Давление также зависит от высоты: на Эвересте (5400 м) оно ниже, чем в Дели (216 м). Для сравнения используют приведённое к уровню моря давление (1013.25 гПа).
Формула высоты:
alti = 44330 * [1 - (p/p0)^(1/5.255)]
где p — текущее давление, p0 — давление на уровне моря (1013.25 гПа). Результат — высота над морем в метрах.
Меры предосторожности:
- Доступ к воздуху: нужен вентиляционный отверстие, но не герметичный корпус.
- Защита от ветра: быстрые потоки создают пульсации давления.
- Теплоизоляция: избегайте быстрых перепадов температуры и близости к нагревательным элементам.
- Сухость: не допускайте попадания влаги.
- Защита от света: кремний чувствителен к свету — закройте отверстие на чипе.
Шаг 4: Сборка схемы







Начинаем с гнезд для Nano: отрезаем и подтачиваем разъёмы, паяем. Затем гнезда для DHT22 (нужен подтягивающий резистор 10 кОм от DATA к GND). Далее BMP180 (питание 3.3V, общая I2C шина). В конце I2C LCD-дисплей на той же шине. (Четвёртый слот оставлен для будущего RTC-модуля.)
Шаг 5: Программирование




Сначала скачайте библиотеки:
- BMP180: GitHub SparkFun
- DHT22: GitHub Adafruit
- Установка библиотек: руководство Arduino
Код тестировался на Arduino IDE 1.6.5 (работает и на более новых).
#include
#include
#include
#include "DHT.h"
#include
SFE_BMP180 pressure;
#define ALTITUDE 20.56
#define I2C_ADDR 0x27 // ваш адрес I2C
#define Rs_pin 0
#define Rw_pin 1
#define En_pin 2
#define BACKLIGHT_PIN 3
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
#define DHTPIN 2
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
float t1, t2;
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);
lcd.home();
lcd.print("Weather Station");
delay(5000);
dht.begin();
pressure.begin();
}
void loop() {
char status;
double T, P, p0, a;
status = pressure.startTemperature();
if (status != 0) {
delay(status);
status = pressure.getTemperature(T);
if (status != 0) {
Serial.print("1");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Baro Temperature: ");
lcd.setCursor(0, 1);
lcd.print(T, 2);
lcd.print(" deg C ");
t1 = T;
delay(3000);
status = pressure.startPressure(3);
if (status != 0) {
delay(status);
status = pressure.getPressure(P, T);
if (status != 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("abslt pressure: ");
lcd.setCursor(0, 1);
lcd.print(P, 2);
lcd.print(" mb ");
delay(3000);
p0 = pressure.sealevel(P, ALTITUDE);
a = pressure.altitude(P, p0);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Altitude: ");
lcd.setCursor(0, 1);
lcd.print(a, 0);
lcd.print(" meters");
delay(3000);
}
}
}
}
float h = dht.readHumidity();
float t = dht.readTemperature();
t2 = t;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Humidity: ");
lcd.setCursor(0, 1);
lcd.print(h);
lcd.print(" %");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DHT Temp: ");
lcd.setCursor(0, 1);
lcd.print(t);
lcd.print(" deg C ");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Mean Temp: ");
lcd.setCursor(0, 1);
lcd.print((t1 + t2) / 2);
lcd.print(" deg C ");
delay(3000);
}
Схемы
Производственный процесс
- Сборка уличной метеостанции на Raspberry Pi 2 и ADS‑WS1
- Создание метеостанции на Raspberry Pi с ежедневными email-отчётами о погоде
- Продвинутая метеостанция v2.0: мониторинг температуры, давления, влажности и высоты в реальном времени
- Сборка DCC-командной станции для модельной железной дороги на Arduino с бесплатным приложением
- Автоматизированная барная станция «6-Сhooter» на Arduino — Собираем коктейльный робот своими руками
- Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
- Создание портативного ёмкостного сенсорного пианино на Arduino: пошаговое руководство
- DIY USB-геймпад на Arduino: собственный высокопроизводительный контроллер
- Портативный дальномер на Arduino Nano: HC-SR04, питание 18650, 3D-корпус
- Pixel Chaser: игра на один тап с NeoPixel Ring и Arduino Nano