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

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

Элементная база

элементная база дальномераРаньше радиолюбители использовали ультразвук в рыболовных делах — мастерили эхолокаторы. Сейчас все упростилось. На Arduino собрать дальномер дело двух минут. В качестве датчика чаще всего приобретают дешевый HC-SR04. Диапазон от 2 см до 4 м. Диаграмма направленности у него широкая ±30°, но для наших целей годится. Кроме собственно HC-SR04 нам понадобится практически любой микропроцессор, но проще и дешевле взять готовую платку, например, arduino mini/micro. Еще лучше arduino Leonardo cо встроенным USB. На просторах интернета очень много примеров самодельных ультразвуковых дальномеров на этой элементной базе, поэтому переходим сразу к …

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

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

    \[ T = \frac{(L / t)^2}{j*R/M} - 273.15 \]

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

В следующий раз сделаем из этого анемометр, наконец-то. И прикрутим датчик влажности...

Ультразвуковой дальномер и термометр: 3 комментария

  1. Здравствуйте
    Запустил ваш скетч на версии IDE 1.8.5. Сборка почти такая же. На выходе в мониторе лезет несусветная чушь.
    Образец: «L⸮ҭB⸮A⸮⸮w⸮J⸮HŀRǪ⸮D⸮⸮Ҭ⸮A⸮⸮⸮⸮⸮D⸮⸮Ҭ@⸮A⸮⸮⸮⸮⸮h⸮’M⸮h’O⸮Hŀr⸮⸮⸮L⸮R⸮»
    Помогите разобраться.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *