Метеостанция своими руками (Погодная станция). Комнатная метеостанция Датчик давления и температуры

Сегодня, чтобы собрать рабочий прототип базовой домашней метеостанции не нужно обладать сильными навыками программирования (в нашем случае и подавно) или схемотехники. Достаточно умения «гуглить» и толики желания сделать что-то своими руками. В этом материале я расскажу и покажу, как за вечер собрать домашнюю метеостанцию с подключением к сети. Базовый бюджет - всего 10 долларов.

Текст может содержать и наверняка содержит грамматические, орфографические, пунктуационные и другие виды ошибок, включая смысловые. Я всячески прошу читателей указывать на эти ошибки с помощью системы ORPHUS. Для этого достаточно выделить необходимый участок текста и нажать комбинацию клавиш CTRL+Enter.

Базовый набор комплектующих

Основой нашего будущего устройства является отладочная плата NodeMCU на базе модуля ESP8266. Я взял ее на Gearbest , но при желании вы можете поискать оную и на других площадках.

Для соединения модулей можно использовать шлейф с BLS-разъемами ($0.9) или беспаечную макетную плату с набором соединительных проводов ($3.74).

Подключение и настройка

Несмотря на доступные 4 вывода, подключается наш датчик всего по 3 проводам: питание +5В (1 вывод), земля (4) и линия передачи данных (2). Питание для датчика берем либо с пина VUSB, либо с 3V, если первого на вашей плате не оказалось. Линию данных подключаем к порту GPIO14 (пин D5).

Напомню, что навыков программирования в нашем случае не нужно абсолютно никаких. Прошивку для модуля будем генерировать с помощью сайта WiFi-IoT.ru , автором которого является Максим Малкин, также известный по проекту домашней автоматизации homes-smart.ru . Для начала попросту регистрируемся на WIFi-IoT и подтверждаем почту.

Перед сборкой прошивки необходимо подготовить приобретенный модуль к работе и очистить его от возможного предустановленного китайского ПО. Для этого нам понадобится рабочий USB-microUSB кабель и компьютер или виртуальная машина с Windows. После регистрации на сайте вы попадете на англоязычную страницу «Getting started » с пояснениями по подготовке модуля к работе. Скачивайте файлы с ПО из первых двух пунктов инструкции.

Теоретически, после подключения модуля к компьютеру, Windows должна сама отыскать драйвера и установить их. На случай, если этого не произойдет, попробуйте идентифицировать на плате микросхему (отличается большим количеством «ножек») возле microUSB порта. Вероятнее всего это будут CP2102 или CH340 (драйвера к ним доступны по ссылкам).

После установки драйверов повторно подключаем нашу плату к компьютеру и запускаем программу NodeMCU Flasher, которую скачали ранее. В выпадающим списке выбираем присвоенный нашему устройству COM-порт. Скорее всего он будет один, в противном случае его номер можно уточнить в диспетчере устройств Windows. Во вкладке Config указываем расположение загруженного ранее blank-файла с расширением.bin.

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

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

  • «DHT22» - это наш датчик температуры и влажности;
  • «Время и NTP» - для отображения времени в веб-интерфейсе;
  • «Настройки по умолчанию». Нажимаем шестеренку возле этого пункта и вводим логин и пароль от точки доступа, к которой будет подключен модуль. Остальные пункты пока не трогаем.

Нажимаем клавишу «Скомпилировать» внизу страницы и на выходе получаем готовое к установке ПО. Скачиваем одним файлом.

Далее повторяется процесс с прошивкой blank-файла, только вместо него выбираем уже загруженную на компьютер прошивку. После завершения процесса полностью перезагружаем модуль (отключаем и подключаем заново USB-кабель) и отправляемся в админ-панель роутера в поисках модуля. Так как мы не использовали предварительное присвоение статического IP, роутер должен сам выдать ему адрес. Напомню, что админ-панель обычно находится по адресу 192.168.0.1 или 192.168.1.1. Моему модулю роутер выдал адрес 192.168.1.142. После перехода по этому IP попадаем в веб-интерфейс нашей метеостанции. Предварительно необходимо будет ввести стандартный логин «esp8266» и пароль «0000» во всплывающем окне.

Теперь нужно указать модулю к какому порту подключен датчик, чтобы первый смог считывать его показания. Делается это на странице «Hardware». Соответствующей отметкой активируем первый датчик, а в строке GPIO указываем 14-й порт. Произойдет инициализация и на главной странице интерфейса появится отображение температуры и влажности. Ура!

Напоследок не забудьте на странице «Main» изменить пароль для входа в систему и часовой пояс для отображения времени. Также необходимо перевести модуль на статический IP-адрес (кнопка внизу страницы), чтобы после перезагрузки роутера ваша метеостанция не «потерялась». Если разбираетесь в настройках своего роутера, то лучше сделать бессрочную аренду IP-адреса для модуля, вместо установки статического IP.

Прототип готов, теперь перейдя по установленному IP-адресу можно посмотреть температуру и влажность в месте, где вы установили датчик.

Подключение метеостанции к сервису метрик Thingspeak.com

Но просто смотреть температуру не интересно. Необходима визуализация данных, чтобы можно было проследить какие-то тенденции в изменении показаний. Для этого регистрируемся в сервисе метрик Thingspeak.com и в своем профиле создаем новый канал.

На открывшееся странице заполняем название канала, отмечаем первых два поля field и записываем туда значения «temp» (первое поле) и «humidity / temp» (второе).

Теперь снова займемся модулем. В конструкторе прошивок в дополнение ко всем предыдущим отметкам добавляем «Thingspeak.com», компилируем прошивку и прошиваем по аналогии. К сожалению, все настройки на модуле придётся произвести заново, т.к. OTA-обновления с сохранением оных доступны только в платной версии ПО (цена вопроса всего 100 рублей на модуль).

Возвращаемся на страницу созданного нами канала в сервисе Thingspeak.com и открываем вкладку «Api Keys». Нам понадобится код из поля «Write Api Key». Его нужно скопировать и вставить в соответствующее поле на странице «Servers» в веб-интерфейсе нашей метеостанции, предварительно не забыв установить отметку на «Enable Thingspeak.com send.».

Показания будут отправляться каждые 5 минут. А выглядеть это в итоге будет следующим образом:

Внешний вид графиков поддается редактированию, так что вы вольны творить! 🙂

Итоги

