Ультразвуковой анемометр

Прибор этого типа использует тот факт, что ультразвук распространяется быстрее в направлении, в котором действует ветер. Конечно ультразвуковой анемометр измеряет три компоненты ветрового вектора в трехмерном пространстве (рис.4.5). Вдоль каждой оси расположены две пары "передатчик-приемник" на расстоянии 0,1-0.5 м. Передатчик посылает непрерывные или импульсные ультразвуковые волны.

В зависимости от направлений распространения ветра с ультразвуковой волной при прохождении волной расстояния d между передатчиком и приемником определяется так:

где υ уз - скорость распространения ультразвуковой волны, м / с; υ 1 - скорость распространения проекции вектора ветра на ось i , м / с.

Разница во времени прохождения расстояния d между передатчиком и приемником двумя ультразвуковыми волнами составляет:

Ориентацию преобразователей относительно направления распространения ветра приведены на рис. 4.6.

Рис. 4.5. Ультразвуковой анемометр

Рис. 4.6. (U - скорость распространения ультразвуковой волны; V - скорость распространения ветра N - север S - юг, W - запад; Е - восток)

Методы дистанционного измерения параметров ветра

Радиозонд

Радиозонд - устройство, используемое для измерения определенных параметров ветра и передачи информации приемником. Кроме того, он содержит сенсоры температуры, влажности и атмосферного давления. Оценивания горизонтального положения радиозонда относительно той точки, с которой он был запущен, осуществляется с помощью радиолокатора или радара (от англ. RAdio Detection And Ranging - радиообнаружения и определения дальности) - установки для обнаружения и определения местоположения объектов методом радиолокации. Этот тип техники дистанционного зондирования предусматривает использование электромагнитных волн в области от 0,1 см до 2 м (что соответствует частотам от 100 МГц до 50000 МГц). Объект исследования (радиозонд) облучается, а отраженное излучение оказывает оперативную информацию относительно координат радиозонда и параметров ветра. Высота, которую достигает радиозонд, составляет 20 км, а продолжительность полета - 90-120 мин.

Содар

Ультразвуковой анемометр, предназначенный для дистанционного измерения параметров ветра, называют (от англ. SO und Detection And Ranging). В основе работы этого прибора лежит так называемый эффект Допплера : при облучении объекта, движущегося со скоростью υ, ультразвуковой волной определенной длины волны Λ происходит рассеивание волны, причем частота (длина волны) рассеянной ультразвуковой волны зависит от скорости движения объекта. Доплеровский сдвиг частоты ультразвуковой волны, рассеянной под углом Θ движущимся со скоростью υ , описывается выражением:

(4.13)

где φ - угол между направлением скорости υ и направлением распространения ультразвуковой волны.

Содар, расположенного на земной поверхности, посылает ультразвуковые импульсы вверх (рис. 4.7).

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

Скорость ветра, измеряемая ультразвуковые анемометры, достигает 30 м / с.

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

Кроме того, электронное оборудование повышает стоимость приборов этого типа.

Лидар

Лидар (от англ. Light Detection And Ranging) в отличие от содар генерирует и регистрирует лазерные импульсы. Принцип действия лидара при дистанционном определения параметров ветра заключается в рассеивании лазерного излучения на аэрозолях воздуха (пыли, каплях воды, частицах пыли или загрязнений, пыли или кристаллах солей), движущихся со скоростью ветра, и последующей регистрацией допплеровского смещения (см. 26.7 .3). Такие лазерные системы позволяют измерять и оценивать скорость и направление движения ветра и турбулентность воздуха на больших высотах.

Разработанные в последние годы оптоволоконные лазерные системы характеризуются чрезвычайно высокой (10-12) чувствительностью.

Спутники и ракеты

Современные радиозонды определяют скорость и направление ветра с помощью системы глобального позиционирования GPS (англ. Global Positioning System) - совокупности радиоэлектронных средств,

Рис. 4.7. Содар

определяют положение и скорость движения объекта на поверхности Земли или в атмосфере.

Параметры воздушных потоков на больших высотах оценивают с помощью ракет. Так, в 2012 году Американское космическое агентство (NASA) запустила пять ракет с интервалом 80 с для изучения высокоскоростных потоков воздуха в верхних слоях атмосферы. Проект получил название ATREX (Anomalous Transport Rocket Experiment). Старт состоялся на территории испытательного центра на острове Уоллопс в штате Вирджиния.

