Распечатать, когда 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

}

, 👍0

Обсуждение

Ммм, а ваш код вообще просыпается???, @Dat Ha


2 ответа


0

Пара вещей:

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


1

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