Наблюдение за погодой - весьма увлекательное занятие. Я решил построить свою погодную станцию на базе популярного Arduino Nano 3.0.
Прототип метеостанции выглядит так:
Функции моей метеостанции:
- измерение и отображение комнатной и наружной температур;
- измерение и отображение атмосферного давления и тренда его изменения;
- измерение и отображение относительной влажности воздуха;
- отображение текущего времени (часы и минуты);
- отображение текущих фазы Луны и лунного дня;
- передача результатов измерений на компьютер через последовательное соединение;
- передача результатов измерений по протоколу MQTT с помощью приложения на компьютере.
Hex-файл прошивки для Arduino Nano 3.0 (версия от 9 мая 2018 года) - ws.ino.eightanaloginputs.hex.
Как прошить hex-файл в плату Arduino, я описал здесь.
Микроконтроллер Arduino Nano 3.0
"Сердцем" моей метеостанции является микроконтроллер Arduino Nano 3.0 (приобретен на торговой площадке eBay):
Для управления индикацией и опросом датчиков я использую таймер 1 Arduino, вызывающий прерывания с частотой 200 Гц (период - 5 мс).
Индикатор
Для отображения измеряемых показаний датчиков и текущего времени я подключил к Arduino четырехразрядный светодиодный индикатор Foryard FYQ-5643BH с общими анодами (аноды одинаковых сегментов всех разрядов объединены).
Индикатор содежит четыре семисегментных разряда и две разделительные (часовые) точки:
Аноды индикатора подключены через токограничивающие резисторы к выводам Arduino:
разряд |
1 |
2 |
3 |
4 |
вывод |
A3 |
A2 |
D3 |
D9 |
Катоды сегментов подключены к выводам Arduino:
сегмент |
a |
b |
c |
d |
e |
f |
g |
p |
вывод |
D7 |
D12 |
D4 |
D5 |
D6 |
D11 |
D8 |
D13 |
Сегмент индикатора светится, если на аноде соответствующего разряда высокий потенциал (1), а на катоде - низкий (0).
Я использую динамическую индикацию для отображения информации на индикаторе - в каждый момент времени активен только один разряд. Активные разряды чередуются с частотой 200 Гц (период отображения 5 мс). При этом для глаз мерцание сегментов незаметно.
Датчик температуры DS18x20
Для возможности удаленного измерения температуры я подключил датчик DS1820, который обеспечивает измерение наружной температуры в широких пределах. Датчик подключается к шине 1-Wire и имеет три вывода - питание (VCC), данные (DAT), земля (GND):
вывод датчика |
VCC |
DAT |
GND |
вывод Arduino |
5V |
A1 |
GND |
Между выводами VCC и DAT я включил подтягивающий резистор сопротивлением 4,7 кОм.
Для перевода между градусами Цельсия и Фаренгейта можно использовать такую табличку:
Я разместил датчик за окном дома в пластиковом корпусе от шариковой ручки:
\
В профессиональных метеостанциях для защиты термометра от прямых солнечных лучей и обеспечения циркуляции воздуха используется экран Стивенсона (англ. Stevenson screen):
Датчик давления и температуры BMP280
Для измерения атмосферного давления традиционно используют ртутные барометры и барометры-анероиды.
В ртутном барометре атмосферное давление уравновешивается весом столба ртути, высота которого и ипользуется для измерения давления:
В барометре-анероиде используется сжатие и растяжение коробки под действием атмосферного давления:
Для измерения атмосферного давления и комнатной температуры в своей домашней метеостанции я использую датчик BMP280 - маленький SMD-датчик размером 2 x 2,5 мм, основанный на пьезорезистивной технологии:
Платка с датчиком приобретена на торговой площадке eBay:
Датчик подключается к шине I2C (контакт данных - SDA/SDI, контакт синхронизации - SCL/SCK):
вывод датчика |
VCC |
GND |
SDI |
SCK |
вывод Arduino |
3V3 |
GND |
A4 |
A5 |
Для работы с датчиком я использую библиотеку от Adafruit - файлы Adafruit_Sensor.h, Adafruit_BMP280.h, Adafruit_BMP280.cpp.
Единицы измерения атмосферного давления
Датчик через функцию readPressure выдает значение атмосферного давления в паскалях. Основной единицей измерения атмосферного давления служит гектопаскаль (гПа) (1 гПа = 100 Па), аналогом которого является внесистемная единица "миллибар" (мбар) (1 мбар = 100Па = 1гПа). Для перевода между часто используемой внесистемной единицей измерения давления "миллиметр ртутного столба" (мм рт. ст.) и гектопаскалями используются соотношения:
1гПа = 0,75006 мм рт. ст. ≈ 3/4 мм рт.ст.; 1 мм рт.ст. =1,3332 гПа ≈ 4/3 гПа.
Зависимость атмосферного давления от высоты над уровнем моря
Атмосферное давление может быть представлено как в абсолютной, так и в относительной форме.
Абсолютное давление QFE (англ. absolute pressure) – это актуальное атмосферное давление, не учитывающее поправку над уровнем моря.
Атмосферное давление уменьшается примерно на 1 гПа при повышении высоты на 1 м:
Барометрическая формула позволяет определить коррекцию показаний барометра для получения относительного давления (в мм рт. ст.):
$\Delta P = 760 \cdot (1 - {1 \over {10^ { {0,0081350 \cdot H} \over {T + 0,00178308 \cdot H} }}})$ ,
где $T$ - средняя температура воздуха по шкале Ранкина, °Ra, $H$ - высота над уровнем моря, футы.
Перевод градусов Цельсия в градусы Ранкина:
$^{\circ}Ra = {^{\circ}C \cdot 1,8} + 491,67$
Барометрическая формула используется при барометрическом нивелировании - определении высот (с погрешностью 0,1 - 0,5 %). В формуле не учитывается влажность воздуха и изменение ускорения свободного падения с высотой. Для небольших перепадов высоты эту экспоненциальную зависимость можно с достаточной точностью аппроксимировать линейной зависимостью.
Относительное давление QNH (англ. relative pressure, Q-code Nautical Height) – это атмосферное давление, учитывающее поправку к среднему уровню моря (англ. Mean Sea Level, MSL) (для ISA и температуры 15 градусов Цельсия), и первоначально выставляется с учётом высоты, на которой находится метеостанция. Его можно узнать из данных метеослужбы, показаний откалиброванных приборов в публичных местах, аэропорту (из сводок METAR), из Интернета.
Например, для расположенного рядом аэропорта Гомель (UMGG) я могу посмотреть сводку фактической погоды METAR на ru.allmetsat.com/metar-taf/russia.php?icao=UMGG:
UMGG 191800Z 16003MPS CAVOK M06/M15 Q1014 R28/CLRD// NOSIG ,
где Q1014 - давление QNH на аэродроме равно 1014 гПа.
Историю сводок METAR можно получить на aviationwxchartsarchive.com/product/metar.
За нормальное относительное давление воздуха QNH принимается давление 760 мм рт. ст. или 1013,25 гПа (при температуре 0ºС, под широтой 45º Северного или Южного полушария).
Я выставил для барометра-анероида давление QNH с помощью винта настройки чуткости:
Прогноз погоды
Анализ изменения давления позволяет строить прогноз погоды, причем его точность тем выше, чем более резко меняется давление. Например, старое эмпирическое правило мореплавателей гласит - падение давления на 10 гПа (7,5 мм рт. ст.) за период 8 часов говорит о приближении сильного ветра.
Откуда же возникает ветер? Воздух стекается к центру области низкого давления, возникает ветер - горизонтальное перемещение воздуха из областей высокого давления в области низкого давления (высокое атмосферное давление выдавливает воздушные массы в область низкого атмосферного давления). Если давление очень низкое, ветер может достигать силы шторма. При этом в области пониженного давления (барическая депрессия или циклон) теплый воздух поднимается вверх и формирует облака, которые часто приносят дождь или снег.
За направление ветра в метеорологии принимается направление, откуда дует ветер:
Это направление сводится к восьми румбам.
Для предсказания погоды на основе атмосферного давления и направления ветра часто используется алгоритм Zambretti.
Датчик влажности
Для определения относительной влажности воздуха я использую модуль DHT11 (приобретен на торговой площадке eBay):
Датчик влажности DHT11 имеет три вывода - питание (+), данные (out), земля (-):
вывод датчика |
+ |
out |
- |
вывод Arduino |
5V |
D10 |
GND |
Для работы с датчиком я использую библиотеку от Adafruit - файлы DHT.h, DHT.cpp.
Влажность воздуха характеризует количество водяного пара, содержащегося в воздухе. Относительная влажность показывает долю влаги в воздухе (в процентах) по отношению к максимальному возможному количеству при текущей температуре. Для измерения относительной влажности служит гигрометр:
Для человека оптимальный интервал влажности воздуха - 40 ... 60 %.
Часы реального времени
В качестве часов реального времени я применил модуль RTC DS1302 (платка с часиками приобретена на торговой площадке eBay):
Модуль DS1302 подключается к шине 3-Wire. Для использования этого модуля совместно с Arduino разработана библиотека iarduino_RTC (от iarduino.ru).
Плата с модулем DS1302 имеет пять выводов, которые я соединил с выводами платы Arduino Nano:
вывод RTC |
VCC |
GND |
RST |
CLK |
DAT |
вывод Arduino |
5V |
GND |
D2 |
D1 |
D0 |
Для сохранения верных показаний часов при отключенном питании в гнездо на плате я вставил батарейку CR2032.
Точность моего часового модуля оказалась не слишком высокой - часы спешат примерно на одну минуту за четверо суток. Поэтому я сделал сброс минут на "ноль" и часа на ближайший при удержании кнопки, подключенной к выводу A0 Arduino, после включения питания метеостанции. После инициализации вывод A0 используется для передачи данных через последовательное соединение.
Передача данных на компьютер и работа по протоколу MQTT
Для передачи данных через последовательное соединение к Arduino подключается USB-UART преобразователь:
вывод преобразователя |
RXD |
GND |
вывод Arduino |
A0 |
GND |
Вывод Arduino используется для передачи данных в формате 8N1 (8 бит данных, без бита четности, 1 стоп-бит) со скоростью 9600 бит/с. Данные передаются пакетами, причем длина пакета - 4 символа. Передача данных осуществляется в "bit-bang" режиме, без использования аппаратного последовательного порта Arduino.
Формат передаваемых данных:
Параметр |
1-й байт |
2-й байт |
3-й байт |
4-й байт |
наружная температура |
o |
пробел либо минус |
десятки градусов либо пробел |
единицы градусов |
комнатная температура |
i |
пробел либо минус |
десятки градусов либо пробел |
единицы градусов |
атмосферное давление |
p |
сотни мм р. ст . |
десятки мм рт.ст. |
единицы мм рт. с. |
относительная влажность |
h |
пробел |
десятки процентов либо пробел |
единицы процентов |
текущее время |
десятки часов |
единицы часов |
десятки минут |
единицы минут |
MQTT
Я разработал на языке программирования Golang приложение - клиент протокола MQTT, отправляющую принятую от метеостанции информации на сервер (MQTT-брокер) cloudmqtt.com:
Сервис CloudMQTT позволяет создать акаунт с бесплатным тарифным планом "Cute Cat" (ограничения: 10 соединений, 10 Кб/с):
Для мониторинга показаний метеостанции при этом можно использовать Android-приложение MQTT Dash:
Питание
Для питания метеостанции я использую зарядное устройство от старого мобильного телефона Motorola, выдающее напряжение 5 В с током до 0,55 А и подключаемое к контактам 5V (+) и GND (-):
Также можно использовать для питания батарейку напряжением 9 В, подключаемую к контактам VIN (+) и GND (-).
Эксплуатация метеостанции
При запуске происходит инициализация и проверка датчиков.
При отсутствии датчика DS18x20 выдается ошибка "E1", при отсутствии датчика BMP280 - ошибка "E3".
Затем запускается рабочий цикл метеостанции:
- измерение и отображение наружной температуры;
- измерение и отображение комнатной температуры;
- измерение и отображение атмосферного давления и тренда его изменения;
- измерение и отображение относительной влажности воздуха;
- отображение текущего времени;
- отображение фазы Луны и лунного дня.
Видео работы моей метеостанции доступно на моем YouTube-канале: https://youtu.be/vVLbirO-FVU
Отображение температуры
При измерении температуры индицируется две цифры температуры и для отрицательной температуры знак "минус" (с символом градуса в крайнем правом разряде);
для наружной температуры знак градуса отображается вверху:
для комнатной температуры - внизу:
Отображение давления
При измерении давления индицируются три цифры давления в мм ртутного столба (с символом "P" в крайнем правом разряде):
Если давление резко упало, то вместо символа "P" в крайнем правом разряде отображается символ "L", если резко выросло - то "H". Критерий резкости изменения - 8 мм рт. ст. за 8 часов:
Так как моя метеостанция отображает абсолютное давление (QFE), то показания оказываются несколько заниженными по сравнению со сведениями в сводке METAR (в которой приводится QNH) (14 UTC 28 марта 2018 года):
BMP280 |
сводка METAR (для UMGG) |
ATIS (для UMGG) |
749 мм рт.ст. (999 гПа) |
UMGG 281400Z Q1015
1015 гПа
|
998 QNH 1015
QFE = 998 гПА, QNH = 1015 гПа
|
Отношение давлений (по сведениями ATIS) составило ${1015 \over 998} = 1,017$. Возвышение аэропорта Гомель (код ИКАО UMGG) над уровнем моря составляет 143,6 м. Температура по данным ATIS составляла 1 °C.
Показания моей метеостанции практически совпали с абсолютным давлением QFE по сведениями ATIS!
Максимальное/минимальное давления (QFE), зарегистрированные моей метеостанцией за все время наблюдений:
771 мм рт. ст.
|
29 ноября 2018 года
|
-
|
730 мм рт. ст.
|
2 апреля 2024 года |
- |
Отображение относительной влажности воздуха
Относительная влажность воздуха отображается в процентах (в двух правых разрядах отображается символ процента):
Отображение текущего времени
Текущее время отображается на индикаторе в формате "ЧЧ:ММ", причем разделительное двоеточие мигает раз в секунду:
Отображение фаз Луны и лунного дня
Первые два разряда индикатора отображают текущую лунную фазу, а следующие два - текущий лунный день:
У Луны выделяются восемь фаз (приведены английские и русские (синим цветом - неточные) названия):
На индикаторе фазы отображаются пиктограммами:
фаза |
пиктограмма |
новолуние |
|
растущий серп (полумесяц) |
|
первая четверть |
|
растущая выпуклая Луна |
|
полнолуние |
|
убывающая выпуклая Луна |
|
последняя четверть |
|
убывающий серп (полумесяц) |
|
Передача данных на компьютер
Если соединить метеостанцию с USB-UART преобразователем (например, на базе микросхемы CP2102), подключенным к USB-порту компьютера, то можно с помощью терминальной программы наблюдать передаваемые метеостанцией данные:
Я разработал на языке программирования golang программу, ведущую журнал метеонаблюдений и отправляющую данные в сервис CloudMQTT, и их можно просматривать на Android-смартфоне с помощью приложения MQTT Dash:
По данным журнала метеонаблюдений можно, например, строить график изменения атмосферного давления:
пример графика с заметным минимумом давления
пример графика с незначительным ростом давления
Планируемые доработки:
- добавление датчиков направления и скорости ветра
В метеостанциях для измерения скорости ветра используется трехчашечный анемометр (1), а для определения направления ветра - флюгер (2):
Также для измерения скорости ветра используются термоанемометры с нитью накала (англ. hot wire anemometer). В качестве нагреваемой проволоки можно использовать вольфрамовую нить накала от лампочки с разбитым стеклом. В промышленно выпускаемых термоанемометрах датчик обычно располагается на телескопической трубке:
Принцип действия этого прибора заключается в том, что тепло отводится от нагревательного элемента вследствие конвекции воздушным потоком - ветром. При этом сопротивление нити накала определяется температурой нити. Закон изменения сопротивления нити накала $R_T$ от температуры $T$ имеет вид:
$R_T = R_0 \cdot (1 + {\alpha \cdot (T - T_0)})$ ,
где $R_0$ - сопротивление нити при температуре $T_0$, $\alpha$ - температурный коэффициент сопротивления (для вольфрама $\alpha = 4,5\cdot{10^{-3} {^{\circ}{C^{-1}}}}$).
С изменением скорости воздушного потока изменяется температура при неизменном токе накала (анемометр с постоянным током, англ. CCA). Если температура нагревательного элемента поддерживается постоянной, то ток через элемента будет пропорционален скорости воздушного потока (анемометр с постоянной температурой, англ. CTA).
Продолжение следует