Использование датчика 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 else
2.) Теоретический диапазон для датчика, который я использовал, составляет 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
}
Я также прилагаю фотографию своей схемы.
@Mahima Pareek, 👍-1
Обсуждение1 ответ
Там не так много кода, так что оптимизировать особо нечего. Однако я покажу вам, как объединить ваши два 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);
}
- Считанное значение не меняется при вращении потенциометра в Arduino?
- Как вы справляетесь с дрейфом датчиков?
- Arduino UNO — колебания входов и выходов
- Сенсорный датчик и потенциометр - Нужна помощь
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Получение BPM из данного кода
- DS18B20 дает высокие показания. Как заставить его вернуть правильную температуру?
`Я не чувствую удовлетворения " ... может быть, потому, что ты не выпила свой утренний кофе .... лол..., @jsotola
Что означает "не показывать верхний диапазон как 400 см"?, @chrisl
@chrisl это означает, что зеленая зона, которая находится там во время моделирования, находится как бы перед датчиком, там мы можем искать правильный диапазон, он показывает 334,5 см, а не согласно теории как 400 см., @Mahima Pareek
@jsotola lolol, pm для этих запросов lol, @Mahima Pareek
Для меня это звучит как проблема Tinkercad. Симуляторы, подобные Tinkercad, очень ограничены, поэтому вы можете получить странные результаты, когда достигнете этих пределов где угодно. При использовании настоящего Arduino вы можете не заметить такого поведения, @chrisl