Наверное кто-то спросит: «Почему итоговый результат отличается от представленного на приведенной выше и заглавной картинках?». Как минимум потому, что информации в этом материале новичкам в теме точно хватит на вечер-другой, а подключение дисплея и барометра потребуют наличия базовых навыков пайки и соответствующего оборудования. Если вы заинтересованы в дальнейшем совершенствовании метеостанции и моих заметках по этой теме, то обязательно напишите об этом в комментариях.

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

  • На солнечных батареях, с аккумулятором для работы в ночное время
  • Компактная по размеру, с простым способом монтажа
  • Возможность выгрузки данных в сети WeatherUnderground
  • Измерение температуры, влажности, давления воздуха, ультрафиолетового излучения

В процессе разработки удалось решить большинство этих требований. В настоящее время метеостанция имеет термометр, гигрометр, УФ-излучения и датчик давления. Являясь частью сети WeatherUnderground, метеорологическая станция помогает предсказывать местную погоду. Вот полная схема метеорологической станции, увеличить которую можно сохранив на своём ПК:

Метеостанции потребляет 1 миллиампер. Резервный аккумулятор тут всего лишь 1000 м/ч — литий-полимерная батарея. По сравнению со старыми метеостанциями где батареи герметичные свинцово-кислотные на 5 А/ч — это прогресс. Размеры печатной платы 100 мм х 75 мм и вот как она выглядела, когда всё было сделано на макетке, а следующее фото в готовом виде:

Блок на 433 МГц обеспечивает беспроводную связь для обмена данных. На данный момент устройство прикрепляется непосредственно на крыше, и выкладывает данные на WeatherUnderground каждые 11 минут.

Питание схемы выполнено с помощью регулятора напряжения MAX604. Этот регулятор был довольно дорогим ($7.00), но зато имел очень малое падение напряжения, что делает его очень эффективным. Тут использован этот регулятор, чтобы 3,7-4,2 вольтовую батарею Li-po батарею преобразовать в идеальные 3.3 В.

Для того чтобы зарядить аккумулятор, установлен TP4056 модуль. Этот модуль является очень эффективным, и он способен работать от 5 В входного питания. Ещё в наличии была небольшая, 5 В солнечная панель, которая в состоянии зарядить аккумулятор через TP4056 даже при недостаточном освещении.

Для того чтобы загрузить данные в сеть, пришлось писать специальное приложение для компьютера. Программное обеспечение было написано на C# с помощью Visual Studio. Скачать файлы проекта вы можете в .

РУКОВОДСТВО ПО СОЗДАНИЮ ПРОСТОЙ ДОМАШНЕЙ МЕТЕОСТАНЦИИ СВОИМИ СИЛАМИ

Если целый день или вообще круглосуточно включен компьютер, его можно использовать для работы домашней метеостанции. Поставлена цель создать простую и недорогую метеостанцию, в которой будет задействован персональный компьютер (ПК). ПК выступает в роли считывателя, обработчика и отправителя на сайт "Метеопост" измеренных метеорологических данных. Связь между компьютером и измерительным блоком будет осуществляться по сети 1-Wire.

Состав измерительного комплекса
1. Персональный компьютер с операционной системой Windows XP и выше и наличием свободного COM порта.
2. Адаптер для COM порта (преобразователь 1wire - RS232)
3. 4-х жильный Ethernet кабель типа "витая пара", длины должно хватить от COM порта до измерительного блока
4. Блок питания на 5В постоянного тока с хорошей стабилизацией напряжения
5. Измерительный блок (установлен на улице)
6. Программное обеспечение для ПК - приложение "Метеостанция".

ВАРИАНТ №1 - ОДИН ДАТЧИК

Сначала рассмотрим самый простой вариант - это метеостанция с одним датчиком температуры. Для этого не нужен дополнительный блок питания (п.4). И система очень упрощается. Адаптер для COM порта (п.2) можно выполнить по такой схеме. Адаптер состоит из двух стабилитронов на 3.9В и 6.2В, двух диодов Шотки и одного резистора.

Схема адаптера для COM порта


Адаптер в корпусе D-SUB

Место пайки кабеля и датчика температуры, включительно и выводы датчика нужно хорошо защитить от влаги. Лучше всего применить клей на полиуретановой основе.


Гидроизоляция выводов датчика

Эта система обеспечит мониторинг температуры с точностью до десятых градуса. При этом в окне приложения будет виден график зависимости температуры воздуха от времени и иконка в трее будет всегда показывать текущую температуру. Приложение позволяет задавать интервал измерений.

СТОИМОСТЬ РАДИОДЕТАЛЕЙ - не выше 50 грн.

ВАРИАНТ №2 - ЧЕТЫРЕ ДАТЧИКА

Более сложная метеостанция с четырьмя датчиками: температура, влажность, освещенность, давление. Поскольку только датчик температуры будет цифровой, а остальные аналоговые - в системе используется четырехканальный АЦП ds2450. Этот АЦП поддерживает протокол 1-wire. Схема требует дополнительного источника питания. Источник питания должен обеспечивать высокую стабильность напряжения. Но поскольку схема выше описанного адаптера имеет недостаток - невозможность подключения к датчикам внешнего источника питания из-за отсутствия реальной массы (-), используем другую схему адаптера. Этот адаптер также умещается в корпусе разъема COM порта типа D-SUB. Теперь в кабеле задействованы три провода: масса (-), +5в и данные.


Схема адаптера для COM порта с внешним питанием

Схема измерительного блока вполне может быть выполнена даже на макетной плате. Нужно только уделить особое внимание гидроизоляции контактов. Самый простой способ это расплавить парафин и кисточкой нанести его во все оголенные места на плате. Если плата будет незащищенной от воды, будут утечки напряжения и будет много ошибок в измерениях. В нашем случае даже сотые доли Вольта существенно влияют на результаты.


Схема измерительного блока

Измерительный блок нужно разместить в корпусе и таком, чтобы плата и датчики были защищены от прямого воздействия осадков и солнечного излучения. Для этих целей хорошо подходит коробка из плотного пенопласта. В стенках коробки (дно и стенка с теневой стороны) нужно сделать побольше отверстий для вентиляции. Стенки коробки изнутри желательно обклеить алюминиевой фольгой для дополнительной защиты от инфракрасного излучения, иначе будет погрешность измерения температуры. Все датчики, кроме освещенности, размещаются прямо на плате. Датчик освещенности (фоторезистор) выносится из платы на проводах и устанавливается в отверстии дна пенопластового корпуса. Так, чтобы поверхность датчика смотрела вниз. В таком случае на датчик не будут попадать осадки и особенно зимой это убережет его от обледенения. Датчик освещенности для гидроизоляции нужно обработать, например, прозрачным клеем на полиуретановой основе (силиконовый герметик тест не прошел, он давал утечку тока). Обработать включительно (!) и светочувствительную зону фоторезистора. Выводы датчика залить клеем и разместить их можно в изоляционной трубочке. Концы выводов припаять к маленькой плате. А уже провода от измерительного блока припаять к этой плате. Места пайки залить парафином. Иначе, когда идет проливной дождь с ветром, метеостанция может оказаться неработоспособной и придется разбирать ее и все высушивать. Блок можно соединить с кабелем с помощью разъема. Но нужно использовать специальный влагозащитный разъем - система будет работать в сложных погодных условиях.

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


