- Skywatch xplorer 1 анемометр в москве купить недорого в интернет магазине с доставкой | 40nog
- Анемометр v.1.0
- Железо. выбор компонентов
- Миниметеостанция на arduino в телефоне | каталог самоделок
- Моя самодельная домашняя метеостанция на arduino nano | мои увлекательные и опасные эксперименты
- Способ 2. идеологически правильный: задействуем timer1
Skywatch xplorer 1 анемометр в москве купить недорого в интернет магазине с доставкой | 40nog
Сортировать по:увеличению ценыуменьшению ценыпопулярностиотзывамрейтингу
Тип: анемометр
тип анемометра: крыльчатый
измерение воздушного потока: скорость, температура, воздухообмен
точность измерения скорости 3%
точность измерения температуры 1%
поддержка единиц измерения: м/с, фут/мин, узлы, км/ч, миля/ч, °F, фут³/мин (CFM), м³/мин, °C
источ… данные с Яндекс Маркета
Цвет: темно-зеленый – Пластиковый материал корпуса – 2,0″ ЖК-дисплей – Рабочая высота: 2000 метров – Макс. Дисплей: 9999 – Время выборки: 0,4 секунды – Единицы измерения: м / с, км / ч, мельница / ч, фут / м, фут / с, узлы – Условия эксплуатации: 0 ~ 95% RH влажности, -… данные с Яндекс Маркета
Тип: анемометр
тип анемометра: крыльчатый
измерение воздушного потока: скорость, температура, воздухообмен
точность измерения скорости 3%
точность измерения температуры 2%
поддержка единиц измерения: м/с, фут/мин, узлы, км/ч, миля/ч, °F, фут³/мин (CFM), м³/мин, °C
источ… данные с Яндекс Маркета
Тип: смартфон, android, разрешение экрана: 2280×1080, 4G LTE, 2 SIM-карты, память: 64 ГБ, слот для карты памяти, оперативная память: 4 Гб, емкость аккумулятора: 3500-4499 мА⋅ч, количество основных камер: 2, год анонсирования: 2021 данные с Яндекс Маркета
Тип: смартфон, линейка: Galaxy J, android, разрешение экрана: 1280×720 (HD), 4G LTE, 2 SIM-карты, память: 8 ГБ, слот для карты памяти, оперативная память: 1.5 Гб, емкость аккумулятора: 2500-2999 мА⋅ч, количество основных камер: 1 данные с Яндекс Маркета
Тип: смартфон, линейка: Linx, android, разрешение экрана: 1440×720, 4G LTE, 2 SIM-карты, память: 16 ГБ, слот для карты памяти, оперативная память: 2 Гб, емкость аккумулятора: 3000-3499 мА⋅ч, количество основных камер: 2, год анонсирования: 2021 данные с Яндекс Маркета
Тип: смартфон, линейка: Linx, android, разрешение экрана: 1440×720, 4G LTE, 2 SIM-карты, память: 16 ГБ, слот для карты памяти, оперативная память: 2 Гб, емкость аккумулятора: 2500-2999 мА⋅ч, количество основных камер: 1, год анонсирования: 2021 данные с Яндекс Маркета
Тип: смартфон, android, разрешение экрана: 1280×720 (HD), 4G LTE, 2 SIM-карты, память: 16 ГБ, слот для карты памяти, оперативная память: 2 Гб, емкость аккумулятора: 2500-2999 мА⋅ч, NFC, количество основных камер: 1, год анонсирования: 2021 данные с Яндекс Маркета
Тип: смартфон, android, разрешение экрана: 1280×720 (HD), 4G LTE, 2 SIM-карты, память: 16 ГБ, слот для карты памяти, оперативная память: 2 Гб, емкость аккумулятора: 3000-3499 мА⋅ч, количество основных камер: 1, год анонсирования: 2021 данные с Яндекс Маркета
Тип: смартфон, линейка: Vox, android, разрешение экрана: 1280×720 (HD), 4G LTE, 2 SIM-карты, память: 16 ГБ, слот для карты памяти, оперативная память: 1 Гб, емкость аккумулятора: 2000-2499 мА⋅ч, количество основных камер: 2 данные с Яндекс Маркета
Тип: смартфон, android, разрешение экрана: 1440×720, 4G LTE, 2 SIM-карты, память: 16 ГБ, слот для карты памяти, оперативная память: 2 Гб, емкость аккумулятора: 2500-2999 мА⋅ч, NFC, количество основных камер: 2, год анонсирования: 2021 данные с Яндекс Маркета
Тип: смартфон, линейка: Linx, android, разрешение экрана: 1280×720 (HD), 2 SIM-карты, память: 16 ГБ, слот для карты памяти, оперативная память: 1 Гб, емкость аккумулятора: 2000-2499 мА⋅ч, количество основных камер: 1, год анонсирования: 2021 данные с Яндекс Маркета
Категория skywatch xplorer 1 анемометр для города Москва содержит 133 товара, которые продаются в 13 магазинах по цене от 987 руб. до 49900 руб.
Анемометр v.1.0
Из закормов Родины взял советский шаговый двигатель
Разобрал, вытряхнул из него все лишнее: убрал статор, выпрессовал звездочки и магнит на роторе. Вот сколько всего ненужного получилось
Остался вал ротора, корпус и подшипники. Подшипники промыл бензином чтобы удалить смазку, которая имеет свойство замерзать на морозе. Собрал остатки воедино, это и будет основой механической части. Далее выпилил кусок печатной платы компьютерной мыши с оптопарой. Вал кодирующего колеса через термоусадочную трубку соединил с валом двигателя. Оптопару укрепил на кронштейне
Далее подобрал шпильку диаметром 5 мм и металлическую трубку
Шпильку подстыковал к другому концу выходного вала и снаружи зафиксировал трубкой.
Трубка одевается на вал втугую, но для надежности дополнительно залил внутрь эпоксидку
Перехожу к ходовым испытаниям. Спаял схему
Написал небольшую программу – тахометр, которая по формуле рассчитывает количество оборотов в соответствии с количеством импульсов, поступающих на вход микроконтроллера за единицу времени. Каждый замер длится 1 секунду. Результаты замеров записываются в массив данных. Затем вычисляются средняя (RPM) и максимальная частота вращения (RPMMAX). Скачать скетч для ардуинки можно тут
К валу подсоединил двигатель постоянного тока, и покрутил на разных оборотах.
Получилось измерять скорость вращения примерно до 1800 об/мин, что соответствует 30 об/сек. При дальнейшем увеличении частоты вращения, показания резко снижаются. Не понятно что на это влияет – то ли сам алгоритм не успевает считать, то ли не хватает быстродействия фототранзистора. А может и то и другое. В любом случае, в качестве анемометра схема вполне работоспособна.
Чтобы защитить изделие от атмосферных воздействий, нужно поместить это всё в какой нить герметичный корпус. Для этой цели подобрал корпус от неисправного двигателя
Вытряхнул из него внутренности
С мыслью “из чего бы сделать крыльчатку?” прогулялся в магазин детских товаров. Немного побродил и таки нашел нужную погремушку! Купил, принёс домой
Достал 2 больших шарика. Диаметр у них 50 мм
Ну и, как вы уже наверное догадались, распилил каждый пластмассовый шарик на две равные половинки. Половинки цветные, очень хорошо было резать – отлично видно линию распила. Чудеса превращения шариков в крыльчатки:
Стойки, на которых держатся крыльчатки, изготовил из спиц от зонтика. Они лёгкие и прочные. Закрепил стойки к чашечкам с помощью винтов М3, второй конец одел на шпильку вала. Длину стоек выбрал произвольно, около 70 мм. Не знаю много это или мало. Так же непонятно – сколько чашечек нужно? в Интернете находил конструкции с 3 шт, поэтому сделал пока тоже с 3-мя. Изделие в сборе
Получилась довольно внушительная штуковина. Слабый ветер навряд ли будет чувствовать, но на смерчи, ураганы как-то реагировать должна. Испытания покажут. Может у кого нить есть мысли как доработать механическую часть для улучшения характеристик?
Железо. выбор компонентов
Вот это и есть самая ответственная часть, а вовсе не пайка или программирование. После определения требований к системе надо решить с помощью чего конкретно они будут воплощены в жизнь.
Вот тут-то и есть один ньюанс. Чтобы выбрать компоненты нужно хорошо знать их возможности, нужно знать сами технологии. То есть другими словами, здесь требуется быть далеко не начинающим электронщиком и программистом. Так что же теперь пару лет потратить на изучение всего спектра возможных устройств?
Замкнутый круг? Но замкнутые круги для того и существуют, чтобы их разрывать.
Выход есть. Можно просто взять и повторить чей-то проект. Я же изучил уже существующие проекты метеостанций и надеюсь сделал шаг вперед.
Итак. Архитектура погодной станции базируется на Arduino. Потому что Arduino имеет небольшой порог вхождения и я уже имел с этим дело. Дальше выбирать уже проще.
Сразу стало ясно, что в составе метеостанции будет удаленый, заоконный датчик и центральный модуль.
Центральный, основной блок будет расположен внутри помещения. Это важно определить на начальном этапе, от этого «пляшут» такие важные характеристики как температурный режим работы и питание.
Удаленный датчик (или датчики) будет без «мозгов», его задача — периодически проводить измерения и передавать данные на центральный домашний блок. Центральный блок принимает данные от всех датчиков, показывает их на экране и отправляет их же в интернет в базу данных.
Для сношений с внешним миром интернет был однозначно выбран WiFi модуль ESP8266 практически без альтернативы (прим. возможно сейчас такие альтернативы появились). К Arduino выпускаются Ethernet платы расширения, но совсем не хотелось привязываться к кабелю.
Интересный вопрос состоял в том, чем обеспечивать связь между заоконным датчиком (или датчиками, про требование расширяемости системы помним?) и центром. Радиомаячки на 433 Мгц однозначно не подходят (они не подходят ни для чего вообще).
Воспользоваться опять ESP8266 ?
Минусы такого решения:
- необходим устойчивый WiFi за пределами дома
- дальность связи не будет большой
- пострадает надежность, при пропадании интернета мы не увидим свои удаленные датчики
- большее энергопотребление.
- Энергопотребление ESP8266 :
- при передаче 120—170 mA
- при приеме 50—56 mA
- в режиме Deep Sleep 10 µA (мкА)
- в выключенном состоянии 5 µA (мкА).
В конце концов для связи удаленных датчиков с основным домашним блоком был выбран чип nRF24L01 с 2,4 Ггц передатчиком и приемником в одном флаконе, с дополнительной внешней антенной, чтоб уж наверняка «пробить» стены.
Энергопотребление nRF24L01 2,4 GHz :
- при приеме 11 mA
- при передаче на скорости 2Mbps — 13 mA
- в режиме standby-I — 26 μA (мкА)
- в выключенном состоянии 900 nA (нА).
Что у ESP8266, что у nRF24L01 диапазон рабочих температур подходящий: от -40℃ до 80℃.
Купить nRF24L01 можно примерно за $1, или сразу с внешней антенной за $3. Купить ESP8266-01 можно примерно за $4. Читайте внимательно описание товара! Иначе купите одну антенну.
Ядро системы вырисовалось. Переходим к самим датчикам.
На улице, как известно, температура может достигать отрицательных значений, поэтому датчик DHT11 не подходит, а вот DHT22 в самый раз.
Характеристики DHT22 / AM2302 :
- питание от 3,3 В до 5 В, рекомендуется 5 В
- потребление 2.5mA максимум, в момент измерения и передачи данных
- диапазон измерения влажности 0-100% с погрешностью 2-5%
- диапазон измерения температуры от -40 до 125°C с погрешностью ±0.5°C
- запрос на измерение не чаще 0,5 Гц — одного раза в 2 секунды.
Внутри дома, я надеюсь, отрицательных температур не будет, поэтому можно использовать DHT11, тем более, что он у меня уже был.
Характеристики DHT11:
- питание от 3,3 В до 5 В
- потребление 2,5 mA максимум, в момент измерения и передачи данных
- диапазон измерения влажности 20-80% с погрешностью 5%
- диапазон измерения температуры от 0 до 50°C с погрешностью ±2°C
- запрос на измерение не чаще 1 Гц — одного раза в секунду.
Купить DHT22 можно примерно за $3. DHT11 стоит дешевле — $1, но он и менее точен.
Теперь возвращаемся опять к Arduino. Какую плату выбрать?
Я тестировал отдельные части системы на Arduino UNO. Т.е. подключал к уно ESP модуль и изучал его, отключал, затем подключал nRF24 и т.д. Для финальной реализации заоконного датчика выбрал Arduino Pro Mini как наиболее близкую к Uno из миниатюрных.
По энергопотреблению Arduino Pro Mini также выглядит неплохо:
- нет преобразователя USB-TTL, который сам по себе «кушает» много,
- светодиод подключен через 10к резистор.
Для продвинутого сбережения энергии планировалось:
- удалить светодиод — индикатор питания на Arduino Pro Mini (я пожалел, не стал портить плату)
- либо использовать «голую» сборку на микропроцессоре Atmel ATmega328 (не использовал)
- использовать библиотеку Low Power Library или JeeLib.
Из библиотек выбрал Low Power Library, она проста и содержит только то, что нужно.
Для центрального блока, поскольку к нему планировалось подключить многочисленную периферию, была выбрана плата Arduino Mega. К тому же она полностью совместима с UNO и имеет больше памяти. Забегая наперед скажу, что этот выбор полностью оправдался.
Купить Arduino Mega можно примерно за $8.
Миниметеостанция на arduino в телефоне | каталог самоделок
Сейчас на Arduino продается множество разнообразных датчиков, и хотя точность их измерений желает желать лучшего, но для домашнего использования они вполне годятся.
В исключительном случае, если вы увлекаетесь метеорологией, вам может понадобиться более сложная и дорогостоящее оборудование.
Готовое устройство, такое как Weather Meters, напичканное анемометром, флюгером, измерителем количества осадков, которое остается лишь подключить через RJ11 интерфейс к Arduino для работы, в полной мере оценят только метеорологи, диспетчеры или агрономы.
Возможности самодельной метеостанции:
- Измерение текущей температуры в доме, на улице.
- Показания влажности воздуха.
- Отслеживание атмосферного давления.
- Вывод всех данных на экран телефона в реальном времени.
Перечень необходимых компонентов:
- Плата Arduino Uno, mini, nano с процессором ATmega 168, ATmega 328.
- Bluetooth модуль HC-05.
- Датчик давления BMP180 — более экономное и точное устройство своей устаревшей версии BMP085.
- Датчик влажности DHT22 — отличается от DHT11 большей точностью и расширенным диапазоном измерений. Температуру он меряет также неточно, с чувствительностью 0.5 °С, хотя уже от –40 до 125 °С, а не от 0 до 50 °С.
- Датчик температуры DS18B20, две штуки — один замеряет температуру в комнате, другой на улице. Использовать отдельные датчики температуры понадобилось, поскольку встроенный в модуль DHT22 имеет низкую точность до 0.5 °С.
- Резисторы по 0,125 Вт: 4.7 кОм, 10 кОм.
- Монтажная плата, паечная или беспаечная.
- Сетевой адаптер 220/5 В для питания платы Arduino.
Дополнительно можно приобрести:
- Плата коммутационная Sensor Shield для быстрого подключения всех датчиков, сервомоторов, интерфейсов Serial и I2C, незаменима тем, кто ни разу не держал в руках паяльник.
- Импульсный преобразователь DC-DC, вход 7…24 В, выход 5 В, 2.5 А.
Подключение датчиков и Bluetooth модуля
Подключать датчики температуры DS18B20 следует с одним резистором 4.7 кОм между их выводами DQ и VDD.
Два датчика температуры подсоединены к плате Arduino по одной трехпроводной шине. Каждый датчик DS18B20 имеет свой уникальный 64-битный адрес, и работает с Arduino по однолинейному протоколу 1 Wire передачи данных.
- VCC — 5V (питание 5В);
- GND — GND (земля);
- SDA — A4 аналоговый вход на Arduino;
- SCL — A5 аналоговый вход на Arduino;
Подключаем датчик влажности с pul-up (подтягивающим) резистором 10 кОм между его выводами VCC и DAT. Если расстояние от датчика до контроллера более 20 метров, то рекомендуется ставить подтягивающий резистор на 5.1 кОм. При необходимости улучшить работу датчика, следует добавить конденсатор емкостью 100 нФ между его питанием VCC и землей GND.
- Наш датчик влажности будет передавать данные на 8 цифровой вход платы Arduino.
- Остается лишь подключить Bluetooth модуль HC-05 к плате Arduino:
- VCC — 5V (питание 5 В);
- GND — GND (земля);
- RX — TX на Arduino;
- TX — RX на Arduino;
- KEY — не используется;
- STATE — не используется.
- Программное обеспечение
- Загружаем в Arduino эскиз программы для домашней миниметеостанции.
- Скетч WSAB
Проверяем работоспособность собранного устройства. В Монитор порта компьютерной программы ArduinoIDE отправляем 1, затем поочередно 2, 3, 4.
- При отправке 1 — показания температуры на улице.
- При отправке 2 — показания температуры в доме.
- При отправке 3 — данные о давлении.
- При отправке 4 — данные о влажности.
- Загружаем на Android телефон приложение Wether station Android Arduino Bluetooth.
- Показания температуры на улице в градусах Цельсия
- Показания температуры внутри дома в градусах Цельсия
Данные об атмосферном давлении на улице в мм.рт.ст.
- Данные о влажности на улице в процентах
- Собрать готовое устройство можно в любом корпусе: футляр от аудиокассеты, распределительная коробка.
- Напоследок следует упомянуть, что собранная даже на Arduino Uno домашняя метеостанция потребляет совсем мизерный ток, до 30 мА, поэтому её вполне можно сделать переносной, запитав от солнечной панельки и аккумулятора.
Виталий Петрович. Украина Лисичанск.
Моя самодельная домашняя метеостанция на arduino nano | мои увлекательные и опасные эксперименты
Наблюдение за погодой – весьма увлекательное занятие. Я решил построить свою погодную станцию на базе популярного Arduino Nano 3.0.
Прототип метеостанции выглядит так:
Функции моей метеостанции:
Hex-файл прошивки для Arduino Nano 3.0 (версия от 9 мая 2021 года) – ws.ino.eightanaloginputs.hex.
Как прошить hex-файл в плату Arduino, я описал здесь.
Микроконтроллер Arduino Nano 3.0
“Сердцем” моей метеостанции является микроконтроллер Arduino Nano 3.0 (приобретен на торговой площадке eBay):
Для управления индикацией и опросом датчиков я использую таймер 1 Arduino, вызывающий прерывания с частотой 200 Гц (период – 5 мс).
Индикатор
Для отображения измеряемых показаний датчиков и текущего времени я подключил к Arduino четырехразрядный светодиодный индикатор Foryard FYQ-5643BH с общими анодами (аноды одинаковых сегментов всех разрядов объединены).
Индикатор содежит четыре семисегментных разряда и две разделительные (часовые) точки:
Аноды индикатора подключены через токограничивающие резисторы к выводам Arduino:
Катоды сегментов подключены к выводам Arduino:
Сегмент индикатора светится, если на аноде соответствующего разряда высокий потенциал (1), а на катоде – низкий (0).
Я использую динамическую индикацию для отображения информации на индикаторе – в каждый момент времени активен только один разряд. Активные разряды чередуются с частотой 200 Гц (период отображения 5 мс). При этом для глаз мерцание сегментов незаметно.
Датчик температуры DS18x20
Для возможности удаленного измерения температуры я подключил датчик DS1820, который обеспечивает измерение наружной температуры в широких пределах. Датчик подключается к шине 1-Wire и имеет три вывода – питание (VCC), данные (DAT), земля (GND):
Между выводами VCC и DAT я включил подтягивающий резистор сопротивлением 4,7 кОм.
Для перевода между градусами Цельсия и Фаренгейта можно использовать такую табличку:
Я разместил датчик за окном дома в пластиковом корпусе от шариковой ручки:
В профессиональных метеостанциях для защиты термометра от прямых солнечных лучей и обеспечения циркуляции воздуха используется экран Стивенсона (англ. Stevenson screen):
Датчик давления и температуры BMP280
Для измерения атмосферного давления традиционно используют ртутные барометры и барометры-анероиды.
В ртутном барометре атмосферное давление уравновешивается весом столба ртути, высота которого и ипользуется для измерения давления:
В барометре-анероиде используется сжатие и растяжение коробки под действием атмосферного давления:
Для измерения атмосферного давления и комнатной температуры в своей домашней метеостанции я использую датчик BMP280 – маленький SMD-датчик размером 2 x 2,5 мм, основанный на пьезорезистивной технологии:
Платка с датчиком приобретена на торговой площадке eBay:
Датчик подключается к шине I2C (контакт данных – SDA/SDI, контакт синхронизации – SCL/SCK):
Для работы с датчиком я использую библиотеку от 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), земля (–):
Для работы с датчиком я использую библиотеку от Adafruit – файлы DHT.h, DHT.cpp.
Влажность воздуха характеризует количество водяного пара, содержащегося в воздухе. Относительная влажность показывает долю влаги в воздухе (в процентах) по отношению к максимальному возможному количеству при текущей температуре. Для измерения относительной влажности служит гигрометр:
Для человека оптимальный интервал влажности воздуха – 40 … 60 %.
Часы реального времени
В качестве часов реального времени я применил модуль RTC DS1302 (платка с часиками приобретена на торговой площадке eBay):
Модуль DS1302 подключается к шине 3-Wire. Для использования этого модуля совместно с Arduino разработана библиотека iarduino_RTC (от iarduino.ru).
Плата с модулем DS1302 имеет пять выводов, которые я соединил с выводами платы Arduino Nano:
Для сохранения верных показаний часов при отключенном питании в гнездо на плате я вставил батарейку CR2032.
Точность моего часового модуля оказалась не слишком высокой – часы спешат примерно на одну минуту за четверо суток. Поэтому я сделал сброс минут на “ноль” и часа на ближайший при удержании кнопки, подключенной к выводу A0 Arduino, после включения питания метеостанции. После инициализации вывод A0 используется для передачи данных через последовательное соединение.
Передача данных на компьютер и работа по протоколу MQTT
Для передачи данных через последовательное соединение к Arduino подключается USB–UART преобразователь:
Вывод Arduino используется для передачи данных в формате 8N1 (8 бит данных, без бита четности, 1 стоп-бит) со скоростью 9600 бит/с. Данные передаются пакетами, причем длина пакета – 4 символа. Передача данных осуществляется в “bit-bang” режиме, без использования аппаратного последовательного порта Arduino.
Формат передаваемых данных:
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 марта 2021 года):
Отношение давлений (по сведениями ATIS) составило ${1015 over 998} = 1,017$. Возвышение аэропорта Гомель (код ИКАО UMGG) над уровнем моря составляет 143,6 м. Температура по данным ATIS составляла 1 °C.
Показания моей метеостанции практически совпали с абсолютным давлением QFE по сведениями ATIS!
Максимальное/минимальное давления (QFE), зарегистрированные моей метеостанцией за все время наблюдений:
Отображение относительной влажности воздуха
Относительная влажность воздуха отображается в процентах (в двух правых разрядах отображается символ процента):
Отображение текущего времени
Текущее время отображается на индикаторе в формате “ЧЧ:ММ”, причем разделительное двоеточие мигает раз в секунду:
Отображение фаз Луны и лунного дня
Первые два разряда индикатора отображают текущую лунную фазу, а следующие два – текущий лунный день:
У Луны выделяются восемь фаз (приведены английские и русские (синим цветом – неточные) названия):
На индикаторе фазы отображаются пиктограммами:
Передача данных на компьютер
Если соединить метеостанцию с 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,5cdot{10^{-3} {^{circ}{C^{-1}}}}$).
С изменением скорости воздушного потока изменяется температура при неизменном токе накала (анемометр с постоянным током, англ. CCA). Если температура нагревательного элемента поддерживается постоянной, то ток через элемента будет пропорционален скорости воздушного потока (анемометр с постоянной температурой, англ. CTA).
Продолжение следует
Способ 2. идеологически правильный: задействуем timer1
Вообще-то этот способ следовало бы реализовать на чистом ассемблере, а не в среде Arduino, тогда из него можно было бы вытянуть максимум возможного. Но и так, учитывая наш диапазон частот в единицы-десятки герц, получится неплохо.
Способ состоит в том, что мы запускаем 16-разрядный Timer1 сразу в двух режимах: счета и захвата событий. При счете удобно установить делитель тактовой частоты 1/8, тогда в 16-мегагерцовом контролере время подсчитывать будем тиками по половине микросекунды.
При переполнении (65536 половин микросекунды) вызывается прерывание переполнения, которое инкрементирует счетчик третьего разряда (байта) длинного числа. Трех байтовых разрядов (16777216 половин микросекунды или около 8 секунд) вполне достаточно для наших целей подсчета периода частоты порядка единиц-десятков герц.
По захвату события перепада уровня мы фиксируем трехразрядное число тиков, прошедших с предыдущего такого события (собирая его из значений регистров таймера плюс третий старший разряд), обнуляем все переменные и счетные регистры и ждем следующего перепада.
Идеологически правильный этот способ потому, что все происходит в пределах одного таймера, на который ничего больше не влияет: счет происходит большей частью аппаратно. В принципе некоторая ошибка тут может произойти только тогда, когда вызов прерывания таймера будет отсрочен из-за совпадения с каким-нибудь другим прерыванием. Но это в общем случае настолько невероятное событие, что его можно не учитывать.
Я предполагаю, что найдется немало народу, который захочет оспорить это утверждение. В Сети масса источников, выдвигающих тезис о том, что прерывания применять опасно, потому что якобы можно что-то потерять. Глубоко ошибочное мнение: все ровно наоборот — как раз в цикле loop() потерять легко, а в прерываниях очень трудно. Правильная программа должна работать преимущественно на прерываниях (за исключением процедур, которые там нельзя использовать — вроде команды sleep). Только тогда из контроллера можно выжать максимум возможного. Внутри контролера не бывает функций, которые длятся настолько долго, чтобы существенно помешать другим функциям в других прерываниях, даже если это операции c числами типа long или float. Самая долгая из операций — деление чисел типа long — выполняется примерно за 670-680 тактов, то есть где-то за 42 микросекунды и она редко бывает больше чем одна на все прерывание. Вот обмен с внешней средой длится гораздо дольше: так, передача байта со скоростью 9600 длится примерно миллисекунду. Но длинные процедуры обмена с ожиданием ответа вполне можно расставить в программе так, чтобы не мешать измерительным или иным операциям, критичным ко времени. А если все-таки ваш контроллер оказывается забит длительными вычислительными процедурами, то это значит, что неверно выбрана платформа: переходите на 32 разряда или вообще на Raspberry Pi.
Разберемся в этом плане с нашим примером подробнее. Сам подсчет тиков в Timer1 происходит аппаратно и ни от чего не зависит. Прерывания переполнения для наших условий (1/8 тактовой частоты 16 МГц) происходят каждые 32 миллисекунды. Само прерывание состоит из единственной операции инкрементирования переменной третьего разряда размером в один байт (см. далее). Если бы я реализовывал это на ассемблере, то хранил бы третий разряд в рабочем регистре и операция заняла бы ровно один такт. В случае Arduino (и вообще реализаций на С) переменная хранится в ОЗУ, потому еще теряется несколько тактов на извлечение/сохранение в памяти. Плюс вызов прерывания (7 тактов) и возврат (4 такта), то есть вся длительность процедуры составляет порядка микросекунды или чуть более. От длительности промежутка между переполнениями (32 мс) это составляет примерно 0,003%. И какова вероятность того, что некое случайное событие (например, нажатие внешней кнопки) произойдет именно в этот момент? Даже если вы будете все время нажимать на кнопку так быстро, как только сможете, вам едва ли удастся добиться совпадения.
Но даже если это невероятное событие произойдет, то ошибка будет составлять максимум сумму длительностей прерываний — нашего и обрабатывающего помешавшее событие. И если, как мы говорили, хотя бы на время измерения удержаться от длительных процедур типа деления многобайтных чисел или обмена информацией через внешние порты, то при измерении достаточно длинных периодов такая ошибка практически не скажется на результатах.
Вот что способно реально помешать нашим прерываниям — это периодическое обновление функции millis() через прерывание переполнения Timer0, которое возникает каждую миллисекунду и длится несколько микросекунд (см. эту функцию в файле wiring.c). Относительно системного времени наши прерывания возникают также в случайный момент, но вероятность наткнуться на прерывание Timer0 составляет уже порядка процента, что немало. Если хотите пойти на поводу вашего перфекционизма, то на время измерений следует, строго говоря, отключать Timer0. Но если учесть, что максимальная ошибка составляет единицы микросекунд, а мы измеряем периоды длительностью от тысяч до сотен тысяч микросекунд, то на эту ошибку можно не обращать внимания.
Скажу сразу: все будет несколько иначе выглядеть тогда, когда все эти события не являются случайными относительно друг друга. Такое будет, если запускающий перепад синхронизирован с тактовым генератором самого контроллера. Именно с целью проверки, что происходит в этой ситуации, в скетче имеется закомментированная функция tone(). О результатах такой проверки – в конце статьи.
Скетч для проверки этой идеи выглядит следующим образом:
#define Tone_PIN 12 // выход частоты– см. в тексте
#define IN_PIN 8 //вход обнаружения частоты /ICP1 - для памяти
volatile byte time2 = 0; //старший разряд времени, два младших - регистры таймера
volatile unsigned long ttime = 0; //Время срабатывания датчика
volatile unsigned long time_old = 0; //Предыдущее время
volatile uint8_t flag=0;
void setup() {
pinMode(IR_PIN, OUTPUT); //на выход
pinMode(IN_PIN, INPUT); //вывод обнаружения частоты на вход
// установка регистров таймера1
TCCR1A = 0;
// Устанавливаем захват по фронту и делитель 1/8 к тактовой частоте 16МГц
TCCR1B =1<<ICES1 | 1<<CS11 ;
//разрешаем прерывание по переполнению и захвата Timer1
TIMSK1 = 1<<TOIE1 | 1<<ICIE1;
//Обнуляем счетные регистры
TCNT1 = 0;
Serial.begin(9600);
// tone(Tone_PIN, 30);
delay(1000);
}
ISR( TIMER1_OVF_vect ) //прерывание счета времени
{
time2 ; //увеличиваем на единицу старший разряд времени
}
ISR(TIMER1_CAPT_vect) //прерывание захвата
{
TCNT1 = 0; // очищаем Timer1 Count Register
uint16_t time01 = ICR1; //сохраняем состояние счетчика таймера, разряды 0 и 1
if(flag!=1) ttime = ((unsigned long)time2 << 16) time01; //собираем
time2=0;
}
void loop() {
flag=1; //чтобы ttime не изменилось в процессе вывода
Serial.println(ttime/2);
if (ttime!=0) {//на случай отсутствия частоты
float f = 2000000/float(ttime); // Вычисляем частоту сигнала в Гц
Serial.println(f,1);}
flag=0;
delay(500);
}
При выводе результатов мы учли, что один тик таймера равен 0,5 микросекунды. Кроме того, здесь введен флаг, который на время вывода препятствует изменению подсчитанной величины периода. На сам процесс измерений он не повлияет. Большая задержка в конце setup обусловлена необходимостью выждать некоторое время, иначе первые измерения будут ошибочными. Минимальная ее величина равна периоду измеряемых колебаний.
Кстати, действительно, а что будет, если частоты на входе нет вовсе? Эта ситуация никак не отрабатывается, потому что для безопасного выполнения программы это не требуется. Если оставить вход 8 подключенным к какому-либо потенциалу, то значение периода (переменная ttime) просто не будет меняться – в ней задержится то, что было ранее. Если это была какая-то частота, она и будет демонстрироваться. Если с момента загрузки ни одного импульса не проскочило, то будет ноль (на этот случай и ограничение вывода). А если, кстати, оставить вход 8 висящим в воздухе, то c довольно высокой точностью будет измеряться помеха 50 Гц.
Конечно, если по условиям измерений требуется как-то отрабатывать ситуацию отсутствия частоты на входе, то можно ввести таймаут на ожидание захвата. Например, это можно сделать через контроль в основном цикле состояния того же флага flag, значение которого нужно будет изменять в прерывании захвата. Теперь он будет сообщать, что прерывание произошло (или не произошло в течение заданного времени). А использовать результат измерения целесообразно будет тогда, когда измерение действительно произойдет, согласно состоянию флага.
Результаты измерений для тех же частот 2, 8, 64, а также 2048 и 16384 герца объединены в таблицу:
Заметим, что измерения интервала даже для высоких частот выдают достаточно стабильные результаты, если и отличающиеся друг от друга, то в законной единице младшего разряда. Но для высоких частот заметна систематическая ошибка в две лишних микросекунды, отчего значения частот получаются завышенными.
Такой способ можно рекомендовать при необходимости проведения наиболее точных измерений длительных периодов. Недостаток его также очевиден: измерения можно проводить только через вывод номер 8 (вывод PB0 контроллера).