В прошлый раз я сделал теоретический экскурс — первый шаг на пути создания ультразвукового анемометра. Сегодня сделаем второй — соберем дальномер и термометр.
Элементная база
Раньше радиолюбители использовали ультразвук в рыболовных делах — мастерили эхолокаторы. Сейчас все упростилось. На Arduino собрать дальномер дело двух минут. В качестве датчика чаще всего приобретают дешевый HC-SR04. Диапазон от 2 см до 4 м. Диаграмма направленности у него широкая ±30°, но для наших целей годится. Кроме собственно HC-SR04 нам понадобится практически любой микропроцессор, но проще и дешевле взять готовую платку, например, arduino mini/micro. Еще лучше arduino Leonardo cо встроенным USB. На просторах интернета очень много примеров самодельных ультразвуковых дальномеров на этой элементной базе, поэтому переходим сразу к …
Ультразвуковой термометр
Из теории я уже знаю, что скорость звука в воздухе очень сильно зависит от температуры. Если зафиксировать датчик на заранее известном расстоянии от препятствия, то можно переписать формулу, выразив оттуда температуру.
где L — известное расстояние между приемником и передатчиком (в нашем случае удвоенное расстояние до препятствия), м;
t — время прохождения импульса от передатчика до приемника, сек;
j — показатель адиабаты, в нашем случае j=7/5;
R — универсальная газовая постоянная, R = 8,3144598 Дж/(моль К);
M — молярная масса, для воздуха без учета влажности M = 0,029 кг/моль.
Собственно уже ничего не мешает собрать на коленке устройство и написать программу вычисления температуры. Так и сделал, но сразу добавил в устройство имевшийся у меня обычный датчик температуры DS18B20 чтобы было с чем сравнивать показания, тем более он все равно понадобится дальше для анемометра.
Под рукой оказалась деревянная планка в качестве основания, обрезок жестянки в качестве препятствия, обрезок полипропиленовой трубы чтобы поднять датчик над основанием (помним про угол ±30° — иначе измерять будем расстояние до деревяшки). Расстояние между жестянкой и краем цилиндра датчика (не до платы) у меня получилось 48.2 см. Для точности чем больше тем лучше, но тут уж как получилось.
Ниже код для arduino, который выводит в терминал значения расстояния в см с поправкой на температуру, взятую с датчика DS18B20, и расчетную температуру воздуха при условии, что до препятствия 48.2 см. Код не оптимизирован для наглядности.
#include <OneWire.h>
#include <DallasTemperature.h>
#define Trig 4
#define Echo 2
#define ONE_WIRE_BUS 7
#define Steps
static const float defDist = 48.2; //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();
}
unsigned long impulseTime=0;
void loop()
{
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 M = 0.029;
float R= 8.31447;
float X = 1.4 * R/M ;
float c = sqrt(X *(temp+273.15)) ;
dist = impulseTime * c /2/ 10000/N;
float Speed_of_sound = defDist/impulseTime * 2*N*10000;
float Tcalc = Speed_of_sound * Speed_of_sound/X - 273.15;
Serial.println(" Distance: " + String(dist) + " Tds18B20: " + String(temp) + " Tcalc: " + String(Tcalc) );
}
Результат меня устроил, особенно если вынести конструкцию за окно, где сейчас уже ноль и первый снег. Ультразвуковой термометр отображает температуру мгновенно, а DS18B20 остывает около 5 минут. При этом, в отличие от тех же инфракрасных датчиков температуры со схожим быстродействием, я получаю именно температуру воздуха, а не предмета, который может быть дополнительно нагрет солнцем или ИК излучением, например, от батареи отопления. Сюда конечно так и просится как минимум ФНЧ, но кому то и такой точности будет достаточно.
Кстати, коррекция дальномера по датчику температуры дает дополнительную точность чем обычная формула Дистанция(cm) = Время(us) / 58, особенно на больших расстояниях. Огромным плюсом этого устройства, по-моему, является отсутствие юстировки. Кроме линейки ничего не нужно. Кристаллизованная физика.
В следующий раз сделаем из этого анемометр, наконец-то. И прикрутим датчик влажности...
Последнее обновление 08.02.2018 в 23:07
Здравствуйте
Запустил ваш скетч на версии IDE 1.8.5. Сборка почти такая же. На выходе в мониторе лезет несусветная чушь.
Образец: «L⸮ҭB⸮A⸮⸮w⸮J⸮HŀRǪ⸮D⸮⸮Ҭ⸮A⸮⸮⸮⸮⸮D⸮⸮Ҭ@⸮A⸮⸮⸮⸮⸮h⸮’M⸮h’O⸮Hŀr⸮⸮⸮L⸮R⸮»
Помогите разобраться.
Подбирай baudrate терминала.
Спасибо БРО!!! Не ожидал что загвоздка может быть в baudrate…..