Измерительный блок на кронштейне

Выходное напряжение блока питания (БП) должно быть в пределах 4.8-5.3В. Подойдет и зарядка от старого телефона. Однако если в блоке питания нет стабилизатора - нужно добавить его в блок питания, т.к. для точности измерений очень важно наличие стабильного напряжения. Можно хотябы проверить тестером - изменяются ли десятые или сотые волта на выходе БП. Скачки десятых волта не допускаются. Простая схема стабилизатора на 5в приведена ниже. На входе БП может быть от 7 до 17В. На выходе будет около 5В. После этого нужно подключить наш кабель (который идет к измерительному блоку) к БП и измерить напряжение тестером на другом конце кабеля. Это напряжение может быть несколько ниже, чем непосредственно на выходе БП, из-за сопротивления кабеля. Это измеренное напряжение нужно ввести в настройках приложения как "Напряжение питания датчиков".


Типичная схема стабилизатора напряжения

СТОИМОСТЬ КОМПЛЕКТУЮЩИХ ДЛЯ МЕТЕОСТАНЦИИ

Примерная стоимость радиодеталей (цены 2015 года по магазину ).
1. Датчик температуры ds18b20 - 25 грн
2. АЦП ds2450 - 120 грн
3. Фоторезистор LDR07 - 6 грн
4. Датчик влажности HIH-5030 - 180 грн
5. Датчик давления MPX4115A- 520 грн.
ВСЕГО: 850 грн или 37$

Остальные элементы в сумме стоят не выше 50 грн, блок питания можно взять, например, со старой "зарядки" для телефона.


Маркировка радиоэлементов

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ДЛЯ МЕТЕОСТАНЦИИ

Мы разработали приложение для Windows, которое предоставим бесплатно любому желающему собрать такую метеостанцию. Оно позволит вам на своем ПК наблюдать за погодой.


Окно приложения для ПК

В системном трее отображается температура воздуха

Все измеренные данные приложение может отправлять на наш сервер "Метеопост" и на специальной странице (пример) можно просматривать все метеоданные с браузера ПК. Также страница адаптирована и для браузера мобильного телефона.


Снимок экрана браузера мобильного телефона

ЗАКЛЮЧЕНИЕ
Можно сэкономить на стоимости деталей, если покупать их у китайцев на AliExpress. Возможно собрать метеостанцию без любого из датчиков, за исключением датчика температуры. У нашего АЦП остался один свободный вход, поэтому на него можно еще подать сигнал от датчика ветра. Но поскольку мы находимся в городе - установить и протестировать такой датчик нам попросту негде. В городской застройке не будет адекватного измерения скорости и направления ветра. Способы самостоятельного изготовления датчика скорости ветра подробно описаны многими энтузиастами в сети. Заводской датчик стоит довольно дорого.

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

Мы попытались создать именно доступную, дешевую метеостанцию. В частности для этого в системе задействован компьютер. Если его исключить, то нужно делать еще блок индикации, блок передачи данных в сеть и т.д, что существенно прибавит в цене. Например, сейчас популярная "Netatmo Weather Station" с подобными измеряемыми параметрами стоит около 4000 грн (200$).

Всем желающим сделать себе такую метеостанцию готовы помочь консультациями. Также предоставим необходимое программное обеспечение и подключим вашу станцию к нашему сайту.

Наблюдение за погодой - весьма увлекательное занятие. Я решил построить свою погодную станцию на базе популярного .

Прототип метеостанции выглядит так:

Функции моей метеостанции:

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


Hex
-файл
прошивки для (версия от 9 мая 2018 года) - .
Как прошить hex -файл в плату Arduino , я описал .

Микроконтроллер 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

Для возможности удаленного измерения температуры я подключил датчик , который обеспечивает измерение наружной температуры в широких пределах. Датчик подключается к шине 1-Wire и имеет три вывода - питание (VCC ), данные (DAT ), земля (GND ):

вывод датчика VCC DAT GND
вывод Arduino 5V A1 GND

Между выводами VCC и DAT я включил подтягивающий резистор сопротивлением 4,7 кОм.

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

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

\

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

Датчик давления и температуры 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 преобразователь:

Вывод Arduino используется для передачи данных в формате 8N1 (8 бит данных, без бита четности, 1 стоп-бит) со скоростью 9600 бит/с. Данные передаются пакетами, причем длина пакета - 4 символа. Передача данных осуществляется в "bit-bang " режиме, без использования аппаратного последовательного порта Arduino .

Формат передаваемых данных:

Параметр 1-й байт 2-й байт 3-й байт 4-й байт
наружная температура o пробел либо минус десятки градусов либо пробел единицы градусов
комнатная температура i пробел либо минус десятки градусов либо пробел единицы градусов
атмосферное давление p сотни мм р. ст. десятки мм рт.ст. единицы мм рт. с.
относительная влажность h пробел десятки процентов либо пробел единицы процентов
текущее время десятки часов единицы часов десятки минут единицы минут

MQTT

Golang приложение - клиент протокола MQTT , отправляющую принятую от метеостанции информации на сервер (MQTT -брокер) :

Сервис позволяет создать акаунт с бесплатным тарифным планом "" (ограничения: 10 соединений, 10 Кб/с):

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

Питание

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

Также можно использовать для питания батарейку напряжением 9 В, подключаемую к контактам VIN (+) и GND (-).

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

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

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

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

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


Видео работы моей метеостанции доступно на моем -канале: https://youtu.be/vVLbirO-FVU

Отображение температуры

При измерении температуры индицируется две цифры температуры и для отрицательной температуры знак "минус" (с символом градуса в крайнем правом разряде);
для наружной температуры знак градуса отображается вверху:


для комнатной температуры - внизу:

Отображение давления

При измерении давления индицируются три цифры давления в мм ртутного столба (с символом "P " в крайнем правом разряде):

Если давление резко упало, то вместо символа "P " в крайнем правом разряде отображается символ "L ", если резко выросло - то "H ". Критерий резкости изменения - 8 мм рт. ст. за 8 часов:

Так как моя метеостанция отображает абсолютное давление (QFE ), то показания оказываются несколько заниженными по сравнению со сведениями в сводке METAR (в которой приводится QNH ) (14 UTC 28 марта 2018 года):

Отношение давлений (по сведениями ATIS ) составило ${1015 \over 998} = 1,017$. Возвышение аэропорта Гомель (код ИКАО UMGG ) над уровнем моря составляет 143,6 м. Температура по данным ATIS составляла 1 °C .

Показания моей метеостанции практически совпали с абсолютным давлением QFE по сведениями ATIS !

Максимальное/минимальное давления (QFE ), зарегистрированные моей метеостанцией за все время наблюдений:

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

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

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

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

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

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

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

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

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

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

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

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

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


пример графика с незначительным ростом давления

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

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

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

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

Метеостанция построена на Picaxe микроконтроллере от Revolution Education Ltd и состоит из двух основных частей: наружный блок, который посылает свои данные каждые 2 секунды, используя передатчик на частоте 433МГц. И внутренний блок, который отображает полученные данные на 20 х 4 ЖК-дисплее, а также атмосферное давление, которое измеряется локально во внутреннем блоке.

Я пытался сохранить дизайн максимально простым и в то же время функциональным. Связь устройства с компьютером осуществляется через COM-порт. В настоящее время на компьютере непрерывно строятся графики из полученных значений, а также идет отображение значений на обычных индикаторах. Графики и показания датчиков доступны на встроенном веб-сервере, все данные сохранятся и т.о. можно посмотреть данные за любой промежуток времени.

Постройка метеостанции заняло несколько месяцев, от разработки до завершения, и в целом я очень доволен результатом. Я особенно рад, что мне удалось построить все с нуля при помощи обычных инструментов. Меня она полностью устраивает, но совершенству предела нет, и особенно это касается графического интерфейса. Я не предпринял никаких попыток коммерциализации метеостанции, но если вы думаете о создании метеостанции для себя, то это хороший выбор.

Уличные датчики

Датчики используются для измерения температуры, влажности, осадков, направления и скорости ветра. Датчики представляют собой сочетание механических и электронных устройств.

Датчик температуры и относительной влажности воздуха

Измерение температуры, пожалуй, проще всего. Для это используется датчик DS18B20. Для измерения влажности был использован HIH-3610, выдающий напряжение 0.8 - 3.9В при влажности 0% до 100%

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

Упрощенный код для каждого из датчиков приведен ниже. Более точный код, который считывает значения с точностью до одной десятой, показан на сайте Питера Андерсона . Его код используется в окончательном варианте метеостанции.

Датчик температуры обеспечивает точность ± 0.5 °C. Датчик влажности обеспечивает точность до ± 2%, так что это не очень важно, сколько знаков доступно после запятой!

Пример участка из программного обеспечения, работающего на ПК.

Температура

