Моя самодельная домашняя метеостанция на Arduino Nano

Наблюдение за погодой - весьма увлекательное занятие. Я решил построить свою погодную станцию на базе популярного 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):
Arduino Nano 3.0

Для управления индикацией и опросом датчиков я использую таймер 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 кОм.

Для перевода между градусами Цельсия и Фаренгейта можно использовать такую табличку:
перевод градусов Цельсия и Фаренгейта

Я разместил датчик за окном дома в пластиковом корпусе от шариковой ручки:
DS1820\

В профессиональных метеостанциях для защиты термометра от прямых солнечных лучей и обеспечения циркуляции воздуха используется экран Стивенсона (англ. Stevenson screen):
экран Стивенсона

Датчик давления и температуры BMP280

Для измерения атмосферного давления традиционно используют ртутные барометры и барометры-анероиды.

В ртутном барометре атмосферное давление уравновешивается весом столба ртути, высота которого и ипользуется для измерения давления:
ртутный барометр

В барометре-анероиде используется сжатие и растяжение коробки под действием атмосферного давления:
барометр-анероид

Для измерения атмосферного давления и комнатной температуры в своей домашней метеостанции я использую датчик BMP280 - маленький SMD-датчик размером 2 x 2,5 мм, основанный на пьезорезистивной технологии:
датчик BMP280
Платка с датчиком приобретена на торговой площадке eBay:
BMP280

Датчик подключается к шине 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

Датчик влажности DHT11 имеет три вывода - питание (+), данные (out), земля (-):

вывод датчика + out -
вывод Arduino 5V  D10 GND

Для работы с датчиком я использую библиотеку от Adafruit - файлы DHT.h, DHT.cpp.

Влажность воздуха характеризует количество водяного пара, содержащегося в воздухе. Относительная влажность показывает долю влаги в воздухе (в процентах) по отношению к максимальному возможному количеству при текущей температуре. Для измерения относительной влажности служит гигрометр:
гигрометр

Для человека оптимальный интервал влажности воздуха - 40 ... 60 %.

показывает, сколько влаги содержится в воздухе по отношению к максимально возможному количеству водяного пара в этой воздушной массе при конкретной температуре. - Читайте подробнее на SYL.ru: https://www.syl.ru/article/177992/new_otnositelnaya-i-absolyutnaya-vlajnost---chto-eto-takoe
относительная влажность воздуха. Это относительная величина, которая показывает, сколько влаги содержится в воздухе по отношению к максимально возможному количеству водяного пара в этой воздушной массе при конкретной температуре. - Читайте подробнее на SYL.ru: https://www.syl.ru/article/177992/new_otnositelnaya-i-absolyutnaya-vlajnost---chto-eto-takoe
тносительная влажность воздуха. Это относительная величина, которая показывает, сколько влаги содержится в воздухе по отношению к максимально возможному количеству водяного пара в этой воздушной массе при конкретной температуре. - Читайте подробнее на SYL.ru: https://www.syl.ru/article/177992/new_otnositelnaya-i-absolyutnaya-vlajnost---chto-eto-takoe

Часы реального времени

В качестве часов реального времени я применил модуль RTC DS1302 (платка с часиками приобретена на торговой площадке eBay):
часы реального времени RTC

Модуль 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
Сервис CloudMQTT позволяет создать акаунт с бесплатным тарифным планом "Cute Cat" (ограничения: 10 соединений, 10 Кб/с):
Cute Cat

Для мониторинга показаний метеостанции при этом можно использовать Android-приложение MQTT Dash:
MQTT Dash

Питание

Для питания метеостанции я использую зарядное устройство от старого мобильного телефона Motorola, выдающее напряжение 5 В с током до 0,55 А и подключаемое к контактам 5V (+) и GND (-):
блок питания метеостанции
Также можно использовать для питания батарейку напряжением 9 В, подключаемую к контактам VIN (+) и GND (-).

Эксплуатация метеостанции

При запуске происходит инициализация и проверка датчиков.

При отсутствии датчика DS18x20 выдается ошибка "E1", при отсутствии датчика BMP280 - ошибка "E3".

Затем запускается рабочий цикл метеостанции:

  • измерение и отображение наружной температуры;
  • измерение и отображение комнатной температуры;
  • измерение и отображение атмосферного давления и тренда его изменения;
  • измерение и отображение относительной влажности воздуха;
  • отображение текущего времени;
  • отображение фазы Луны и лунного дня.

YouTube
Видео работы моей метеостанции доступно на моем 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 года

-

733 мм рт. ст.
метеостанция своими руками
12 мая 2020 года -

Отображение относительной влажности воздуха

Относительная влажность воздуха отображается в процентах (в двух правых разрядах отображается символ процента):
измерение влажности воздуха

Отображение текущего времени

Текущее время отображается на индикаторе в формате "ЧЧ:ММ", причем разделительное двоеточие мигает раз в секунду:
метеостанция на Arduino

Отображение фаз Луны и лунного дня

Первые два разряда индикатора отображают текущую лунную фазу, а следующие два - текущий лунный день:
погодная станция на Arduino

У Луны выделяются восемь фаз (приведены английские и русские (синим цветом - неточные) названия):
фазы Луны

На индикаторе фазы отображаются пиктограммами:

фаза пиктограмма
новолуние новолуние
растущий серп (полумесяц) растущий серп
первая четверть первая четверть
растущая выпуклая Луна растущая выпуклая Луна
полнолуние полнолуние
убывающая выпуклая Луна убывающая выпуклая Луна
последняя четверть последняя четверть
убывающий серп (полумесяц) убывающий серп

Передача данных на компьютер

Если соединить метеостанцию с USB-UART преобразователем (например, на базе микросхемы CP2102), подключенным к USB-порту компьютера, то можно с помощью терминальной программы наблюдать передаваемые метеостанцией данные:
метеостанция

Я разработал на языке программирования golang программу, ведущую журнал метеонаблюдений и  отправляющую данные в сервис CloudMQTT, и их можно просматривать на Android-смартфоне с помощью приложения MQTT Dash:
метеостанция с MQTT

По данным журнала метеонаблюдений можно, например, строить график изменения атмосферного давления:
пример графика с заметным минимумом давления
домашняя метеостанция
пример графика с незначительным ростом давления
самодельная метеостанция

Планируемые доработки:

  • добавление датчиков направления и скорости ветра

В метеостанциях для измерения скорости ветра используется трехчашечный анемометр (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).

Продолжение следует

Яндекс.Метрика