Распечатать, когда echo читают ch-S04 датчик
Я пытаюсь увидеть, когда эхо поступает на мой датчик HR-S04. У меня есть Serial.println в моем цикле while, чтобы прочитать сигнал и посмотреть, как только произойдет изменение, чтобы разорвать цикл.
Проблема в том, что мой сериал просто распечатывает контакт, к которому привязано мое echo. Как я могу установить его так, чтобы последовательный выход был НИЗКИМ, а затем ВЫСОКИМ после получения эха?
int trig1 = 3; //Trig 1
int echo1 = 4; //echo1
int ECHO1;
double pingTime1;
void setup()
{
Serial.begin(9600);
pinMode(trig1, OUTPUT); //sets the digital pin 3 as output
pinMode(echo1, INPUT); //sets the digital pin 5 as input
}
void loop()
{
ECHO1 = digitalRead(echo1); //assume echo1 is LOW and HIGH once echo is received
while (ECHO1 == 0) //continuous loop until echo is HIGH
{
digitalWrite(trig1,LOW);
delay(100);
digitalWrite(trig1,HIGH);
Serial.println(echo1); //Troubleshooting to see when pulse is read by sensor
ECHO1 = digitalRead(echo1);
}
pingTime1 = pulseIn(echo1, HIGH); //Measure ping travel time in microseconds
pingTime1 = pingTime1*1000; //convert microseconds to seconds
}
@flyer3110, 👍0
Обсуждение2 ответа
Пара вещей:
1) Я считаю, что ваш код для контакта триггера неверен. В примере, который я нашел, он устанавливается как НИЗКИЙ в течение 2 микросекунд, затем ВЫСОКИЙ в течение 10 микросекунд, затем НИЗКИЙ. (Обратите внимание, что единицы измерения-микросекунды, поэтому вы должны использовать задержку в микросекундах()
2) digitalRead(echo1) ничего не делает. Вместо этого используйте pingTime1. Вы всегда будете получать "эхо", так что это не ВЫСОКАЯ или НИЗКАЯ, а скорее изменяющаяся переменная, хранящаяся как pingTime1.
3) echo1-переменная для вывода. Вот почему Serial.println(echo1) печатает контакт. Вы могли бы попробовать Serial.println(ECHO1), но я не думаю, что это сработает из-за того, что я сказал выше.
4) Если вы хотите, чтобы на экране отображался ВЫСОКИЙ или НИЗКИЙ уровень, вы должны установить значение отсечки для pingTime1, а затем использовать оператор if для печати соответствующего значения.
Я не уверен, что именно вы пытаетесь сделать, но, учитывая приведенные выше моменты, я не считаю, что цикл while необходим.
Попробуйте этот код. Вы можете сохранить первый Serial.println (), чтобы увидеть длительность импульса, и/или вы можете сохранить оператор if, если хотите, чтобы на экране отображался ВЫСОКИЙ или НИЗКИЙ уровень.
// Send a pulse out through trig pin
digitalWrite(trig1,LOW);
delayMicroseconds(2);
digitalWrite(trig1,HIGH);
delayMicroseconds(10);
//Receive pulse through echo pin
pingTime1=pulseIn(echo1, HIGH);
pingTime1=pingTime1*1000;
// Serial print
Serial.println(pingTime1);
//Serial print (for HIGH or LOW)
if (pingTime1 > cutoff) {
Serial.println('HIGH');
}
else {
Serial.println('LOW');
Я пытаюсь записать системное время, когда объект проходит мимо датчика. Я планирую установить еще один датчик чуть дальше, чтобы записывать второй раз. Я планирую найти окончательное время по разнице, а затем по расстоянию между датчиками, чтобы вычислить скорость., @flyer3110
Ладно, возможно, вы захотите прояснить этот вопрос в своем посте. Просто используйте оператор if, чтобы "активировать" датчики. (если на определенном расстоянии, запишите время), @zdub
Начнем с того, что ваш код не должен работать. Вот рабочий код для начала (код ниже). У вас много ошибок, поэтому я предлагаю сравнить ваш код с этим. Кроме того, не пытайтесь отлаживать, добавляя Serial.print(/*что-то*/);
в свой код.
За то время, пока принимается эхо, оно слишком быстрое (менее 0,001 секунды). Я сомневаюсь, что ты сможешь использовать это для чего-то полезного. Существует способ рассчитать это с помощью функции millis ()
, но это довольно сложно для вашего проекта.
Вот рабочий код для HC-SR04:
const int trigPin = 2;
const int echoPin = 3;
long duration, distance;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
if (distance < 150) {
Serial.print(distance);
Serial.println(" cm");
}
if (distance > 150) {
Serial.println("OUT OF RANGE");
}
delay(20);
}
Я пытаюсь записать системное время, когда объект проходит мимо датчика. Я планирую установить еще один датчик чуть дальше, чтобы записывать второй раз. Я планирую найти окончательное время по разнице, а затем по расстоянию между датчиками, чтобы вычислить скорость., @flyer3110
- Проблема с датчиком температуры и влажности DHT11
- Как связаться с датчиком через порты RX/TX Arduino?
- Почему dtostrf() не работает для этого значения?
- Как получить ненулевой выход из HX711 и ячейки загрузки?
- Когда дело доходит до связи UART-RS485, в чем разница между модулем "MAX485" и модулем "HW-0519"?
- Интерфейс RS422 с Arduino
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Печатать на serial monitor, когда он обнаруживает изменение значения
Ммм, а ваш код вообще просыпается???, @Dat Ha