Использование датчика HC-SRO4 и поиск препятствия

Я работаю в TinkerCAD, я хочу спроектировать и смоделировать схему, в которой есть следующие компоненты: 1.)Плата Arduino. 2.)Потенциометр 3.)Датчик HC-SRO4 4.)СВЕТОДИОД. Таким образом, датчик должен быть в состоянии определить, есть ли в диапазоне, заданном с помощью потенциометра, какие-либо объекты или нет. И если есть один или несколько объектов в этом диапазоне, то светодиод также должен загораться. Кроме того, пользователь должен иметь возможность изменять диапазон с помощью потенциометра во время моделирования. Я приложил код здесь, но по какой-то причине я не чувствую себя удовлетворенным. Вот список возможных причин. 1.) Для освещения светодиода мне пришлось использовать другой if else , так как он показывал ошибку else used without a previous if if I used LED in the same if else2.) Теоретический диапазон для датчика, который я использовал, составляет 2 см-400 см, но в моей схеме он не показывал верхний диапазон как 400см. Пожалуйста, расскажите о возможных решениях. Кроме того, могу ли я улучшить свой код и схему

Вот код, который я использовал.

const int echoPin = 6;
const int pingPin = 7;

void setup()
{
 Serial.begin(9600);//Starting serial terminal
}

void loop()
{
  int sensorValue = 0;//Setting variable 
  int mappedValue = 0;
  const int potentiometerRange = 0;//setting the buttons to variables to avoid confusion.
  long distance;//declaring a varible in loop because we can change the range during runtime.
  long actualDuration;//...
  long duration;
  pinMode(A0,INPUT);
  pinMode(11,OUTPUT);
  digitalWrite(11,LOW);//
  sensorValue = analogRead(potentiometerRange);//reading the potentiometer value.
  mappedValue = map(sensorValue,0,1023,2,400);//mapping the value accordingly for ultrasonic sensor.
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);//to ensure a clean high pulse later
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);//to trigger the ping.
  delayMicroseconds(10);
  digitalWrite(pingPin, LOW);
  pinMode(echoPin,INPUT);//noe echo which tuns low in the time when waves return back.
  duration =  pulseIn(echoPin,HIGH);//time calculated by sensor
  //calculation of distance from any object
  actualDuration = duration/2;//reducing the time in half for the distance is half only.
  distance = 0.0343*actualDuration;//keeping in mid that speed of sound is 343 m/s and pulseIn returns time in microseonds.
  if(mappedValue>=distance)//checking if the object is in range
    Serial.println("YES");
  else
    Serial.println("NO");
  if(mappedValue>=distance)
    digitalWrite(11,HIGH);
  else
    digitalWrite(11,LOW);
   delay(500); // Delay a little bit to improve simulation performance
}

Я также прилагаю фотографию своей схемы.

, 👍-1

Обсуждение

`Я не чувствую удовлетворения " ... может быть, потому, что ты не выпила свой утренний кофе .... лол..., @jsotola

Что означает "не показывать верхний диапазон как 400 см"?, @chrisl

@chrisl это означает, что зеленая зона, которая находится там во время моделирования, находится как бы перед датчиком, там мы можем искать правильный диапазон, он показывает 334,5 см, а не согласно теории как 400 см., @Mahima Pareek

@jsotola lolol, pm для этих запросов lol, @Mahima Pareek

Для меня это звучит как проблема Tinkercad. Симуляторы, подобные Tinkercad, очень ограничены, поэтому вы можете получить странные результаты, когда достигнете этих пределов где угодно. При использовании настоящего Arduino вы можете не заметить такого поведения, @chrisl


1 ответ


0

Там не так много кода, так что оптимизировать особо нечего. Однако я покажу вам, как объединить ваши два if.

У вас есть:

if(mappedValue>=distance)//проверка того, находится ли объект в пределах 
    Serial.println("YES");
  else
    Serial.println("NO");
  if(mappedValue>=distance)
    digitalWrite(11,HIGH);
  else
    digitalWrite(11,LOW);

и я предполагаю, что вы пробовали это:

if(mappedValue>=distance)//проверка того, находится ли объект в границах
    Serial.println("YES");
    digitalWrite(11,HIGH);
  else
    Serial.println("NO");
    digitalWrite(11,LOW);

Это было бы правильно в Python, где отступ имеет значение (о, как это возвращает посттравматический синдром необходимости работать с COBOL...), но не в C. В C отступы полностью игнорируются. Это только для нашей пользы при чтении потока кода.

Вместо того, чтобы группировать операторы вместе в if или else (или в любой другой структуре условных или циклических), вы заключаете эти операторы в блок. То есть поместите { перед ним и } после него. Таким образом:

if(mappedValue>=distance)//проверка того, находится ли объект в пределах досягаемости
{
    Serial.println("YES");
    digitalWrite(11,HIGH);
}
  else
{
    Serial.println("NO");
    digitalWrite(11,LOW);
}

Или с моим предпочтительным форматированием:

if(mappedValue>=distance) { //проверка того, находится ли объект в пределах досягаемости
    Serial.println("YES");
    digitalWrite(11,HIGH);
} else {
    Serial.println("NO");
    digitalWrite(11,LOW);
}
,