Main: readtemp B.6, b1 ; read value into b1 if b1 > 127 then neg ; test for negative sertxd (#b1, cr, lf) ; transmit value to PE terminal pause 5000 goto main neg: b1 = b1 - 128 ; adjust neg value sertxt ("-") ; transmit negative symbol sertxt (#b1, cr, lf) ; transmit value to PE terminal pause 5000 goto main

Влажность

Main: readadc B.7,b1 ; read humidity value b1 = b1 - 41 * 100 / 157 ; change to %RH sertxd (#b1, "%", cr, lf) pause 5000 ; wait 5 seconds goto main

Расчет показаний датчика влажности

Расчеты взяты из документации датчика Honeywell HIH-3610. На графике показывана стандартная зависимость при 0 °C.

Напряжение с датчика измеряется на входе АЦП (B.7) микроконтроллера Picaxe 18M2. В коде, показанном выше, значение, которое представлено в виде числа от 0 до 255 (т.е. 256 значений), хранится в переменной b1.

Наша схема питается от 5В, так что каждый шаг АЦП равен:
5/256 = 0.0195 В.

На графике видно начально значение АЦП 0.8 В:
0.8 / 0.0195 = 41

Взяв значения из графика, наклон графика (с учетом смещения) примерно:
Напряжение выхода / % относительной влажности или
(2.65 - 0.8) / 60 = 0.0308 В в% RH
(В документации 0.0306)

Рассчитаем кол-во шагов АЦП на 1% влажности:
(В на % RH) / (шаг АЦП)
0.0308 / 0.0195 = 1.57

% RH = значение с АЦП - смещение АЦП / (шаги АЦП в % RH), или
% RH = значение с АЦП - 41 / 1.57

Итоговая формула расчет для микроконтроллера будет выглядеть: % RH = значение с АЦП - 41 * 100/157

Защитный корпус

Начните с разрезания каждой панели на две части. Планки на одной части будут крепко прикреплены с двух сторон, а на второй части только с одной стороны. Не выбрасывайте эти части - они используются.

К целым частям прикрепите два деревянных бруска 20мм х 20мм сверху и с низу, и прикрутите к ним другие части.

Обрежьте одну из частей с одной целой стороной по размеру и приклейте ее к внутренней стороне одной из сторон. Убедитесь, что планки приклеены так, что образуют вместе "^" форму. Сделайте так со всеми сторонами.

Измеритель скорости и направления ветра

Механическая часть

Датчики скорости и направления ветра представляют собой сочетание механических и электронных компонентов. Механическая часть идентична для обеих датчиков.

12мм вставка из фанеры (marine ply) находится между трубой из ПВХ и диском из нержавеющей стали в верхнем конце трубы. Подшипник приклеен к диску из нержавеющей стали и удерживается нержавеющей пластиной.

Как только все будет полностью собрано и настроено, открытые места герметизируются герметиком для водонепроницаемости.

Остальные три отверстия на фотографии предназначены для лопастей. Лопасти длиной 80 мм дают радиус поворота 95мм. Чашки 50 мм в диаметре. Для них я использовал обрезанные флаконы от одеколона, которые имеют почти сферическую форму. Я не уверен в их надёжности, поэтому сделал их легкозаменяемыми.

Электронная часть

Электроника для датчика скорости ветра состоит только из транзисторного ключа, фотодиода и двух резисторов. Они монтируются на небольшой круглой ПП диаметром 32мм. Они установлены в трубе свободно, чтобы влага в случае её попадания стекала вниз не задевая электронику.

Анемометр - один из трех датчиков, который необходимо откалибровать (два других – счетчик осадков и датчик атмосферного давления)

Фотодиод обеспечивает два импульса за один оборот. В простой «последовательной» системе, к которой я стремился (все датчик опрашиваются поочередно), должен быть компромисс между длиной времени, затрачиваемого на опрос каждого датчика (в данном случае, подсчет импульсов) и отзывчивость системы в целом. В идеале, на полный цикла опроса всех датчиков должно уйти не более 2-3 секунд.

На фото выше проверка датчика при помощью мотора с регулируемыми оборотами.

; LCD-specific commands shown in blue hsersetup B9600_4, %10000 ; Use LCD Pin 1, no hserin hserout 0, (13) : pause 100 ; Initialize LCD hserout 0, (13) : pause 100 hserout 0, (13) : pause 100 pause 500 hserout 0, ("ac1", 13) ; Clear display pause 50 hserout 0, ("acc", 13) hserout 0, ("ac81", 13, "adcount: ", 13) ; Print the headings pause 10 hserout 0, ("ac95", 13, "adpulsin: ", 13) ; Print the headings pause 10 do count C.2, 1000, w0 ; Count the pulses (two per rev) w1 = 0 for b8 = 1 to 2 ; Measure pulse length twice pulsin C.2, 1, w2 ; per rev and... w1 = w1 + w2 next w1 = w1 / 2 ; ...calculate average hserout 0, ("ac89", 13, "ad ", #w0, " ", 13) ;Print the count value hserout 0, ("ac9d", 13, "ad ", #w1, " ", 13) ;Print the pulse-length value pause 100 loop

Я хотел откалибровать его при движении на автомобиле, но на это не было времени. Я живу в относительно плоской местности с аэропортом в нескольких километрах рядом, поэтому я калибровал датчик, сравнивая мои показания скорости ветра с показаниями аэропорта.

Если бы мы имели 100% КПД и лопасти вертелись-бы со скоростью ветра, то:
Радиус ротора = 3.75"
Диаметр ротора = 7.5" = 0.625 фута
Длина окружности ротора = 1.9642 фута

1 фут/мин = 0.0113636 м/ч,
1.9642 фут/мин = 1 об = 0.02232 м/ч
1 м/ч = 1 / 0.02232 об

1 м/ч = 44.8 об
? м/ч = об / 44.8
= (об/мин * 60) / 44.8

Поскольку за поворот выходит два импульса
? м/ч = (импульсов в секунду * 30) / 44.8
= (импульсов в секунду) / 448

Датчик направления ветра - механическая часть

В датчике направления ветра, вместо алюминиевой пластины используется магнит, а вместо оптоэлектронного узла - специальная микросхема AS5040 (магнитный энкодер).

На фото ниже показан 5мм магнит, установленный на торце центрального винта. Выравнивание магнита относительно микросхемы очень важно. Магнит должен быть точно по центру на высоте около 1мм над микросхемой. Как только все будет точно выровнено, датчик будет работать правильно.

Датчик направления ветра - электронная часть

Существуют различные схемы для измерения направления ветра. В основном они состоят либо из 8 герконов расположенных под углом 45 градусов с интервалом вращающегося магнита или потенциометра который может полностью проворачиваться.

Оба метода имеют свои преимущества и недостатки. Основным преимуществом является то, что они оба просты в реализации. Недостатком является то, что они подлежат износу - особенно потенциометры. Альтернативой использованию герконов будет использовать датчика Холла для решения механического износа, но они по-прежнему ограничиваются 8 различными позициями... В идеале, я хотел бы попробовать что-то другое и в конечном счете решил о - поворотном магнитном датчике IC. Хотя это устройство для поверхностного монтажа (которого я стараюсь избегать), оно имеет ряд преимуществ, которые делают ее использование привлекательным!

Он имеет несколько различных форматов вывода, два из которых наиболее подходит для нашей цели. Наилучшая точность достигается с помощью SSI интерфейса. AS5040 выдает импульсы длиной от 1 мкс при 0° и до 1024 мкс при 359,6°

Проверка калибровки датчика направления ветра:

Do readadc10 B.3, w0 ;Read from AS5040 magnetic bearing pause 100 w0 = w0 * 64 / 182 ; Convert to 0 - 360 (degrees) debug ; Display in Prog/Edit debug window loop

Измеритель уровня осадков

Насколько это возможно, я сделал дождемер из пластика и нержавеющей стали, основание сделано из алюминия толщиной 3 мм для жесткости.

В измерителе уровня осадков есть две ведерка. Каждое ведерко вмещает до 6 мл воды до его смещения центра тяжести, которое заставляет его вылить воду в ёмкость и подать сигнал на датчик. Когда ведро опрокидывается, алюминий флаг проходит через оптический датчик, посылающий сигнал на электронику наружного блока.

На данный момент, я оставил его с прозрачными стенками (потому что интересно наблюдать это работает!). Но я подозреваю, что нужно покрасить его белой краской, чтобы отражать тепло летом, во избежание испарения. Я не мог найти маленькую воронку, поэтому пришлось сделать её самому. Обратите внимание на проволоку внутри воронки и по центру желоба. Это поможет остановить поверхностное натяжение воды в воронке и помогает капать воде. Без проволоки, дождь имел бы тенденцию к "водовороту", и его траектория была-бы непредсказуемой

Оптодатчики крупным планом:

Электронная часть дождемера

Из-за случайного характера работы датчика, программное прерывание в микроконтроллере наружного блока, казалось, логичный подход. К сожалению, некоторые команды программы, отключают механизм прерываний в то время, как они выполняются, т.о. есть вероятность, что сигнал придет в никуда. По этим причинам, дождемер имеет собственный микроконтроллер 08М Picaxe.

Использование отдельного чипа позволяет использовать его для создания достаточно точной 1-часовой задержки для того, чтобы считать ведра в час.

Калибровка

Picaxe 18м2 получает текущее количество ведерок в час и выводит его на дисплей и компьютер.

В качестве отправной точки, я использую следующие данные:
Воронка диаметров 120мм и емкость площадью 11,311мм2
1 мм дождя = 11,311мм3 или 11,3 мл.
Каждое ведро это 5,65 мл. Таким образом, 2 ведра 2 х 5,65 = 11,3 мл (или 1 мм) осадков. Одно ведро = 0,5 мм осадков.

Для сверки, я купил дешевый стакан для измерения осадков.

Для вышеприведенной схемы и схемы 08М Picaxe для датчика используется одна и та же топология печатной платы. Устройство питается от аккумулятора 12V 7Ah через стабилизатор 7805.
Я использовал набор RF Connect kit для беспроводной связи на 433 МГц. Комплект содержит пару специально запрограммированных PIC контроллеров. Комплект беспроводных модулей в ходе испытаний зарекомендовал себя как достаточно надежный.

На ПП установлен 08М Picaxe и 18м2. Каждый из них имеет свой собственный разъем программирования. Отдельные разъемы, каждый со своим +5 В, предназначены для каждого датчика - за исключением температуры и влажности.

Обратите внимание, что я нарисовал чертёж в Paintshop Pro поэтому я не могу гарантировать точность расстояния между выводами.

Внутренний блок

Во внутреннем блоке используетя 18м2 Picaxe, датчик давления и ЖК-дисплей. Также есть стабилизатор напряжения 5В.

Датчик давления

После нескольких неудачных попыток, я остановился на MPX4115A. Хотя другие датчики имеют диапазон измерения немного больше, они труднодоступны. Кроме того, другие датчики, как правило, работают от 3,3В и требуют дополнительный стабилизатор. MPX4115A выдает аналоговое напряжение от 3,79 и до 4,25В пропорционально давлению. Хотя это почти достаточное разрешение для обнаружения 1 мбар изменения давления, после некоторого обсуждения на форуме, я добавил АЦП MCP3422. Он может работать в 16-битном режиме (или выше) по сравнению с 10-битном режиме Picaxe. MCP3422 может быть связан (как в нашей схеме) в дифференциальный режим с аналоговым входом от датчика. Основным преимуществом является то, что это позволяет корректировать выход датчика, тем самым легко компенсировать ошибки MPX4115A и обеспечить простой способ калибровки датчика.

MPC3422 на самом деле имеет два дифференциальных входа, но так-как один не используется они замкнуты. Выход из MCP3422 имеет интерфейс I2C и соединяется с SDA и SCL контактам на 18м2 Picaxe – выводы B.1 и B.4 соответственно. С моей точки зрения, единственный недостаток в использовании MCP3422 том, что это небольшое устройство для поверхностного монтажа, но я его припаял к адаптеру. В дополнение к I2C интерфейсу MCP3422 18м2 просто обрабатывает поступающие данные из 433МГц беспроводной приемник, выводит данные на дисплей и передает данные на ПК. Для того чтобы избежать ошибок внутреннего блока когда компьютер не работает, нет никаких ответов от ПК. Внутренний блок передает данные и идет дальше. Он передает данные приблизительно в 2-секундным интервалом, чтобы потери данных быстро компенсировались следующий раз. Я использовал незадействованные порты на 18м2 для подключения кнопки на передней панели. Переключатель S1 (вход С.5) используется для включения подсветки ЖК-дисплея. Переключатель S2 (вход C.0) сбрасывает значение давления (мбар) на ЖК-дисплее. Переключатель S3 (вход C.1) переключает осадки отображаемые на ЖК-дисплее между общим в предыдущий час и текущими. Кнопки необходимо удерживать более 1 секунды для их реакции.

Сборка внутреннего блока

Как и в печатной плате для наружного блока, я нарисовал макет вручную с помощью Paintshop Pro, так что в расстояниях могут быть ошибки

Плата немного больше, чем это необходимо, чтобы вписаться в пазы в алюминиевом корпусе.
Я сознательно сделал разъем для программирования немного "внутрь" от края платы, чтобы предотвратить его прикосновение к корпусу. Вырез для ЖК-дисплея производится высверливание и подгонкой до точных размеров.

На фото показано всё уже установленное в корпус.

Штырьки на плате делают сложным её установку в корпус, поэтому мне пришлось отпаять их и припаять дисплей к плате проводами.

Внешний блок - код Picaxe

; ================================================================== ; Main 18M2 code for the Picaxe Weather Station Outdoor (Transmitter) Unit ; Decimal precision Humidity & Temperature routines, ; copyright, Peter H Anderson, Baltimore, MD, Jan, "04 ; ; ================================================================== #Picaxe 18M2 Symbol HValue = w0 Symbol HighWord = w1 Symbol LowWord = w2 Symbol RH10 = w3 Symbol HQuotient = b0 Symbol HFract = b1 Symbol X = b0 Symbol aDig = b1 Symbol TFactor = b2 Symbol Tc = b3 Symbol SignBit = b4 Symbol TValue = w4 Symbol TQuotient = b10 Symbol TFract = b11 Symbol TempC_100 = w6 Symbol MagDir = w7 Symbol MagDirLo = b14 Symbol MagDirHi = b15 Symbol WindSpeed = w8 Symbol WindSpeedLo = b16 Symbol WindSpeedHi = b17 Symbol ThisHour = b18 Symbol LastHour = b19 Symbol RainRequest = b20 ; Hardware Symbol HumidRaw = B.7 Symbol TempRaw = B.6 Symbol DirRaw = B.3 Symbol Speed = B.0 do ; Read Humidity ReadADC10 HumidRaw, HValue ;Get Humidity (HValue) HighWord = 1613 ** HValue ; calculate RH LowWord = 1613 * HValue RH10 = LowWord / 1024 LowWord = Highword * 64 RH10 = RH10 + LowWord RH10 = RH10 - 258 pause 100 ; Read temperature Readtemp12 TempRaw, TValue ; Get temperature SignBit = TValue / 256 / 128 if SignBit = 0 then positive ; It"s negative so TValue = TValue ^ $ffff + 1 ; take twos comp positive: TempC_100 = TValue * 6 ; TC = value * 0.0625 TValue = TValue * 25 / 100 TempC_100 = TempC_100 + TValue TQuotient = TempC_100 / 100 TFract = TempC_100 % 100 / 10 X = TQuotient / 10 ; Calculate temperature correction factor for Humidity if SignBit = 0 then SignBit = " " else SignBit = "-" endif if SignBit = "-" then X = 4 - X else X = X + 4 endif GoSub TempCorrection ; compensate RH HQuotient = RH10 / 10 ; Calculate RH Quotient and... HFract = RH10 % 10 ; ...decimal place. if HQuotient > 99 then ; Over range HQuotient = 99 HFract = 9 endif if HQuotient > 127 then ; Under range HQuotient = 0 HFract = 0 endif ; Read AS540 magnetic encoder for wind direction readadc10 DirRaw, MagDir ; Read from AS5040 magnetic bearing pause 100 ; Read rpm from windspeed counter count Speed, 1000, WindSpeed ; Every 30th cycle (approx 1 minute), request rain gauge data from 08M inc RainRequest if RainRequest >= 30 then high C.1 serin , C.0, N2400, ("r"), LastHour, ThisHour ; Rain counters low C.1 RainRequest = 0 endif ; Send data to Indoor Unit in 8 byte blocks ; First group needs no calibration so calculations are done here first. ; Second group will need "tweaking" - more easily done at indoor end. serout C.2, N2400, ("t", SignBit, TQuotient, TFract, HQuotient, HFract, "A", "B") pause 100 serout C.2, N2400, ("m", MagDirHi, MagDirLo, WindSpeedHi, WindSpeedLo, LastHour, ThisHour, "C") loop TempCorrection: Lookup X, (87, 89, 91, 93, 95, 97, 99, 101, 103, 106, 108, 110, 113, 116, 119, 122, 126), TFactor " -40 -30 -20 -10 0 10 20 30 40 50 60 70 80 90 100 110 120 if TFactor < 100 then aDig = TFactor / 10 RH10 = RH10 * aDig / 10 TFactor = TFactor % 10 aDig = TFactor RH10 = RH10 * aDig / 100 + RH10 else TFactor = TFactor % 100 aDig = TFactor / 10 RH10 = RH10 * aDig / 10 + RH10 TFactor = TFactor % 10 aDig = TFactor RH10 = RH10 * aDig / 100 + RH10 endif return

Использовано памяти = 295 байт из 2048

Счетчик количества осадков - 08M код

#picaxe 08M Symbol ThisHour = b2 ; Store the current sensor count in b2 Symbol LastHour = b3 ; Save the previous hour"s count in b3 ;Hardware definitions Symbol DataRequest = pin3 Symbol BucketSensor = pin4 setint %00010000, %00010000 ; pin4 is interrupt pin main: for w0 = 1 to 60000 ; Loop for 1 hour pause 60 next LastHour = ThisHour ; Update Last hour"s count with ThisHour = 0 ; current hour & reset current hour goto main ; Do the next hour interrupt: setint %00010000, %00010000 ; Re-instate interrupt if DataRequest = 1 then ; Was the interrupt from the 18M2 ? serout 2, N2400, ("r", LastHour, ThisHour) ; Yes, so send previous hour"s count & curent count. do: loop while DataRequest = 1 ; Wait until 18M2 stops requesting before continuing endif if BucketSensor = 1 then ; Was the interrupt from the rain sensor? inc ThisHour ; Yes, so increment bucket-tip count do: loop while BucketSensor = 1 ; Make sure flag has cleared sensor before continuing endif return

Внутренний блок - код Picaxe

;============================================================================ ; Main Indoor (Receiver) Program. ; ; Receives data from outdoor unit, displays on LCD and passes data on to PC ; Also measures the barometric pressure (thanks to "matherp") ;============================================================================ #PICAXE 18M2 ; Variable Definitions (b2 to b5 are re-used for mBar code when they become available) symbol Quotient = b2 symbol Fract = b3 symbol SignBit = b4 symbol Humidity = b5 symbol HFract = b14 symbol Dir = w5 symbol DirLo = b10 symbol DirHi = b11 symbol Speed = w3 symbol SpeedLo = b6 symbol SpeedHi = b7 symbol RainCountThisHour = b12 symbol RainCountLastHour = b13 symbol LCDRainWhole = b21 symbol LCDRainFract = b22 symbol LastOrThis = b23 ; MCP3422 ADC variables symbol mb900 = 17429 ; ADC reading for 900Mbar, then add 72.288 counts per mbar symbol adj0 = 72 symbol mBarADCValue = w0 symbol adj1 = b4 ; used to add 1 count every 4 mbar symbol adj2 = b5 ; used to add 1 count every 24 mbar symbol mBar = w4 ; Housekeeping variables symbol lastmbar = w8 ; Remember previous mBar reading symbol RiseFall = b18 ; Indicator for pressure rising or falling (up arrow or down arrow) symbol active = b19 ; Telltale shows activity on LCD screen symbol LCD_Status = b20 ; Is LCD Backlight on or off (0 or 1)? ; Hardware Definitions symbol Wireless = C.7 ; Incoming connection from Wireless receiver/decoder symbol Computer = C.2 ; Outgoing serial connection to computer symbol LCD = pinC.5 ; Front-panel button to blank / unblank LCD backlight symbol ClearRiseFall = pinC.0 ; Front-panel button to clear pressure "rising / falling" indicator symbol LastOrThisSwitch = pinC.1 ; Front-panel button to display current or previous hour"s rainfall Init: hsersetup B9600_4, %10000 ; Use LCD Pin 1, no hserin ; ByVac 20x4 IASI-2 Serial LCD hi2csetup i2cmaster, %11010000, i2cfast, i2cbyte ; Initialize I2C for MCP3422 ADC chip. hi2cout (%00011000) ; set MCP3422 for 16 bit continuous conversion pause 500 hserout 0, (13) : pause 100 ; Initialize LCD hserout 0, (13) : pause 100 hserout 0, (13) : pause 100 pause 500 hserout 0, ("ac50", 13) hserout 0, ("ad", 32, 32, 32, 32, 49, 42, 36, 32, 13) ; Define down arrow character (char 10) hserout 0, ("ac1", 13) ; Clear display pause 50 hserout 0, ("acc", 13) ; Hide cursor hserout 0, ("ac81", 13, "ad ", $df, "C", 13) ; Print the headings hserout 0, ("ac88", 13, "admBar", 13) hserout 0, ("ac8e", 13, "adRH %", 13) hserout 0, ("acd5", 13, "ad", "dir", 13) ; Print footings hserout 0, ("acdc", 13, "ad", "mph", 13) ; hserout 0, ("ace3", 13, "ad", "mm", 13) lastmbar = 0 ; Initialize variables LastOrThis = "c" ;========================================================================== ; Main Loop ;========================================================================== main: ; Check if a front-panel switch is pressed. The Picaxe interrupt mechanism is ; almost permanently disabled due to the large number of serin and serout commands ; so sprinkling the program with "gosub switches" to check the switch status is more ; effective that interrupts. gosub switches ; Get first group of values from outdoor unit via 433MHz radio link. serin Wireless, N2400, ("t"), SignBit, Quotient, Fract, Humidity, HFract, b15, b15 ; Flash "telltale" on LCD to indicate activity and successful "serin" from wireless. gosub telltale ; Display first group on LCD hserout 0, ("acc0", 13) hserout 0, ("ad", SignBit, #Quotient, ".", #Fract, " ", 13) hserout 0, ("acce", 13) hserout 0, ("ad", #Humidity,".", #HFract, " ", 13) gosub switches ; Send first group to computer COM port ; Each group has a start identifier, data and an end identifier: ; Start = "xS", End is "xE" eg Wind Start is WS, Wind End is WE ; Multiple data are separated by a single space character. serout Computer, N2400, ("TS", SignBit, #Quotient," ", #Fract, "TE") ; Temperature serout Computer, N2400, ("HS", #Humidity, " ", #HFract, "HE") ; Humidity ; Check switches again and at regular intervals throughout program. gosub switches ; Get second group of values from outdoor unit radio link. serin Wireless, N2400, ("m"), DirHi, DirLo, SpeedHi, SpeedLo, RainCountLastHour, RainCountThisHour, b15 gosub telltale Speed = Speed * 300 / 448 ; Estimated conversion from pulses/sec to mph Dir = Dir * 64 / 182 ; Convert 0 - 1023 to 0 - 359 degrees ; To preserve precision, rain gauge has to be calibrated by adjusting the ; mechanical stops on the tipping bucket so that 1 tip is 0.5 mm of rain. if LastOrThis = "c" then ; Decide whether to display previous hour"s LCDRainWhole = RainCountThisHour / 2 ; rainfall or the current hour"s. LCDRainFract = RainCountThisHour * 5 // 10 else LCDRainWhole = RainCountLastHour / 2 ; LCDRainFract = RainCountLastHour * 5 // 10 endif ; Send second group to LCD hserout 0, ("ac95", 13) hserout 0, ("ad", #Dir, " ", 13) hserout 0, ("ac9c", 13) hserout 0, ("ad", #Speed, " ", 13) hserout 0, ("aca1", 13) hserout 0, ("ad", LastOrThis, " ", #LCDRainWhole, ".", #LCDRainFract, " ", 13) ; Send second group to computer COM port serout Computer, N2400, ("WS", #Dir," ", #Speed, "WE") ; Wind serout Computer, N2400, ("RS", #RainCountLastHour," ", #RainCountThisHour, "RE") ; Rain gosub switches ; Thanks to "matherp" on the Picaxe forum for the mbar code loop: ; Measuring atmosperic pressure with a MPX4115A ; Analogue to digital conversion using a MCP3422 ; MPX output to V+, 2.5V to V- ; ADC in 16 bit mode hi2cin (b1,b0,b2) ; Read in the ADC reading and the status byte from MCP3422 adj1 = 0 adj2 = 0 w1 = mb900 mbar = 900 do while mBarADCValue > w1 ; mBarADCValue = w0 = b1:b0 inc mbar w1 = w1 + adj0 inc adj1 if adj1 = 4 then inc adj2 w1 = w1 + 1 adj1 = 0 endif if adj2 = 6 then w1 = w1 + 1 adj2 = 0 endif loop gosub switches gosub telltale ; Send pressure to computer COM port serout Computer, N2400, ("PS:", #mbar, "PE") ; Initialize previous pressure reading (lastmbar) if not already set if lastmbar = 0 then lastmbar = mbar RiseFall = " " endif ; Display up arrow or down arrow if pressure has changed if mbar > lastmbar then RiseFall = "^" ; ^ lastmbar = mbar endif if mbar < lastmbar then RiseFall = 10 ; Custom LCD character. Down arrow lastmbar = mbar endif hserout 0, ("acc7", 13) hserout 0, ("ad", RiseFall, #mbar, " ",13) gosub telltale goto main ; Check if one of the front panel buttons is pressed. switches: if LCD = 1 then ; LCD Backlight on/off Button is pressed if LCD_Status = 0 then ; Backlight is on so... hserout 0, ("ab0", 13) ; Turn it off LCD_Status = 1 else hserout 0, ("ab1", 13) ; Else turn it on. LCD_Status = 0 endif do: loop while LCD = 1 ; Don"t return while button is pressed endif if ClearRiseFall = 1 then ; Pressure rise/fall button is pressed RiseFall = " " ; Clear indicator and... hserout 0, ("acc7", 13) ; ... update display. hserout 0, ("ad", RiseFall, #mbar, " ",13) do: loop while ClearRiseFall = 1 endif if LastOrThisSwitch = 1 then ; Rain Previous Hour / Last Hour button. if LastOrThis = "c" then LastOrThis = "p" LCDRainWhole = RainCountLastHour / 2 ; Recalculate values and re-display to LCDRainFract = RainCountLastHour * 5 // 10 ; give visual confirmation of button-press else LastorThis = "c" LCDRainWhole = RainCountThisHour / 2 ; LCDRainFract = RainCountThisHour * 5 // 10 endif hserout 0, ("aca1", 13) hserout 0, ("ad", LastOrThis, " ", #LCDRainWhole, ".", #LCDRainFract, " ", 13) do: loop while LastOrThisSwitch = 1 endif return ; Flash "tell-tale" on LCD display to show activity telltale: if active = "*" then active = " " else active = "*" endif hserout 0, ("ac80", 13, "ad", active, 13) return

Использовано памяти = 764 байт из 2048

Программное обеспечение для ПК

Программное обеспечение, работающее на ПК было написано с использованием Borland Delphi 7. Оно довольно примитивно в его нынешнем виде, но это, по крайней мере, показывает связь Picaxe с компьютером.

Графики могут быть выбраны для показа в период 1 час или 12 часов. Графики можно прокручивать вперёд-назад с помощью мышки. Они могут быть сохранены. Для этого необходимо кликнуть по ним правой кнопкой мыши и указать имя и файл значения. Можно настроить ограниченный набор APRS данных, записываемых раз в минуту на одну строку файла APRS.TXT и которые сохраняются в той же папке, где находится Weather.exe. Отмечу, что температура в градусах по Фаренгейту и осадки в 1/100ths на дюйм.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Датчик температуры и относительной влажности воздуха
Датчик температуры

DS18B20

1 В блокнот
Датчик влажности HIH-3610 1 В блокнот
Резистор

4.7 кОм

1 В блокнот
Измеритель скорости и направления ветра
Фототранзистор ИК 1 В блокнот
Светодиод ИК 1 В блокнот
Резистор

220 Ом

1 В блокнот
Резистор

4.7 кОм

1 В блокнот
Магнитный энкодер 1 В блокнот
Электролитический конденсатор 10 мкФ 4 В блокнот
Конденсатор 100 нФ 1 В блокнот
Резистор

4.7 кОм

1 В блокнот
Резистор

10 кОм

1 В блокнот
Измеритель уровня осадков
МК PICAXE

PICAXE-08M

1 В блокнот
Выпрямительный диод

1N4148

2 В блокнот
Конденсатор 100 нФ 1 В блокнот
Резистор

4.7 кОм

1 В блокнот
Резистор

10 кОм

4 В блокнот
Резистор

22 кОм

1 В блокнот
Резистор

220 Ом

2 В блокнот
Светодиод ИК 1