Анемометр arduino: комплектующие, схема устройства, скетч

Делаем анемометр на 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 мм. Оборудование легко установить на макетной плате: все соединительные провода плотно фиксируются и крепко сжимаются.

Шаг 2: Схема подключения

После того, как все компоненты куплены или собраны, переходим к схеме подключения ардуино анемометра:

  1. Соединяем все вышеперечисленные компоненты выше между собой, используя при этом соединительные провода и клеммники. Питание пока не включаем.
  2. Записываем на флешку 7 поочередных мелодий, придумываем соответствующие названия.
  3. Флешку подключаем к МП3-модулю.
  4. Подаем в устройство питание.
  5. В разделе ниже приведен код программы, которую нужно перенести на Ардуино микропроцессор.
  6. Испытываем прибор в действии.

Шаг 3: Программирование Arduino для считывания данных с анемометра

Алгоритм кода для осуществления работы анемометра:

#include 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 }

На этом пока всё. Желаем вам хороших проектов! Любые пожелания и комментарии вы можете оставить в нашей группе ВКонтакте.

Источник: https://ArduinoPlus.ru/delaem-anemometr-arduino/

Самодельный анемометр и Arduino

Опубликовано 17.09.2013 21:06:00

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

Должно было получиться что-то вот такое

Этапы изготовления самого датчика:

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

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

Тогда зажал в тиски и сверлом на 0,5 мм меньше, чем диаметр подшипника просверлил вертикально отверстие в нижние крышке и в средние, оба для подшипников. Чтоб подшипники стали с натяжкой подгонял разверткой. Подшипники встали как родные.

Затем в них вставил чуть-чуть подшлифованный гвоздь 100-ку при этом в середине окошка надев на него пластмассовую шаийбу с 4-мя прорезями. На гвозде снизу нарезал резьбу и на нее накрутил крыльчатку.

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

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

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

Светодиодиодно — фототранзисторный датчик выдернул из принтера, там таких навалом.

Сначала сделал из теннисных мячиков

Пришлось немного модифицировать прибор. На крыльчатка от теннисных мячиков он стартовал при ветре 5м/с. были куплены мячики в магазине детских игрушек диаметром 55 мм. Стартует при 2м/с и ведет измерения до 22 м/с, Мне хватаєт.

После того как датчик был готов. Надо было сделать электронику.

Первый вариант был самодельный ЛУТ технология + зеленая маска из Китая, сохнет под ультрафиолетом.

55 на фотографии это оборотов в секунду. Надо было как-то перевести в м/с. Долго думал как, достал даже два анемометры старый еще с СССР и китайский за 50 $, но с поверкой возникли проблемы, потому что ветер порывистый и не дует стабильно.

Читайте также:  Уроки ардуино: измеряем скорость вращения спинера

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

Сначала выставил СССР-кий и китайские анемометры я убедился, что они оба показывают одинаково и правильно, потому что если разделить скорость на спидометре машины на 3,6 то получалась цифра которую показывали анемометры в м/с.

Папа ехал с одинаковой скоростью и приборы показывали одинаковый ветер. Таким образом я и проверял свой прибор. Папа добавлял каждый раз +5 км в час, а я записывал новый показатель (оборотов в секунду). Замеры провел трижды.

Когда мы ехали более 80 км/ч (22м/с) мой анемометр уже не мог раскрутиться и цифра замирала, потому более 22м/с он не измеряет….

Кстати, Китайский показывал до 28м/с. СССР-кий до 20м/с. Когда установил его в месте с доработанной программой, еще раз сверил с китайским все сошлось.

Сейчас переделывается под Ардуино.

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

 

Видео работы

Результаты работы за зиму

с-сть — часов за зиму 0 м/с — 511,0 1 м/с — 475,0 2 м/с — 386,5 3 м/с — 321,2 4 м/с — 219,0 5 м/с — 131,5 6 м/с — 63,3 7 м/с — 32,5 8 м/с — 15,4 9 м/с — 9,1 10 м/с — 5,0 11 м/с — 3,5 12 м/с — 2,2 13 м/с — 1,3 14 м/с — 0,8 15 м/с — 0,5 16 м/с — 0,5 17 м/с — 0,2 18 м/с — 0,0

19 м/с — 0,1

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

