Часы-метеостанция на Arduino своими руками | AlexGyver

Часы-метеостанция на Arduino своими руками | AlexGyver Анемометр

Анемометр v.1.0

Сделал измеритель скорости ветра для будущей метеостанции. Не уверен, правда, что будет нормально работать, т.к. опыта в области анемометростроения у меня нет. Зато вдоволь наигрался с оптопарой от шариковой мыши и проверил её возможности в плане измерения скорости (частоты) вращения

DSC01200

Из закормов Родины взял советский шаговый двигатель

DSC01163

Разобрал, вытряхнул из него все лишнее: убрал статор, выпрессовал звездочки и магнит на роторе. Вот сколько всего ненужного получилось

DSC01168

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

DSC01170

DSC01173

Далее подобрал шпильку диаметром 5 мм и металлическую трубку

DSC01176

Шпильку подстыковал к другому концу выходного вала и снаружи зафиксировал трубкой.

DSC01177

Трубка одевается на вал втугую, но для надежности дополнительно залил внутрь эпоксидку

DSC01181

Перехожу к ходовым испытаниям. Спаял схему

tachometer

Написал небольшую программу — тахометр, которая по формуле рассчитывает количество оборотов в соответствии с количеством импульсов, поступающих на вход микроконтроллера за единицу времени. Каждый замер длится 1 секунду. Результаты замеров записываются в массив данных. Затем вычисляются средняя (RPM) и максимальная частота вращения (RPMMAX). Скачать скетч для ардуинки можно тут

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

DSC01159

Получилось измерять скорость вращения примерно до 1800 об/мин, что соответствует 30 об/сек. При дальнейшем увеличении частоты вращения, показания резко снижаются. Не понятно что на это влияет — то ли сам алгоритм не успевает считать, то ли не хватает быстродействия фототранзистора. А может и то и другое. В любом случае, в качестве анемометра схема вполне работоспособна.

monitor

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

DSC01197

Вытряхнул из него внутренности

DSC01198

С мыслью «из чего бы сделать крыльчатку?» прогулялся в магазин детских товаров. Немного побродил и таки нашел нужную погремушку! Купил, принёс домой

DSC01065

Достал 2 больших шарика. Диаметр у них 50 мм

DSC01066

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

DSC01194

Стойки, на которых держатся крыльчатки, изготовил из спиц от зонтика. Они лёгкие и прочные. Закрепил стойки к чашечкам с помощью винтов М3, второй конец одел на шпильку вала. Длину стоек выбрал произвольно, около 70 мм. Не знаю много это или мало. Так же непонятно — сколько чашечек нужно? в Интернете находил конструкции с 3 шт, поэтому сделал пока тоже с 3-мя. Изделие в сборе

DSC01202

Получилась довольно внушительная штуковина. Слабый ветер навряд ли будет чувствовать, но на смерчи, ураганы как-то реагировать должна. Испытания покажут. Может у кого нить есть мысли как доработать механическую часть для улучшения характеристик?

Внутренний блок — код 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, 000 ; Use LCD Pin 1, no hserin
; ByVac 20×4 IASI-2 Serial LCD
hi2csetup i2cmaster, 010000, i2cfast, i2cbyte ; Initialize I2C for MCP3422 ADC chip.
hi2cout (011000) ; 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

Про анемометры:  Xiro Xplorer V: незаурядный дизайн и выдающиеся характеристики

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

Делаем анемометр на arduino для измерения скорости ветра

23 февраля в 16:00

Уроки / Arduino

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

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

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

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

В таблице ниже перечислены все необходимые компоненты для конструирования и их особенности.

КомпонентОсобенности
Модуль МПЗВо всех инструкциях указано, что общая поддержка модуля равняется 25 тысячам фрагментов фраз, звуковых сигналов и мелодичных тонов. Загруженное аудио делится ровно на 255 музыкальных композиций. Встроено 30 уровней для регулирования громкости, а эквалайзер включает в себя 6 режимов обработки.
«Ручной» анемометрИнструмент представляет собой сенсорный датчик, который используется для слежения и оповещения, для человека, занимающегося различными видами спорта, где учитывается дуновение ветра.Внутрь встроен контроллер, работа которого заключается в отсеивании помех. Следовательно, исходящий сигнал будет надежным и увеличенным по громкости. Через секунду с момента появления ветра датчик запиликает, и на сенсоре высветится показатель.Корпус сооружения полностью спрятан от попадания влаги. Разъем, куда присоединен шнур питания, также обмотан водонепроницаемым материалом. Само устройство сконструировано с использованием прочного металла. Поэтому такой сенсор не боится плохих погодных условий под открытым небом.
Микропроцессор АрдуиноСоставляющие компоненты микропроцессора: аппаратная и программная группа. Программируемый код записан на знаменитом языке программирования С , который был гораздо упрощен до Wiring. В микропроцессор встроена бесплатная среда, в которой любой пользователь может дать жизнь своей программе с помощью кода. Ардуино-среду разработки поддерживают все операционные системы: Виндовс, Мак ОС и Линукс.Ардуино-платформа «разговаривает» с компьютером с помощью юсб-кабеля. Чтобы микропроцессор работал в автономном режиме, придется приобрести блок питания до 12 В. Однако питание для Ардуино-платформы, кроме юсб адаптера, может осуществляться с помощью батареи. Определение источника производится автоматическим образом.Норма для питания платы варьируется между 6 и 20 В. Следует учитывать, что если напряжение в электрической сети меньше 7 В, работа микропроцессора становится неустойчива: возникает перегрев, после чего на плате появляются повреждения. Поэтому не стоит верить указанной в инструкции норме питания и выбрать диапазон, начиная с 7 В.Встроенная в микропроцессор флеш-память равна 32 кБ. Однако 2 кБ потребуется для работы бутлоадера, с помощью которого осуществляется прошивка Ардуино с использованием компьютера и юсб-кабеля. Предназначение флеш памяти в таком случае – сохранение программ и надлежащих статических ресурсов.В Ардуино платформу также включена СРАМ-память, в которой числится 2 кБ. Предназначение данного вида памяти микропроцессора – сохранение временных сведений в качестве переменных, использующихся в программных кодах. Данную закономерность можно сравнить с оперативной памятью любого компьютерного устройства. Когда платформа отключается от источника питания, оперативная память очищается.
Динамик с мощностью до 3-х ВтМожно купить в любом компьютерном магазине.
Карта с памятью не меньше 32 ГбАналогично предыдущему пункту.
Резистор на 220 Ом в количестве 2 штукиТакие резисторы отличаются постоянной мощностью в 0,5 ВТ и точностью до 5 процентов. Работа осуществляется под напряжением не более 350 В.
Батарея «Крона»Батарейка «Крона» сделана на алкалайновой основе и отлично работает на 9 В. Инструмент предназначен для управления электронной самодельной аппаратурой, к которой подключаются периферийные устройства наподобие сенсорных или дисплейных датчиков. Выпускает заряженное «чудо» компания из Германии – Ansmann.
Кабель питания для подзарядки батареиКабель предназначен для того, чтобы заряжать стандартные батарейки «Крона» на 9 В. С одной стороны торчит штекер с плюсовым центром, с другой – разъем для применения батареи.
Провода для соединения схемы «папа-папа»Данные провода отлично соединяют периферийные устройства между собой.
БредбоардБредбоард – специальная дощечка, которая создана для прототипирования. Такое устройство не заставит юного электронщика делать множественные спайки, которые обычно требуются для конструирования электронных устройств.
Клеммник в количестве 3 штукиКлеммник – небольшая коробочка для присоединения пары контактов. Расстояние между разъемами контактов равняется 2х3 мм. Оборудование легко установить на макетной плате: все соединительные провода плотно фиксируются и крепко сжимаются.

Метеостанция на arduino

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

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

Рассмотрим создание домашней метеостанции на контроллере Arduino.

Про анемометры:  ✅ Приборы для измерения параметров микроклимата | Testo цена в Москве и Санкт-Петербурге ✅

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

  • контроллер Arduino;
  • плата прототипирования (без пайки)
  • модуль датчика BMP085 или BMP180
  • модуль с датчиком влажности DHT11
  • датчик температуры DS18B20
  • резистор 4,7 кОм;
  • дисплей Nokia 5110
  • провода и корпус

В качестве платы Arduino в принципе можно использовать любую из модельного ряда Arduino, но я рекомендую Arduino Uno или Arduino Duemilanove, так как в будущем собираюсь установить на нее Ethernet shield, чтобы сделать домашнюю метеостанцию устройством IoT (“Интернета вещей”). Я буду использовать плату Arduino Duemilanove (рисунок 1).

Рис. 1. Плата Arduino Duemilanove

Теперь рассмотрим датчики, которые будем использовать в проекте.

Датчик давления BMP085 (рисунок 2) – высокоточный датчик атмосферного давления с низким энергопотреблением. используется для измерения атмосферного давления. Точность достигает минимального значения измерения давления 0.03hPa. Также выводит и данные о температуре.

Напряжение питания 1.62V – 3.6V. Интерфейс подключения I2C. В продаже встречаются готовые платы  как с стабилизатором, так и без него.

Датчик давления BMP085 мы будем использовать только для измерения атмосферного давления, для измерения температуры будем использовать более точный датчик DS18B20.

Рис.2. Модуль датчика BMP085

Датчик температуры DS18B20 (рисунок 3) –  это цифровой измеритель температуры  с  разрешением преобразования 9 – 12 разрядов и функцией тревожного сигнала контроля за температурой.

Обменивается данными с микроконтроллером по однопроводной линии связи, используя протокол интерфейса 1-Wire. Диапазон измерения температуры составляет от -55 до 125 °C. Для диапазона от -10 до 85 °C погрешность не превышает 0,5 °C.

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

Рис. 3. Датчик температуры DS18B20

Датчик DHT11 (рисунок 4) не обладают высоким быстродействием и точностью, но зато имеет низкую стоимость. Датчик состоит из емкостного датчика влажности и термистора.

Содержит аналого-цифровой преобразователь для преобразования аналоговых значений влажности и температуры в цифровые. Диапазон измерения влажности – 20-80%, частота опроса 1 раз в секунду.

Мы будем использовать в проекте датчик DHT11 в виде готового модуля.

Рис.4. Модуль DHT11

Для отображения информации с датчиков будем использовать ЖК-дисплей Nokia 5110 (рисунок 5). Это графический монохромный дисплей с разрешением 84×48 точек. Дисплей Nokia 5110 поставляется на плате в паре с контроллером PCD8544 и штыревым разъемом. Электропотребление дисплея позволяет питать его от выхода 3.3 В платы Arduino.

Рис. 5. Дисплей Nokia 5110

Собираем схему согласно рисунка 6.

Рис. 6. Схема подключения к Arduino

Для удобства я спаял датчики на плате прототипирования, сделал контакты для подключения проводов от дисплея и оформил это в виде шилда – припаял штырьки для подключения к контактам платы Arduino (рисунок 7).

Рис. 7. Как получилось у меня. Проект метеостанции на Arduino

Теперь приступим к написанию скетча.

При написании скетча нам понадоьятся следующие Arduino-библиотеки:•    OneWire – для работы с устройствами 1-Wire (датчик DS18B20);•    BMP085 и Wire – для работы с датчиком BMP085 (или BMP180);•    DHT – для работы с датчиком DHT11;•    Adafruit_GFX и Adafruit_PCD8544 – для работы с дисплеем Nokia 5110.

С периодичностью 5 секунд получаем данные с датчиков DS18B20, DHT11, BMP085 и выводим в монитор последовательного порта и на дисплей Nokia 5110. Процедура получения данных с датчика DS18B20 – get_temp()  выполняет поиск устройств 1-Wire, подключенных к выводу Adruino  D7 (у нас один датчик), и выдает его данные.

Запустим Arduino IDE. Создадим новый скетч и внесем в него содержимое листинга 1.

// подключение библиотек#include#include#include#include “DHT.h”#include#include// тип DHT сенсора#define DHTTYPE DHT11   // DHT 11 // создание экземпляров объектовBMP085 dps = BMP085();DHT dht(8, DHTTYPE);  // dht11 на pin 8OneWire  ds(9);

// ds18b20 на pin 9// Nokia 5110// pin 3 – Serial clock out (SCLK)// pin 4 – Serial data out (DIN)// pin 5 – Data/Command select (D/C)// pin 6 – LCD chip select (CS)// pin 7 – LCD reset (RST)Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);// переменныеint Temp1;

long Temperature085 = 0, Pressure085 = 0, Altitude085 = 0; void setup() {// запуск последовательного портаSerial.begin(9600);Serial.println(“start”);// запуск I2CWire.begin();// запуск bmpdps.init();   // инициализация дисплеяdisplay.begin();// установить контраст фона экранаdisplay.

setContrast(60);display.clearDisplay();       // очистить экранdisplay.setTextSize(1);    // размер шрифтаdisplay.setTextColor(BLACK);   // цвет// заставкаdisplay.setCursor(15,15);   display.print(“Home Meteo”);   display.display();

delay(2000);} void loop () {display.clearDisplay();     display.setCursor(15,5);   display.print(“Home Meteo”);    // ds18b20int Temp=get_temp();if(Temp==999) {display.setCursor(15,15);   display.print(“t=”);      display.

print(Temp1/16);      display.print(“.”);display.print(((Temp1)*100)/16);display.print(” C”);}else if(Temp==998) {Serial.println(“Temp=ERROR”);display.setCursor(15,15);   display.print(“t=ERROR”);    }else {Serial.print(“Temp=”);Serial.print(Temp/16);Serial.print(“.”);Serial.

print(((Temp)*100)/16);Serial.println(” *C”);display.setCursor(15,15);   display.print(“t=”);      display.print(Temp/16);      display.print(“.”);display.print(((Temp)*100)/16);display.print(” C”);Temp1=Temp;}// dht11float h = dht.readHumidity();float t = dht.

readTemperature();Serial.print(“humidity=”);    Serial.print(h);Serial.println(” %”);Serial.print(“temperatura=”);    Serial.print(t);Serial.println(” *C”);display.setCursor(15,25);   display.print(“h=”);    display.print(h);    display.print(” %”);

// bmp085dps.getTemperature(&Temperature085);    dps.getPressure(&Pressure085);dps.getAltitude(&Altitude085);Serial.print(“pressure5=”);    Serial.print(Pressure085/133.3);Serial.println(” mm Hg”);Serial.print(“temp5=”);    Serial.

print(Temperature085*0.1);Serial.println(” *C”);Serial.println();display.setCursor(5,35);   display.print(“p=”);    display.print(Pressure085/133.3);    display.print(“mmHg”);// обновитьdisplay.display();// паузаdelay(5000);}// получение температуры датчика ds18b20int get_temp() {byte i;byte present = 0;

byte data[12];byte addr[8];int Temp;if ( !ds.search(addr)) {Serial.print(“No more addresses.“);ds.reset_search();return 999;}Serial.print(“R=”);  // печать уникального 1-wire идентификатораfor( i = 0; i < 8; i )

{
    Serial.print(addr[i], HEX);
    Serial.print(» «);
  }
  Serial.println();
  if ( OneWire::crc8( addr, 7) != addr[7]) {
        Serial.print(«CRC is not valid!
«);
        return 999;
  }
  if ( addr[0] != 0x28) {
        Serial.print(«Device is not a DS18S20 family device.
«);
        return 999;
  }
    ds.reset();
  ds.select(addr);
  // начинаем преобразование, используя ds.write(0x44,1)
  ds.write(0x44,1);
  // пауза с запасом (750 мс)

Простейший барометрический высотомер на базе arduino

Часы-метеостанция на Arduino своими руками | AlexGyver

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

Подробнее?Сразу скажу, на оригинальность и новаторство не претендую, подобных проектов в сети навалом. Но на этом ресурсе ничего подобного поиском не обнаружил, потому и решил опубликовать, вдруг кому-то пригодится.Код опять же писал сам, потому, если там сплошная индусятина – не судите строго =) Я пока только учусь.

Последний раз контроллеры программировал на 4-м курсе института больше 10 лет назад =) Грамотная и конструктивная критика приветствуется!Постараюсь доступно и подробно объяснить как собрать такое устройство, справится человек с почти любым уровнем подготовки, я думаю.Основной плюс данного девайса – его цена.

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

Функции устройства:

– Измерение текущей высоты и вывод ее на светодиодный дисплей.- Запоминание максимального значения высоты имевшей место с момента включения питания.- Вывод максимальной высоты на дисплей посредством нажатия кнопки.- Запись максимального значения высоты в энергонезависимую память (EEPROM) контроллера (сохраняется после отключения питания).

Что понадобится (в скобках ключевые слова для поиска на всяких там ебаях и т.п.)

– микроконтроллер ардуино, в принципе подойдет почти любой, если код даптировать, но собиралось и проверялось все на базе (Arduino Nano).- барометрический датчик высоты с шиной I2C (BMP085).- трехразрядный семисегментный светодиодный дисплей с общим анодом (7-Segment LED Display).

– провода для соединения всего этого в единое целое, я использовал готовые и с разъемами, но это совсем не обязательно (Dupont Wire).

– кнопка, подойдет любая без фиксации положения (Tact Switch Push Button). Например такая:

– резистор от 1КОм до 10КОм.

– три резистора 100Ом.- паяльник со всеми гобулями и умение им пользоваться.

– Arduino Software.

Опционально:- макетная плата для распайки дисплея.

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

Введение в тему, простейшие примеры.О подключении семисегментного дисплея с примерами.Описание датчика, примеры, библиотеки.Времени много не займет, понимания сильно прибавит =)

Про анемометры:  Testo 425 Руководство по эксплуатации онлайн [1/17]

Сначала немного о дисплее.Семисегментный светодиодный дисплей с общим анодом представляет из себя вот такую сборку из светодиодов (на картинке обведено красным):

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

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

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

Подробней о датчике.

Датчик барометрический, т.е. определяет изменение высоты по изменению атмосферного давления. Фактически датчик измеряет только атмосферное давление, вычислением высоты как функции от давления занимается уже код библиотеки для датчика. При этом датчик имеет встроенный АЦП и интерфейс I2C, т.е. выдает измеренную величину уже в цифровом виде, что несомненно является плюсом.

Для работы с датчиком существует готовая библиотка. Я использовал именно первую версию, она менее ресурсоемка и проще встраивается в код. Функционал библиотеки позволяет настраивать точность измерений по шкале от 0 – наименьшая точность, до 3 – наибольшая точность (см. код).

Хотя если честно я не заметил особенной разницы между уровнями выше 0. Погрешность измерений составляет около 1 метра, что в общем-то вполне приемлимо. Результат измерений – это абсолютная высота над уровнем моря при нормальном атмосферном давлении.

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

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

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

Схема соединения элементов устройства (кликабельно):

Предвосхищая вопросы из серии “что, нормальную схему не мог нарисовать?!” скажу, что мог бы, но для непосвященных такой ваиант мне думается будет проще для восприятия, а посвященным все равно, и так читается схема нормально. Распиновку семисегментника нашел только для четырехразрядной версии, трехразрядная версия отличается банально отсутствием 6-й ноги.

Что касется питания устройства: ардуино в первозданном виде способен нормально пережить от 7В до 16В, в крайнем случае от 6В до 20В. Но, учитывая, что у меня был китайский клон, гнусных опытов я ставить не стал, но от батареи LiPo 3S работает без проблем.

Датчик желательно упаковать таким образом, чтобы доступ воздуха был свободный, но при этом исключить прямой обдув потоками воздуха отверстия в датчике, например, прикрыть его пороллоном.С платы ардуино рекомендую удалить светодиоды RX и TX, т.к. они включены параллелльно 0 и 1 цифровым выводам, из-за чего сегменты подключенные к этим выводам будут светиться с меньшей яркостью.

Код для Aduino IDE:(Altimeter_v1.01.ino)Комментирован очень подробно, но если все же возникнут вопросы – не стесняйтесь.

Об интерфейсе:

Ну и что, что весь интерфейс – одна кнопка и три символа?! Описать все равно надо =)При нажатии и удержании кнопки на дисплей выводится максимальная высота, зафиксированная с момента включения питания.Если продолжить удерживать кнопку в течении 2 секунд на дисплей будет выведено значение высоты записанное в EEPROM.

Если продолжить удерживать кнопку в течении 4 секунд, в EEPROM будет записана текущая максимальная высота и на дисплее загорится буква “S”, которая на самом деле цифра “5” =)Дальше кнопку держать смысла нет, можно отпускать.

Отрицательная высота не выводится, т.к. знак минус рисовать некуда, поэтому в таком случае на дисплей выводятся три буквы “L”.Скетч обновлен.

Отрицательная высота выводится на первые два разряда, т.е. минимальное значение -99.

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

Еще один нюанс: запись в EEPROM происходит побайтно, то есть в одну ячейку можно записать число не больше 255. С одной стороны можно было реализовать разбиение на байты, писать побайтно, а при чтении склеивать обратно.

С другой стороны, учитывая, что максимальное значение 999, проще, как мне показалось перед записью делить значение высоты на 4, а при чтении умножать записанное на 4 перед выводом на дисплей.

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

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

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

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

Дисплей распаял на макетке, не люблю платы травить, да и лень =)

При подключении дисплея не забываем про токоограничивающие резисторы!

Собрал всю лапшу в кучку.

Упаковал.

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

На этом все. Спасибо за внимание! Еще раз напомню, грамотная критика, отзывы и предложения приветствуются!

Мои предыдущие записи:

FPV. От начинающего начинающим. Часть 2. Маленький и шустрый.

FPV. От начинающего начинающим. Часть 1. Близко и низко.Внедрение джойстика от PS2 в аппаратуру Turnigy 9XУвеличиваем максимальный угол отклонения стандартной сервомашинки.Отдельностоящий (выносной ретранслятор) модуль РУ для FPV.

Оцените статью
Анемометры
Добавить комментарий