Анемометром называют устройство, использующиеся в метеорологии для показания скорости и направления ветровых волн. Составляющие компоненты: чашечная верхушка, крепко прицепленная к оси прибора, соединяется с механизмом измерения. Когда воздушный поток проходит сквозь приспособление, чашечки или лопасти активизируются и начинают вращаться вокруг осевого столба.
Конструируют метеорологический инструмент, учитывая, для какого конкретного действия он будет предназначен. Анемометр измеряет количество оборотных действий чашечек или лопастей вокруг осевого центра в определенное время, что обычно равняется расстоянию, после этого считается скорость ветровых потоков в средней величине.
В другом случае лопасти или чашечки присоединяются к индукционному тахометру, заряженному электричеством. Здесь скорость ветровых потоков показывается сразу: не нужно дополнительно просчитывать другие величины и наблюдать за меняющейся скоростью.
Вышеописанный прибор можно с легкостью сконструировать в домашних условиях. Статья ниже расскажет читателю, как сделать автоматический Arduino анемометр в домашних условиях.
Шаг 1: Инструмент и периферия для изготовления анемометра на базе 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 мм. Оборудование легко установить на макетной плате: все соединительные провода плотно фиксируются и крепко сжимаются. |
Шаг 2: Схема подключения
После того, как все компоненты куплены или собраны, переходим к схеме подключения ардуино анемометра:
- Соединяем все вышеперечисленные компоненты выше между собой, используя при этом соединительные провода и клеммники. Питание пока не включаем.
- Записываем на флешку 7 поочередных мелодий, придумываем соответствующие названия.
- Флешку подключаем к МП3-модулю.
- Подаем в устройство питание.
- В разделе ниже приведен код программы, которую нужно перенести на Ардуино микропроцессор.
- Испытываем прибор в действии.
Шаг 3: Программирование Arduino для считывания данных с анемометра
Алгоритм кода для осуществления работы анемометра:
#include <mp3TF.h> mp3TF mp3tf = mp3TF (); unsigned int speed; unsigned char prev_speed; unsigned int speed_change_counter = 0; boolean speed_changed = false; void setup() { mp3tf.init(&Serial); Serial.begin(9600); } unsigned int measureSpeed() { return analogRead(A0); } void saySpeed() { unsigned char pseudospeed = speed/40; if(pseudospeed == 0) mp3tf.stop(); else if(pseudospeed > 6) mp3tf.play(7); else mp3tf.play(pseudospeed); } void loop() { speed = measureSpeed(); if (abs(speed-prev_speed) > 40 && speed/40 != prev_speed/40) { speed_change_counter = 0; speed_changed = true; prev_speed = speed; } else { if(speed_changed) { if(++speed_change_counter == 10) { speed_changed = false; saySpeed(); } } } delay(100); }
Шаг 4: Дополнительные примеры
Еще один вариант реализации этого устройства продемонстрировали коллеги из компании ForceTronics. Они сделали видео о том как происходил процесс создания анемометра:
Скетч для микроконтроллера от этой компании ниже:
//*****************Arduino anemometer sketch****************************** const byte interruptPin = 3; //anemomter input to digital pin volatile unsigned long sTime = 0; //stores start time for wind speed calculation unsigned long dataTimer = 0; //used to track how often to communicate data volatile float pulseTime = 0; //stores time between one anemomter relay closing and the next volatile float culPulseTime = 0; //stores cumulative pulsetimes for averaging volatile bool start = true; //tracks when a new anemometer measurement starts volatile unsigned int avgWindCount = 0; //stores anemometer relay counts for doing average wind speed float aSetting = 60.0; //wind speed setting to signal alarm void setup() { pinMode(13, OUTPUT); //setup LED pin to signal high wind alarm condition pinMode(interruptPin, INPUT_PULLUP); //set interrupt pin to input pullup attachInterrupt(interruptPin, anemometerISR, RISING); //setup interrupt on anemometer input pin, interrupt will occur whenever falling edge is detected dataTimer = millis(); //reset loop timer } void loop() { unsigned long rTime = millis(); if((rTime - sTime) > 2500) pulseTime = 0; //if the wind speed has dropped below 1MPH than set it to zero if((rTime - dataTimer) > 1800){ //See if it is time to transmit detachInterrupt(interruptPin); //shut off wind speed measurement interrupt until done communication float aWSpeed = getAvgWindSpeed(culPulseTime,avgWindCount); //calculate average wind speed if(aWSpeed >= aSetting) digitalWrite(13, HIGH); // high speed wind detected so turn the LED on else digitalWrite(13, LOW); //no alarm so ensure LED is off culPulseTime = 0; //reset cumulative pulse counter avgWindCount = 0; //reset average wind count float aFreq = 0; //set to zero initially if(pulseTime > 0.0) aFreq = getAnemometerFreq(pulseTime); //calculate frequency in Hz of anemometer, only if pulsetime is non-zero float wSpeedMPH = getWindMPH(aFreq); //calculate wind speed in MPH, note that the 2.5 comes from anemometer data sheet Serial.begin(57600); //start serial monitor to communicate wind data Serial.println(); Serial.println("..................................."); Serial.print("Anemometer speed in Hz "); Serial.println(aFreq); Serial.print("Current wind speed is "); Serial.println(wSpeedMPH); Serial.print("Current average wind speed is "); Serial.println(aWSpeed); Serial.end(); //serial uses interrupts so we want to turn it off before we turn the wind measurement interrupts back on start = true; //reset start variable in case we missed wind data while communicating current data out attachInterrupt(digitalPinToInterrupt(interruptPin), anemometerISR, RISING); //turn interrupt back on dataTimer = millis(); //reset loop timer } } //using time between anemometer pulses calculate frequency of anemometer float getAnemometerFreq(float pTime) { return (1/pTime); } //Use anemometer frequency to calculate wind speed in MPH, note 2.5 comes from anemometer data sheet float getWindMPH(float freq) { return (freq*2.5); } //uses wind MPH value to calculate KPH float getWindKPH(float wMPH) { return (wMPH*1.61); } //Calculates average wind speed over given time period float getAvgWindSpeed(float cPulse,int per) { if(per) return getWindMPH(getAnemometerFreq((float)(cPulse/per))); else return 0; //average wind speed is zero and we can't divide by zero } //This is the interrupt service routine (ISR) for the anemometer input pin //it is called whenever a falling edge is detected void anemometerISR() { unsigned long cTime = millis(); //get current time if(!start) { //This is not the first pulse and we are not at 0 MPH so calculate time between pulses // test = cTime - sTime; pulseTime = (float)(cTime - sTime)/1000; culPulseTime += pulseTime; //add up pulse time measurements for averaging avgWindCount++; //anemomter went around so record for calculating average wind speed } sTime = cTime; //store current time for next pulse time calculation start = false; //we have our starting point for a wind speed measurement }
На этом пока всё. Желаем вам хороших проектов! Любые пожелания и комментарии вы можете оставить в нашей группе ВКонтакте.