Как использовать датчик HC-SR04 для изготовления расходомера?

Я немного знаком с Arduino и пытаюсь использовать два ультразвуковых модуля HC-SR04 для измерения направления потока воды внутри трубы. Датчики сохранены так, как показано на рисунке ниже. Направление определяется путем излучения сигнала от одного датчика и приема его в другом, записи времени и повторения с другим набором(см. Изображение ниже). Это называется ультразвуковым расходомером времени полета.

Затем мы используем полученные значения, чтобы определить направление, посмотрев, какое из них больше. Более подробную информацию о том, как это работает, можно найти здесь: https://www.youtube.com/watch?v=rqJ9snaqYiY

Я использовал приведенный ниже код для сбора данных, чтобы определить направление для этого, но, похоже, он не работает, так как отображается только первое значение, а второе всегда равно 0.

long firstduration = 0;
long secondduration = 0;

void setup() {
  // put your setup code here, to run once:
pinMode(13, OUTPUT);
pinMode(12, INPUT);
pinMode(11, INPUT);
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
digitalWrite(13,LOW);
delayMicroseconds(2);
digitalWrite(13,HIGH);
delayMicroseconds(10);
digitalWrite(13,LOW);
firstduration = pulseIn(12,HIGH);
secondduration = pulseIn(11, HIGH);
Serial.print(firstduration);
Serial.print(", ");
Serial.println(secondduration);
}

Обновленный код:

long firstduration;
long secondduration;

void setup() {
  // put your setup code here, to run once:
pinMode(10, OUTPUT);
pinMode(13, OUTPUT);
pinMode(12, INPUT);
pinMode(11, INPUT);
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
digitalWrite(13,LOW);
delayMicroseconds(2);
digitalWrite(13,HIGH);
delayMicroseconds(10);
digitalWrite(13,LOW);
firstduration = pulseIn(12,HIGH);

digitalWrite(10,LOW);
delayMicroseconds(2);
digitalWrite(10,HIGH);
delayMicroseconds(10);
digitalWrite(10,LOW);
secondduration = pulseIn(11,HIGH);

Serial.print(firstduration);
Serial.print(", ");
Serial.println(secondduration);
}

В чем будет заключаться проблема?

Я использую плату Arduino Uno.

Я исключил проблемы с проводкой...

Спасибо!

, 👍3

Обсуждение

К какому триггеру датчиков подключен вывод 13? Тот, с эхо-контактом 12 или 11?, @chrisl

вывод 13 используется для одновременного срабатывания обоих датчиков., @Aradhya Jain

@chrisl Я изменил код, как вы сказали в своем ответе, но это не сработало..., @Aradhya Jain

Обновленный код был показан выше., @Aradhya Jain


1 ответ


Лучший ответ:

3

Я не думаю, что это сработает с датчиками HC-SR04. Это не просто ультразвуковые преобразователи. Они оснащены дополнительной электроникой с единственной целью измерения разницы во времени между отправленным и принятым сигналом. Они просто не обеспечивают необходимого контроля над ультразвуковыми преобразователями. Чтобы изменить их функцию в соответствии с вашими потребностями, вам нужно будет полностью понять их схему (я, конечно, этого не делаю). Или создайте свою собственную схему поддержки. Кроме того, вам нужно подумать о том, как передавать ультразвуковую волну в жидкость. Недостаточно просто прикрепить стандартный преобразователь к трубе. Небольшие преобразователи на датчиках HC-SR04 предназначены для передачи по воздуху, поэтому сам преобразователь скрыт за решеткой внутри капсулы. Я считаю, что вам нужно, по крайней мере, поднести датчик его мощности непосредственно к трубе, если не непосредственно к воде. Вам нужно будет купить ультразвуковые преобразователи fizting.

Также у вас есть проблема из-за работы pulseIn().

Если вы хотите считывать ВЫСОКИЙ импульс, он будет ждать, пока контакт опустится НИЖЕ, затем снова поднимется ВЫШЕ, а затем будет считать время, пока он снова не опустится. Это означает, что он блокируется с момента вызова до завершения импульса (или до истечения 1-секундного тайм-аута).

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

С HC-SR04 ВЫСОКИЙ импульс начнется в определенное время после триггерного импульса. Предположим, что импульс начинается одновременно на обоих датчиках (несмотря на описанные выше проблемы). Непосредственно после триггерного импульса вы вызываете функцию pulseIn() на отправляющем датчике. Он будет блокироваться до тех пор, пока не получит каждый. Поскольку для этого требуется примерно в два раза больше времени, чем другому датчику для приема сигнала (сигнал должен поступать на второй датчик, а затем возвращаться к его источнику), конец эхо-импульса от принимающего датчика будет в это время, что снова понизит его эхо-вывод. Отправляющий snsor получает свое эхо, функция pulseIn() завершается. Теперь вы вызываете pulseIn() на принимающем датчике. Но его импульс уже закончился, поэтому функция все ждет и ждет, когда начнется импульс, и, наконец, достигает своего тайм-аута. В этом случае он возвращает ноль.

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

,

Спасибо @chrisl . Итак, должен ли я обновить код, чтобы сначала проверить первый датчик, а затем запустить второй датчик и проверить его?, @Aradhya Jain

И мне также нужно изменить используемые датчики, чтобы диафрагма передатчика касалась самой трубы, верно?, @Aradhya Jain

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