Теперь немного о Arduino.

Нашел в Интернете схему работы мышки, она наглядно иллюстрирует как работает моя система.

Отталкиваясь от схемы мышки я сделал следующую схемку.

Импульсы поступают с фототранзистора на Arduino, а он воспринимает их как нажатия кнопки.

Алгоритм работы программы таков: Считаем сколько нажатий кнопки произошло за одну секунду вот и имеем частоту вращения. Для того чтобы эту частоту перевести в м/с. еще когда я делал на Атмел я сделал алгоритм расчета частоты в м / с. Выглядел он так:

int ob_per_sec=0; // Переменная в которую попадает частота оборотов в секунду.

int speed_wind=0; // Сюда будет попадать значение после пересчета частоты в м/с.

int speed_wind_max=0; // Сюда попадает максимальное значение показаний ветра м/с.

int speed_wind_2=0; // К-во секунд с начала работы программы со скоростью ветра 2 м/с.

int speed_wind_3=0; // К-во секунд с начала работы программы со скоростью ветра 3 м/с.

int speed_wind_4=0; // К-во секунд с начала работы программы со скоростью ветра 4 м/с.

int speed_wind_5=0; // К-во секунд с начала работы программы со скоростью ветра 5 м/с.

…………………………………………………………..

int speed_wind_22=0; // К-во секунд с начала работы программы со скоростью ветра 22 м/с.

if (ob_per_sec >0 && ob_per_sec4 && ob_per_sec7 && ob_per_sec11 && ob_per_sec15 && ob_per_sec18 && ob_per_sec23 && ob_per_sec27 && ob_per_sec60 && ob_per_sec speed_wind_max){ speed_wind_max = speed_wind ;}// проверяем и перезаписываем, если максимальное значение больше чем предыдущее записанное.

И выводим на экран значение.

speed_wind

speed_wind_max

При необходимости можно затем просмотреть сколько минут дул ветер с определенной скоростью, для этого нужно на экран вывести переменную (с необходимым индексом скорости) speed_wind_№ (но разделить ее на 60, чтобы получились минуты.).

Я у себя в программе сделал так: при нажатии определенной кнопки поочередно выводятся все переменные, от speed_wind_1 до speed_wind_22.

В данный момент еще реализованы не все элементы нашего сообщества. Мы активно работаем над ним и в ближайшее время возможность комментирования статей будет добавлена.

Источник: http://zelectro.cc/arduino_anemometer

Davis Anemometer Arduino Hookup | Code (Part 1 of 3)

This three part tutorial covers the interfacing of the Davis Anemometer to the Arduino. In the first part we cover the detection of the wind direction. In Part 2 we go through how to measure the wind speed. In the final part we update the software to measure both wind speed and direction and provide some other functionality.

For product details including circuit diagrams then click here.

Parts List

  • Arduino Board
  • Davis Anemometer
  • 4K7 Pullup Resistor
  • Breadboard hookup wires
  • USB Cable to suite Arduino
  • A compass for calibrating wind direction

Wiring Diagram for connecting the Davis Anemometer to an Arduino Board

There are two connections to the Arduino. The Wind speed circuit is connected to a digital pin (Pin 2 in this case) and the wind direction circuit is connected to an analog pin (Ananlog Pin 4).

The wind speed circuit is a switch that is activated once revolution of the wind cups. In this hookup we are using a 4.7K pullup resistor. This will pull the pin 2 to 5V when the switch is open. If we don't use a pullup resistor the circuit voltage could float and cause false triggers on the input.

When the mercury switch on the wind cups close then the pin 2 will be pulled to GND for a short duration while the magnet passes the switch. We use this pulse on pin 2 of the Arduino to detect every time the wind cups goes through one revolution.

In Part 2 of this tutorial we go into more detail on measuring the wind speed.

How to Detect the Wind Direction

The wind vane has a 20k linear potentiometer attached to it. The output from the wind direction circuit is connected to a analog pin on the Arduino. As we move the wind vane around we should get a reading between 0 and 1023.

The Arduino has a 10 bit A to D converter which gives us the range of 0 to 1023. This would also correspond to a voltage of 0 to 5V. In the software we need to convert the 0 to 1023 to a 0 to 360 range to give us the wind direction.

The potentiometer in the wind vane has a dead band that will result in the value 0 on the analog pin. The diagram below shows the dead band for the Davis anemometer we were using for testing. In this image we are looking down over the top of the wind vane. The anemometer is resting on the cups.

The wind vane is calibrated from the factory to be 0 when the vane is lined up along the length of the support bar pointing away from the mounting bracket.

Wind Direction Sketch

We can use this sketch to read the output from the wind vane. The sketch reads the analog pin value. We then convert the 0 to 1023 range to a direction value that ranges from 0 to 360.

We use the map command to translate the two value ranges. We are using the offset value of 0 on line 5 as we are have the support arm pointing to magnetic north.

We discuss the calibration of the wind vane below.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 int VaneValue;// raw analog value from wind vaneint Direction;// translated 0 — 360 directionint CalDirection;// converted value with offset appliedint LastValue; #define Offset 0;void setup() {LastValue = 1;Serial.begin(9600);Serial.println(«Vane Value Direction Heading»); }void loop() {VaneValue = analogRead(A4);Direction = map(VaneValue, 0, 1023, 0, 360);CalDirection = Direction + Offset;if(CalDirection > 360)CalDirection = CalDirection — 360;if(CalDirection < 0)CalDirection = CalDirection + 360;// Only update the display if change greater than 2 degrees.if(abs(CalDirection - LastValue) > 5){Serial.print(VaneValue); Serial.print(» «);Serial.print(CalDirection); Serial.print(» «);getHeading(CalDirection);LastValue = CalDirection;} }// Converts compass direction to headingvoid getHeading(int direction) {if(direction < 22)Serial.println("N");else if (direction < 67)Serial.println("NE");else if (direction < 112)Serial.println("E");else if (direction < 157)Serial.println("SE");else if (direction < 212)Serial.println("S");else if (direction < 247)Serial.println("SW");else if (direction < 292)Serial.println("W");else if (direction < 337)Serial.println("NW");elseSerial.println("N");}

Источник: http://cactus.io/hookups/weather/anemometer/davis/hookup-arduino-to-davis-anemometer

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

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

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

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

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

  • контроллер 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.

Читайте также:  Контролируем устройства через bluetooth с помощью arduino - arduino+

// подключение библиотек
#include
#include
#include
#include «DHT.h»
#include
#include
// тип DHT сенсора
#define DHTTYPE DHT11   // DHT 11 // создание экземпляров объектов
BMP085 dps = BMP085();
DHT dht(8, DHTTYPE);  // dht11 на pin 8
OneWire  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»);
  // запуск I2C
  Wire.begin();
  // запуск bmp
  dps.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»);    // ds18b20
   int Temp=get_temp();
   if(Temp==999) {
     display.setCursor(15,15);   
     display.print(«t=»);      display.print(Temp1/16);      display.print(«.»);
     display.print(((Temp1%16)*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%16)*100)/16);
     Serial.println(» *C»);
     display.setCursor(15,15);   
     display.print(«t=»);      display.print(Temp/16);      display.print(«.»);
     display.print(((Temp%16)*100)/16);
     display.print(» C»);
     Temp1=Temp;
   }
   // dht11
   float 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(» %»);
   // bmp085
   dps.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);
}
// получение температуры датчика ds18b20
int 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 мс)     delay(1000);        ds.reset();   ds.select(addr);   ds.write(0xBE);             for ( i = 0; i < 9; i++) {             data[i] = ds.read();   }   Temp=(data[1]

Источник: https://radioded.ru/proekty-na-arduino/meteostantsiya-na-arduino

Arduino метеостанция на BMP180, DHT11 и LCD1602

За основу взят проект метеостанции из книги В. Петина «Проекты с использованием контроллера Arduino» 2-е издание (проект 5 приложения 2) [1]. Использовалась среда Arduino IDE 1.8.5 в Windows 10.
При запуске скетча выдавалась ошибка

В интернете можно скачать библиотеки для Arduino, имеющие одинаковые названия, но разное содержимое. Скетч может не работать, если вы используете «не ту» библиотеку. Видимо, мне попались не те библиотеки. В проект добавил датчик BMP180 для измерения атмосферного давления и переработал скетч.

Схема соединений

Сканирование адресов

Сначала подключите к Arduino датчик BMP180 и индикатор LCD1602. Скомпилируйте скетч I2C scanner и запустите его, чтобы определить адреса устройств на шине I2C.

Каждые 5 секунд программа сканирует устройства и выдает адреса на COM порт. У меня найдены два устройства с адресами 0x3F и 0x77. BMP180 по умолчанию имеет адрес 0x77, значит LCD индикатор имеет адрес 0x3F.

В некоторых схемах книги [1] перепутаны местами подключения сигналов SDA и SCL к плате Arduino. Должно быть: SDA — к A4, SCL — к A5. Если у модуля BMP180 пять выводов, то на вывод VIN подается +5 Вольт [9].

Монтажная схема

Теперь соберите схему полностью. Я использовал RGB светодиод с общим катодом, смонтированный на плате вместе с резисторами 150 Ом. Общий катод подключается к контакту GND, остальные выводы — по схеме. Вносить изменения в скетч не требуется, так как яркость светодиодов меняется по циклическому закону.

На схеме показано подключение RGB светодиода с общим анодом, как в книге [1]. Если на экране LCD1602 не видно символов, то покрутите регулятор яркости. Подсветка индикатора потребляет довольно большой ток, поэтому используйте блок питания на ток не менее 2 А.

Я использовал USB хаб с внешним блоком питания на 2 А. В схеме использовал пьезозвонок ЗП-22. Резистор, подключенный к звонку, на 100 Ом [2, с. 50]. Частоту звука можно изменить в программе. Выбрал частоту 1000 Гц.

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

Можно включить периодическую подачу сигналов во время работы программы, раскомментировав строку //bzz(100); в скетче. В проекте использовал датчик DHT11 в виде модуля с уже смонтированным резистором 4.7 кОм. Сопротивление может быть от 4.7 до 10 кОм.

Подключите контакт Vcc модуля часов DS1302 к шине +5 Вольт. Таким образом вы уменьшите разряд батареи, по сути она будет работать только тогда, когда отключится питание Arduino.

Программа (скетч)

Для обслуживания BMP180 использована библиотека bmp085. Значение давления зависит от высоты местности. Для корректного значения атмосферного давления надо подобрать высоту. Для этого отредактируйте строку dps.init(MODE_STANDARD, 10000, true); У меня высота равна 100 м (10000 см). Фрагмент расчета давления взят из примера BMP085_test2.ino библиотеки bmp085.

Скетч meteo_P

#include #include #include #include «DHT.h» #include BMP085 dps = BMP085(); long Pressure = 0, Altitude = 0;

unsigned long time1 = 0;

#define DHTPIN 10 #define DHTTYPE 11      // 11 — DHT11, 22 — DHT22

DHT dht(DHTPIN, DHTTYPE);

int kCePin = 4;         // RST  DS1302 int kIoPin = 3;         // Data DS1302 int kSclkPin = 2;       // CLK  DS1302

DS1302 rtc(kCePin, kIoPin, kSclkPin);

int REDpin = 9; int GREENpin = 6;

int BLUEpin = 11;

LiquidCrystal_I2C lcd(0x3f, 16, 2);    // укажите свой адрес 0x20…0xff address unsigned long memTime;

int bzzPin = 8;

void HumTempRead() {   float hum = dht.readHumidity();   float temp = dht.readTemperature();   if (isnan(hum) || isnan(temp)) {     Serial.println(«Failed to read from DHT sensor!»);     lcd.setCursor(0, 1);     lcd.print(«H=—% T=—«);     lcd.setCursor(11, 1);     lcd.print((char)223);     lcd.

setCursor(12, 1);     lcd.print(«C «);   } else {     lcd.setCursor(0, 1);     lcd.print(«H=»);     lcd.setCursor(2, 1);     lcd.print(hum);     lcd.setCursor(4, 1);     lcd.print(«% T=+»);     lcd.setCursor(9, 1);     lcd.print(temp);     lcd.setCursor(11, 1);     lcd.print((char)223);     lcd.setCursor(12, 1);     lcd.

print(«C «) ;   }

}

void setup_bzz() {   pinMode (bzzPin, OUTPUT);

}

void bzz(int _bzzTime) {   tone(bzzPin, 1000 , _bzzTime);    // частота 1000 Гц

}

void setup() {   Serial.begin(9600);   Wire.begin();

  delay(1000);

  dps.init(MODE_STANDARD, 10000, true);  // 100 meters (высоту над уровнем моря в cм)

  dht.begin();   setup_bzz();   bzz(100);     lcd.init();   lcd.backlight();   lcd.home();

  //  lcd.setCursor(0, 0);

  rtc.halt(false);
  rtc.writeProtect(false);

  //rtc.setDOW(FRIDAY);        // Set Day-of-Week to FRIDAY установите день недели   //rtc.setTime(4, 58, 0);     // Set the time to 12:00:00 (24hr format) установите время   //rtc.setDate(6, 8, 2010);   // Set the date to August 6th, 2010  установите дату (число, месяц, год)

}

void loop() {

  lcd.setCursor(8, 0);
  lcd.print(rtc.getTimeStr());

  if ( (millis() — memTime > 2000) or (millis() < memTime)) {    // DHT11/22 1 time each 2 seconds     HumTempRead();     memTime = millis ();   }

  delay(100);

  if (((millis() — time1) / 1000.0) >= 1.0) {     dps.calcTrueTemperature();     time1 = millis();   }   dps.getPressure(&Pressure);   Serial.print(»  Pressure(Pa):»);

  Serial.println(Pressure);

  long p2;   int pi;   p2 = (Pressure / 133.3224);    // Па в мм рт.ст.

  pi = trunc(p2);     // отбрасывание дробной части числа

  lcd.setCursor(0, 0);   lcd.print(«P=»);   lcd.setCursor(2, 0);   lcd.print(pi);    // вывод атм. давл. на LCD   lcd.setCursor(5, 0);   lcd.print(«mm»);   //    delay(3000);   //bzz(100);       // раскомментируйте, если хотите слушать сигналы   {     for (int value = 0 ; value

Источник: http://zgo.narod.ru/publ/arduino_meteorological_station_bmp180_dht11_lcd1602/1-1-0-91

Управление углом поворота сервопривода с помощью ультразвукового дальномера HC-SR04 и Arduino Sensorshield

Здравствуйте, дорогие читатели нашего сайта. Сегодня мы с вами узнаем как управлять углом поворота сервопривода с изменением расстояния от ультразвукового дальномера до предмета. Также мы рассмотрим альтернативное подключение элементов с помощью Arduino SensorShield .

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

Сегодня же мы более подробно рассмотрим Sensorshield и узнаем преимущества использования этого шилда.

Технические характеристики Arduino Sensorshield

Самое главное преимущество данного шилда заключается в том, что вы сможете подключить огромное количество датчиков с максимальной удобностью и при этом заняв максимально маленькое место на Arduino. Подключение шилда к ардуино воспроизводится стандартным способом, а именно накладывается всеми контактами на плату микроконтроллера, сделав гибрид, который мы назовем — «бутерброд».

Шилд можно использовать для подключения следующих устройств

  • SD card
  • 32 servo controller
  • RB URF для ультразвуковых датчиков
  • 12864 LCD последовательный и параллельный интерфейс
  • APC220 wireless RF
  • Bluetooth
  • I2C

Ниже приведена схематическая распиновка платы Sensorshield, она вам поможет понять, в какие пины вам необходимо соединить тот или иной датчик.

Необходимые компоненты для подключения

Для полноценной работы нашего мини-проекта, нам понадобятся следующие устройства:

Все эти элементы можно приобрести по низкой цене и с высоким качеством в интернет магазине SmartElements.

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

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

Схема подключения

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

Я надеюсь подключить устройства у вас получилось, а теперь перейдем к самому важному этапу — программированию Arduino.

Скетч для управления углом поворота сервопривода

#include
#define coef 5
#define min_zone 6
#define max_zone 44
#define Trig 5
#define Echo 6
#define servoPin 11
Servo myservo; void setup() {
pinMode (Trig, OUTPUT); //инициируем как выход
pinMode (Echo, INPUT); //инициируем как вход
myservo.attach (servoPin);
myservo.write (0);
}
unsigned int impulseTime=0;
unsigned int distance_sm=0; void loop() {
digitalWrite (Trig, HIGH); /* Подаем импульс на вход trig дальномера */
delayMicroseconds (10); // равный 10 микросекундам
digitalWrite (Trig, LOW); // Отключаем
impulseTime = pulseIn(Echo, HIGH); // Замеряем длину импульса
distance_sm = impulseTime/58; // Пересчитываем в сантиметры
if (distance_sm >= min_zone && distance_sm = min_zone && distance_sm<\p>

Источник: http://helpduino.ru/podklychenie_servo_HC-SR04.html

Урок 29. Тахометр. Определяем скорость вращения при помощи датчика линии

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

Достаточно нанести на неё контрастную линию (чёрную на светлой поверхности или белую на тёмной) и поднести датчик линии, Вы сразу получите точный результат, количество оборотов в минуту.

Скетч не нуждается в корректировке, независимо от того, какого цвета будет линия.

Нам понадобится:

Для реализации проекта нам необходимо установить библиотеку:

  • Библиотека iarduino_4LED (для работы с четырёхразрядным LED индикатором).

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE.

Видео:

Схема подключения:

LED индикатор подключается к любым двум выводам Arduino (как цифровым, так и аналоговым), номера указываются в скетче. Датчик линии подключается к любому аналоговому входу, номер указывается в скетче.

В данном уроке, LED индикатор подключён к цифровым выводам 2 и 3, а датчик линии подключён к аналоговому входу A0.

Читайте также:  Ардуино шим: расшифровка, определение, примеры

Алгоритм работы:

  • Вывод информации на LED индикатор осуществляется только в момент перехода датчика линии со светлого на тёмное поле.
  • Первой строкой функции loop, проверяем не находится ли датчик линии на тёмном поле, если это так, то …
  • Выводим количество оборотов в минуту на LED индикатор (если не зафиксировано переполнение millis) и сохраняем время перехода
  • Выполняем цикл while до тех пор, пока датчик линии не покинет тёмное поле. Благодаря чему предыдущая операция выполняется только 1 раз, за всё время нахождения датчика на тёмном поле.
  • Если датчик находится на тёмном или светлом поле, дольше 6 секунд, то выводим надпись «STOP» (эти строки можно убрать, если количество оборотов Вашего устройства ниже 10 в минуту).

Код программы:

#include // подключаем библиотеку для работы с четырёхразрядным LED индикатором
iarduino_4LED dispLED(2,3); // объявляем объект для работы с функциями библиотеки iarduino_4LED, с указанием выводов индикатора ( CLK , DIO ) const uint8_t pinLine = A0; // объявляем константу с указанием номера аналогового входа, к которому подключен датчик линии uint32_t strLine = 0; // время перехода датчика со светлого на тёмное поле
void setup(){ dispLED.begin(); // инициируем LED индикатор
}
void loop(){ if(analogRead(pinLine)>400){ // если показания датчика линии больше 400 (тёмное поле) if(strLine350){ // ждём пока датчик линии не выйдет из тёмного поля if((millis()-strLine)>6000){dispLED.print(«STOP»);} // если датчик находится на тёмном поле дольше 6 секунд, то выводим на индикатор надпись «STOP» } } if((millis()-strLine)>6000){dispLED.print(«STOP»);} // если датчик находится на светлом поле дольше 6 секунд, то выводим на индикатор надпись «STOP»
}

скачать

Ссылки:

Источник: https://lesson.iarduino.ru/page/urok-29-tahometr-opredelyaem-skorost-vrascheniya-pri-pomoschi-datchika-linii/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

— Arduino Software.

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

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

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

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

Если повнимательней посмотреть на схему, то станет понятно, что одновременно может светиться только один из разрядов, т.е. чтобы отобразить трехразрядное число, нужно по очереди зажигать и гасить каждый разряд, причем делать это очень быстро. Поэтому цифры как ни крути будут мерцать, главное, чтобы это мерцание было достаточно частым и не воспринималось глазом как мерцание. А это значит, что ардуино будет работать в том числе и в качестве контроллера этого дисплея, по сути рисуя по очереди цифры составляющие число равное текущей высоте. Сразу оговорюсь, можно купить и готовое решение, со встроенным контроллером, но стоит оно в 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.

Источник: http://www.parkflyer.ru/blogs/view_entry/10539/

Ссылка на основную публикацию