На высоте около 80 км ракеты выбросили специальный реагент (триметилалюминий), который вступает в реакцию с кислородом, сопровождается свечением (продукты такой реакции - оксид алюминия, углекислый газ и водяной пар - безвредны). Наблюдение за свечением позволит ученым исследовать воздушные потоки. Наибольший интерес для ученых представляют высокоскоростные потоки (сотни километров в час) на высотах 100-110 км, то есть почти на границе с космосом. Традиционными методами изучать эти потоки сложно, так как плотность воздуха на таких высотах достаточно низкая.

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

Определение направления ветра

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

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

Точность определения направления ветра Потенциометрические системой составляет ± 3

Рис. 4.8.

Увеличить точность можно, используя сельсинов систему (рис. 4.9). Вращения ротора сельсин-датчика вызывает появление ЭДС, пропорциональной синусу угла вращения, что приводит к появлению электрического тока в статоре сельсин- приемника, соответствующего магнитного поля, которое заставляет вращаться ротор приемника, соединенного с индикатором.

Рис. 4.9.

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

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

Рис. 4.10.

Рис. 4.11.

Она выглядит как многоугольник, у которого длины лучей, расходящихся от центра диаграммы в разных направлениях (румбах), пропорциональные

повторяемости ветров этих направлений (рис. 4.11).

Международная метеорологическая организация требует от приборов, предназначенных для измерения направления ветра, чтобы они определяли направление ветра в интервале скоростей ветра от 0,5 до 50 м / с с разрешением от ± 20 до ± 5 °.

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

  • чашечный;
  • ультразвуковой;
  • тепловой.

Чашечный анемометр

Это прибор один из самых древних (известен с XIX века) и самый примитивный. Он представляет собой ось, на которой свободно закреплены чашечки таким образом, что их плоскость все время находится в вертикальном положении. Потоки воздуха толкают чашечки, скорость их вращения и является скоростью ветра.

Ультразвуковой анемометр

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

Тепловой анемометр

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

Как сделать правильный выбор

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

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

Широкий выбор измерительных приборов на

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

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

На данный момент, анемометры, в основном, – это цифровые или электронные приборы. Помимо измерения усредненной скорости ветра за период, они способны, в зависимости от модели, измерять направление ветра, объемный расход воздуха, влажность, температуру (термоанемометр) и давление. Таким образом, анемометр становится портативной метеостанцией.

В зависимости от конструктивных особенностей и принципа действия, выделяют несколько видов анемометров:

Анемометр чашечный;

Анемометр крыльчатый (лопастной);

Термоанемометр (Анемометр ультразвукового типа).

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

Чашечный анемометр

Чашечный анемометр был изобретен Джоном Робинсоном в 1846 году. Это был самый первый, простой по своему устройству прибор для измерения скорости ветра. Название свое, этот анемометр получил благодаря форме лопастей в виде полусфер, похожих на чашки.

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

Крыльчатый анемометр

Крыльчатый анемометр , также называемый «лопастной анемометр», а если переводить дословно его название (windmill anemometer) на русский язык – «мельничный анемометр», появился, как результат эволюции и развития чашечного анемометра.

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

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

Термоанемометр (Ультразвуковой анемометр)

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

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

Принцип действия такого анемометра заключается в том, что скорость звука изменяется в зависимости от того в каком направлении она измеряется, т.е. используется свойство зависимости скорости звука от направления ветра. Ультразвуковой анемометр, в первую очередь, измеряет скорость звука, а только потом, электронно-цифровым блоком путем преобразований вычисляется скорость ветра. Однако, почему, всё-таки, термоанемометр называется «термо»? Подобно обычному акустическому термодатчику, этот анемометр определяет температуру ветра.

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

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

Классификация анемометров и принцип их работы

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

  • чашечный;
  • крыльчатый;
  • ультразвуковой.

Чашечный анемометр

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

Крыльчатый анемометр

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

Ультразвуковой анемометр

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

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

Сфера применения анемометров

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

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

