Теперь, когда работает ультразвуковой термометр, остался один шаг до простейшего ультразвукового анемометра, который сможет измерить скорость ветра в проекции на ось между передатчиком и приемником.
Вводная
До этого, я делал трехчашечный анемометр из двигателя компьютерного вентилятора, где считал импульсы с датчика холла.
Основная претензия была к результатам, т.к. по ощущениям он врал, а поверить прибор на месте мне нечем. Хотел в штиль покататься с ним на машине, но к сожалению, самодельная конструкция не выдержала проверку временем и суровым климатом — отваливались чашечки. Так и не дождавшись поверки прибор окончательно вышел из строя (на фото справа моторчик уже без чашек и датчик влажности). Чашечный анемометр имеет еще один недостаток — он не показывает направление — только скорость. Есть правда модификации с флажком на одной из чашек, но там гораздо сложнее математика, которой в интернете я не нашел, да и исполнение получается еще сложнее.
Другое дело — ультразвуковой анемометр. Никаких движущихся частей — нечему ломаться. И направление ветра определяется по школьным формулам, и сложной поверки не требует. Единственная засада кроется в температурном датчике. Он медленный и не успеет среагировать если придет порыв более теплого воздуха, к тому же он может нагреваться солнцем быстрее, чем нагревается окружающий воздух. Так что тут нужно поэкспериментировать. А пока сделаем прототип.
Прототип анемометра
Для этого потребуется взять паяльник и отпаять у HC-SR04 один из датчиков на выбор — либо приемник, либо передатчик и закрепить его с противоположной стороны, где у нас было препятствие удлинив двужильным проводом. Почему нельзя оставить HC-SR04 в сборе, думаю понятно. Если ничего не менять, то при наличии встречного ветра скорость звука до препятствия будет меньше, а при отражении от препятствия по пути обратно на ту же величину увеличится. В результате средняя скорость будет такой же как и при штиле. Другое дело, если приемник и передатчик разнести. Во-первых, сразу повышается точность ультразвукового термометра, т.к. отсутствует отражение. Во-вторых, теперь температура будет «прыгать» от ветра. Воспользуемся формулой из первой статьи Теория и перепрограммируем наш arduino. При этом, не забудем подставить измеренную температуру воздуха с датчика DS18B20. Я же пошел чуть дальше и прикрутил сюда же датчик влажности DHT-21. В нем также есть датчик температуры, поэтому можно обойтись без DS18B20. Опытным путем было установлено, что DS18B20 немного быстрее реагирует на изменение температуры чем DHT-21 и дает чуть более точные данные, поэтому в формулу я подставил значения именно с него, хотя для погодной станции, в составе которой будет работать данный анемометр, это не принципиально — все равно данные усредняются за большой период.
Настройка ультразвукового анемометра
Юстировку системы проводить очень просто. Нужно создать тепличные условия, а именно — расположиться в помещении с устоявшейся температурой и отсутствием сквозняков, т.е. статичным воздухом (подальше от стен, окон и батарей). Защитить датчик температуры от прямого попадания на него любых лучей света, особенно инфракрасного диапазона. В промышленных образцах температурный датчик прячут в стенке полой трубки. Ждем минут 5 пока устаканиться значение температуры и запоминаем среднее значение расчетной дистанции, которое выдает программа. Подставляем полученное значение в переменную defDist. Даже если по линейке у вас получилось немного другое значение, наша задача выставить ноль в столбце со скоростью. После этого прибор готов к употреблению. Приятного аппетита. Пример вывода откалиброванного датчика в почти «стерильных» условиях. Данные пишутся так, чтобы их потом было удобно вставить в Эксель. Значения по порядку:
- X — коэффициент, отражающий влияние влажности;
- Дистанция в метрах;
- Температура с DS18B20, градусы;
- Температура ультразвукового датчика (расчетная), градусы;
- Температура с датчика DHT-21, градусы;
- Влажность с датчика DHT-21, %;
- Скорость ветра (проекция на ось между датчиками), м/с.
Видно, что точность измерения расстояния в таких спокойных условиях достигает долей миллиметра, а скорость ветра до 0.1 м/с. Увы, в боевых условиях все не так красиво.
Программа расчета скорости ветра
Код простейшей программы с использованием ультразвукового датчика HC-SR04 представлена ниже. Дальше обязательно буду ее совершенствовать, применять фильтры. Добавлю еще датчик давления, не потому что он очень нужен, просто он у меня есть.
#include <dht.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define Trig 4
#define Echo 2
#define ONE_WIRE_BUS 7
#define Steps
dht DHT;
#define DHT21_PIN 8
static const float defDist = 0.471; //cm
// 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);
Serial.begin(57600);
// Start up the library
sensors.begin();
Serial.println("X Distance Tds18B20 Tcalc Tdht Hum V");
}
unsigned long impulseTime=0;
void loop()
{
// READ DATA
//Serial.print("DHT21, \t");
int chk = DHT.read21(DHT21_PIN);
switch (chk)
{
case DHTLIB_OK:
// Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.print("Time out error,\t");
break;
default:
Serial.print("Unknown error,\t");
break;
}
float DHTtemp =DHT.temperature;
float DHThum = DHT.humidity;
// DISPLAY DATA
// Serial.print(DHThum, 1);
// Serial.print(",\t");
//Serial.println(DHTtemp, 1);
sensors.requestTemperatures(); // Send the command to get temperatures DS18B20
float dist = 0;
float temp = sensors.getTempCByIndex(0);
unsigned long impulseTime=0;
int N=50;
for (int i = 0; i <N; i++)
{
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
impulseTime +=pulseIn(Echo, HIGH);
delay(50);
}
//float P = 101325;
float P = 767 * 133.3;
float M = (28.95-10.934*DHT.humidity/100*(133.3*4.579*exp(17.14*temp/(235.3+temp)))/P)/1000;
float R= 8.31447;
float X = 1.4 * R/M ;
//X = 287;
float c = sqrt( X *(temp+273.15));
dist = impulseTime * c / 1e6 /N;
float Speed_of_sound = defDist/impulseTime *N* 1e6;
float Tcalc = (Speed_of_sound * Speed_of_sound)/X - 273.15;
float v = c- Speed_of_sound;
//Serial.println("X Distance Tds18B20 Tcalc Tdht Hum V");
Serial.println(String(X) + char(9) + String(dist, 5) + char(9) + String(temp) + char(9) +
String(Tcalc) + char(9) + String(DHTtemp)+ char(9) + String(DHThum) + char(9) + String(v));
}
Недостатки
Такой анемометр должен быть ориентирован по ветру, например установкой на флюгер. Возникает проблема с проводами. К тому же он не покажет направление ветра. Поэтому изначально я планировал систему из 2х перпендикулярных пар датчиков из двух HC-SR04. Этот прототип нужен для практического подтверждения теории и выявления слабых мест. О них я уже писал — это хорошо защищенный и мало инерционный датчик температуры, а также отсутствие любых препятствий в зоне направленности ультразвуковых датчиков. Материал основания должен быть прочными, гладким с минимальным количеством углов и, желательно, не менять своей геометрии от температуры. Также была мысль использовать такой анемометр для измерения воздушной скорости своего параплана и построения его поляры, но там нужна хорошая точность. Поэтому возможно вернусь к этой идее когда отполирую прототип. Я пока думаю из чего сделать, ну а о результатах расскажу в следующий раз…
Последнее обновление 23.04.2020 в 00:11
Датчик влажности DS18820 или DS18В20?
Пардон, это датчик температуры DS18В20. Спасибо, поправлю.
Вопрос к автору. Какой библиотекой для DHT вы пользовались? Можете дать сноску? Воспользовался библиотекой с Github, она потребовала дополнительную библиотеку Adafruit Sensor Master. В итоге все предоставив компилятору, он стал матерится на все подряд, кажется библиотеки разные сильно у меня с вами, скетч не компилится.
Здравейте,от България съм. В момента правя дипломна работа по тази тема. Ползвам вашия код, но имам проблем с дистанциите, не излизат. Може ли да ми окажете съдействие?