Ранее был сделан . Он умел рассчитывать проекцию скорости ветра на линию между приемником и передатчиком. Для получения вектора скорости ветра на плоскости (2D) требуется вторая координата, которую мы получим, если добавим второй датчик перпендикулярно первому. В этом случае можно закрепить анемометр стационарно — отпадает необходимость использовать флюгер и как-то организовывать подвижные контакты.

Первая версия

Сказано — сделано, причем основательно.

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

Код программы такой.

Код программы первой версии двухосевого анемометра

#include #include #include #define Trig 4 #define Echo 2 #define Trig2 8 #define Echo2 12 #define ONE_WIRE_BUS 7 #define Steps dht DHT; #define DHT21_PIN 0 static const float defDist = .6985; // m static const float defDist2 = .713; // m // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); void setup() { pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); pinMode(Trig2, OUTPUT); pinMode(Echo2, INPUT); Serial.begin(57600); // Start up the library sensors.begin(); Serial.println("X Distance Tds18820 Tcalc Tdht Hum V"); } unsigned long impulseTime=0; void loop() { // READ DATA //Serial.print("DHT21, \t"); int chk = DHT.read21(DHT21_PIN); float DHTtemp = 10; float DHThum = 50; switch (chk) { case DHTLIB_OK: // Serial.print("OK,\t"); DHTtemp =DHT.temperature; DHThum = DHT.humidity; break; default: Serial.print("DHT Error,\t"); break; } // DISPLAY DATA // Serial.print(DHThum, 1); // Serial.print(",\t"); //Serial.println(DHTtemp, 1); sensors.requestTemperatures(); // Send the command to get temperatures DS18820 float dist = 0; float dist2 = 0; float temp = sensors.getTempCByIndex(0); //DHTtemp; unsigned long impulseTime=0; unsigned long impulseTime2=0; int N=250; for (int i = 0; i 0) {wd+=90;} else {wd+=270;} //Serial.println("X Distance Tds18820 Tcalc Tdht Hum V"); //Serial.println(String(impulseTime) + char(9) + String(impulseTime2)); Serial.println(String(impulseTime) + char(9) + String(impulseTime2) + char(9) + String(dist, 5) + char(9) + String(dist2, 5) + char(9) + String(temp) + char(9) + String(Tcalc) + char(9) + String(DHTtemp)+ char(9) + String(DHThum) + char(9) + String(v) + char(9) + String(v2) + char(9) + String(v3) + char(9) + String(wd)); }

Два последних числа дают искомую горизонтальную скорость и направление ветра. Направление рассчитывается в виде азимута к направлению на север и дается в градусах. Вращение по часовой стрелке.

Увы, результаты меня разочаровали.


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

Вторая версия

Есть еще одна причина все переделать. Как отмечалось в первой , скорость звука изменится на 1 м/с при изменении температуры примерно на 1.5 °С. Погрешности измерений по обоим осям складываются. Нужно понимать, что порывы теплого или холодного воздуха могут существенно исказить показания такого анемометра. Нет смысла в показаниях 4 м/с при легком дуновении теплого ветерка.
Из диаграммы натурного эксперимента видно, что даже медленное изменение температуры вызывает дрейф измеренной скорости, а быстрое изменение температуры на 1 градус скачком поменяло измеренную скорость ветра на 1.5 м/с, в то время как датчик температуры медленно отрабатывает это изменение. Важно заметить, что эксперимент этот проходил прямо у меня на столе и изменение температуры было естественным — я ничего не трогал и искусственно ничего не нагревал.

И тут на помощь приходит тот же принцип, что и при измерении расстояния. Если помним, датчики у оригинального HC-SR04 расположены вместе, поэтому результаты не зависят от наличия ветра. Если измерить скорость звука на известном расстоянии сначала в одном направлении, а затем в другом, то разница этих двух показаний, деленная пополам и будет искомой скоростью ветра в проекции на эту ось. При этом, изменение температуры в диапазоне ±25°С дает погрешность ±4%, что абсолютно не критично и мы можем обойтись вообще без термометра. Да и зачем нам термометр? Если мы знаем время прохождения сигнала в обоих направлениях, то по формулам из мы легко вычислим температуру, а значит сможем уточнить скорость ветра.
Есть лишь одна маленькая загвоздка — придется использовать два HC-SR04 на одной оси. В промышленных образцах датчики попеременно выполняют роль приемника и передатчика. В нашем случае для этого придется подключить пищалки напрямую к arduino и программно генерировать 8 импульсов 40 кГц на одной, после чего вычленять их из другой. Зная про определенные сложности на этом пути, мне представляется проще купить еще 2 датчика по 55 рублей и попытаться обойтись малой кровью. Этим я займусь в следующий раз. А пока на двух датчиках сделаю измерение скорости ветра по одной оси и измерение температуры в такой конфигурации. Главная проблема здесь убрать помехи, которые дают такой большой разброс показаний в спокойном воздухе.

Конструкция

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


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


Вначале я пробовал просто дуть по направлению от синей пары к черной. Моих легких явно недостаточно. Но любопытный факт — воздух в легких успел нагреться на 1°, что раньше вызвало бы скачок скорости на 1.5 м/с, т.к. DS18B20 просто ничего не заметил. Отметим, что мои легкие способны дать всего лишь 0.5 м/с. Дальше я включил большой напольный вентилятор и направил все также от синего к черному. Видно как пошел более прохладный воздух из глубины комнаты и даже DS18B20 начал отрабатывать это снижение, но теперь его значения не используются для расчета скорости. Сделал открытие, что мой вентилятор дует со скоростью около 2 м/с. Дальше в течение паузы видим постепенное увеличение температуры и отличную корреляцию между рассчитанной и измеренной температурой. В конце поставил вентилятор с другой стороны и получил 2 м/с в обратном направлении с падением температуры. Ура, товарищи, это работает!

Программа расчета скорости ветра

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

#include #include #include #define Trig 4 // HC-SR04 №1 #define Echo 2 #define Trig2 8 // HC-SR04 №2 #define Echo2 12 #define ONE_WIRE_BUS 7 // DS18B20 #define Steps dht DHT; #define DHT21_PIN 0 // DHT21 static const float defDist = .2121; // m static const float defDist2 = .2121; // m float Tcalc = 0; // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); void setup() { pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); pinMode(Trig2, OUTPUT); pinMode(Echo2, INPUT); Serial.begin(57600); // Start up the library sensors.begin(); Serial.println("X Distance Tds18820 Tcalc Tdht Hum V"); } unsigned long impulseTime=0; void loop() { float temp = 0; float DHTtemp = 0; float DHThum = 50; // READ DHT DATA int chk = DHT.read21(DHT21_PIN); if (chk == DHTLIB_OK) { DHTtemp =DHT.temperature; DHThum = DHT.humidity; } if (sensors.getDeviceCount() > 0) { sensors.requestTemperatures(); // Send the command to get temperatures DS18820 temp = sensors.getTempCByIndex(0); //DHTtemp; } float dist = 0; float dist2 = 0; unsigned long impulseTime=0; unsigned long impulseTime2=0; int N=50; for (int i = 0; i 0) {wd+=90;} else {wd+=270;} Serial.println(String(impulseTime) + char(9) + String(impulseTime2) + char(9) + String(dist, 5) + char(9) + String(dist2, 5) + char(9) + String(temp) + char(9) + String(Tcalc) + char(9) + String(DHTtemp)+ char(9) + String(DHThum)+ char(9) + String(M,5) + char(9) + String(v)); }

Программа будет работать и без датчиков DHT-21 и DS18B20 . DS18B20 для вычислений в этом коде нигде не задействован — только выводится в терминал как эталон. Без датчика влажности температура будет рассчитываться как для воздуха с 50% влажностью. На практике это вносит очень маленькую погрешность. На измерения скорости ветра эти датчики вообще не оказывают никакого влияния.

Собственно это все что можно выжать из двух HC-SR04 . Для получения вектора скорости ветра на плоскости нужно добавить еще 2 датчика перпендикулярно первым и по формулам первой версии получить полную скорость и направление. Этим займусь как только приедут заказанные дополнительные датчики.

P.S.

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

P.P.S. 2018

По многочисленным просьбам выкладываю итоговый скетч, который не требует никаких библиотек (кроме стандартной EEPROM) и работает с 4 датчиками. Код со всякими вкусностями типа встроенной калибровки и сохранением калибровочных значений в энергонезависимую память. И самое главное. Описанная выше проблема с погрешностями по одной из осей была связана не с проводами, а с работающими в одной комнате с датчиками импульсными блоками питания компьютера, монитора и т.п. (их схема преобразования работает на близкой частоте 40 кГц). Я остановился на проблеме выноса датчика на улицу подальше от помех (с передачей данных по блютус). В остальном это работает. Это версия для распаянных датчиков, но есть способ не распаивать. Если вернусь к проекту — реализую.
Для этого кода неважно какое расстояние между датчиками. Нужно поместить устройство в безветренное пространство (и без импульсных помех) и через терминал несколько раз отдать 2 команды:

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

Итоговый код анемометра для 4х датчиков HC-SR04

// WindSpeed v.4 - Анемометр // Copyright Evgeny Istomin gena@regimov.. Приемник и передатчик разнесены на противоположные концы крестовины // На схеме изображено положение приемников для правильного расчета направления и силы ветра // HC-SR04 №1 // Север (0 гр) // o // | // | // HC-SR04 №2 o-------|---------o HC-SR04 №4 // Запад (270гр) | Восток (90 гр) // | // o // HC-SR04 №3 // Юг (180 гр) // при выборе материала крестовины руководстоваться http://temperatures.ru/pages/temperaturnyi_koefficient_lineinogo_rasshireniya // лучший выбор материала - труба инвар 36H, но и обычное железо вполне годится:-) #define DEFINE_DISTANCE 0.22 // примерное расстояние между датчиками, измеренное линейкой, в метрах. #define MES_PAUSE 90 // Пауза между измерениями для затухания отражений. В реальности нужно не менее 1, мс. #define MES_AVERAGE 8 // сколько измерений усреднять для температуры. #define PRINT_PERIOD 500 // период вывода измерений в терминал, ms #include #define FALSE 0 #define TRUE 1 #define Echo1 2 #define Echo2 3 #define Echo3 8 #define Echo4 5 #define Trig1 6 // HC-SR04 №1 #define Trig2 7 // HC-SR04 №2 #define Trig3 4 // HC-SR04 №3 #define Trig4 9 // HC-SR04 №4 #define Pow1 10 #define Pow2 11 #define Pow3 12 #define Pow4 13 #define T_ABS 273.15 // температура абсолютного нуля https://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D0%BE%D0%BB%D1%8E%D1%82%D0%BD%D1%8B%D0%B9_%D0%BD%D1%83%D0%BB%D1%8C_%D1%82%D0%B5%D0%BC%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D1%83%D1%80%D1%8B #define PRINT_LOOP PRINT_PERIOD/(4*(MES_PAUSE)) // сколько полных циклов пропустить перед выводом измерений в терминал float defDist1 = DEFINE_DISTANCE; float defDist3 = DEFINE_DISTANCE; float defDist2 = DEFINE_DISTANCE; float defDist4 = DEFINE_DISTANCE; float Tcalc = 0; // температура воздуха (расчетная) const float DHThum = 50; // % влажности float M = 0.02895; // молярная масса кг/моль https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%81%D1%81%D0%B0 const float R = 8.31447; // Универса́льная га́зовая постоя́нная Дж/(моль*К) https://ru.wikipedia.org/wiki/%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B3%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BF%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%BD%D0%B0%D1%8F const float P = 761 * 133.3;// давление в Па. 101325 на уровне моря float X = 1.4 * R / M ; float c = sqrt(X * (Tcalc + T_ABS)); // скорость звука м/с https://ru.wikipedia.org/wiki/%D0%A1%D0%BA%D0%BE%D1%80%D0%BE%D1%81%D1%82%D1%8C_%D0%B7%D0%B2%D1%83%D0%BA%D0%B0 float impulseTime1 = defDist1 / c; float impulseTime2 = defDist2 / c; float impulseTime3 = defDist3 / c; float impulseTime4 = defDist4 / c; unsigned char count = 0; // счетчик циклов /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // простой фильтр-усреднитель float filterA(float y1, float y) { return ((MES_AVERAGE - 1) * y1 + y) / MES_AVERAGE; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // измеряем задержку прохождения звука между датчиками, сек float measument(unsigned char Trig, unsigned char Echo, unsigned char Pow) { float y; digitalWrite(Pow, HIGH); delay(MES_PAUSE); digitalWrite(Trig, HIGH); delayMicroseconds(10); digitalWrite(Trig, LOW); y = pulseIn(Echo, HIGH); if (count > PRINT_LOOP) Serial.print(String(y, 0) + char(9)); digitalWrite(Pow, LOW); return y * 1e-6; }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // запоминаем в flash-памяти расстояния между датчиками void StoreDefDist() { EEPROM.put(0, defDist1); EEPROM.put(1 * sizeof(float), defDist2); EEPROM.put(2 * sizeof(float), defDist3); EEPROM.put(3 * sizeof(float), defDist4); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // читаем из flash-памяти расстояния между датчиками float GetDefDist(int adress) { float dd; EEPROM.get(adress, dd); if (dd <= 0) dd = DEFINE_DISTANCE; return dd; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // расчет скорости звука в зависимости от температуры, давления и влажности void GetC(float t) { M = (28.95 - 10.934 * DHThum * 0.01 * (133.3 * 4.579 * exp(17.14 * t / (235.3 + t))) / P) / 1000; X = 1.4 * R / M ; c = sqrt(X * (t + T_ABS)); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setup() { pinMode(Pow1, OUTPUT); pinMode(Pow2, OUTPUT); pinMode(Pow3, OUTPUT); pinMode(Pow4, OUTPUT); pinMode(Trig1, OUTPUT); pinMode(Trig2, OUTPUT); pinMode(Trig3, OUTPUT); pinMode(Trig4, OUTPUT); pinMode(Echo1, INPUT); pinMode(Echo2, INPUT); pinMode(Echo3, INPUT); pinMode(Echo4, INPUT); digitalWrite(Pow1, HIGH); digitalWrite(Pow4, HIGH); digitalWrite(Pow3, HIGH); digitalWrite(Pow2, HIGH); defDist1 = GetDefDist(0); // читаем из flash-памяти расстояния между датчиками defDist2 = GetDefDist(1 * sizeof(float)); defDist3 = GetDefDist(2 * sizeof(float)); defDist4 = GetDefDist(3 * sizeof(float)); Serial.begin(57600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println("impT1\timpT3\timpT2\timpT4\tdist1\tdist3\tdist2\tdist4\tTcalc\tv1\tv2\tWD\tv3 " + String(PRINT_LOOP)); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loop() { // период измерений = 1 / (4e-3 * (MES_PAUSE + 1)) impulseTime1 = measument(Trig1, Echo1, Pow1); impulseTime3 = measument(Trig3, Echo3, Pow3); impulseTime2 = measument(Trig2, Echo2, Pow2); impulseTime4 = measument(Trig4, Echo4, Pow4); //if (count > MES_AVERAGE) Serial.print(String(impulseTime1*1e6) + char(9)); Tcalc = filterA(Tcalc, sq((defDist2 + defDist4 + defDist1 + defDist3) / (impulseTime1 + impulseTime3 + impulseTime2 + impulseTime4)) / X - T_ABS); if ((Tcalc > 70) | (Tcalc < -50)) Tcalc = 0; GetC(Tcalc); float Speed_of_sound1 = defDist1 / impulseTime1 ; float Speed_of_sound2 = defDist2 / impulseTime2 ; float Speed_of_sound3 = defDist3 / impulseTime3 ; float Speed_of_sound4 = defDist4 / impulseTime4 ; float v1 = ((Speed_of_sound3 - Speed_of_sound1) / 2); float v2 = ((Speed_of_sound2 - Speed_of_sound4) / 2); float v3 = sqrt(sq(v1) + sq(v2)); int wd = int(atan(v2 / v1) * 180 / 3.1416); if (v1 < 0) { wd += 180; } else if (v2 < 0) { wd += 360; } if (count > PRINT_LOOP) { Serial.println(String(c, 5) + char(9) + String(Tcalc) + char(9) + String(v1) + char(9) + String(v2) + char(9) + String(wd) + char(9) + String(v3)); count = 0; } while (Serial.available() > 0) { char inCh = Serial.read(); // установка температуры. формат команды: t21.5 if (inCh == "t") { String a = Serial.readString(); Tcalc = a.toFloat(); GetC(Tcalc); } // u - юстировка (установка на 0). формат команды: u if ((inCh == "t") | (inCh == "u")) { defDist1 = impulseTime1 * c ; defDist2 = impulseTime2 * c ; defDist3 = impulseTime3 * c ; defDist4 = impulseTime4 * c ; StoreDefDist(); } } count++; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////