Попытка измерить расстояние с помощью ультразвукового датчика
Я новичок в Arduino и нуждаюсь в вашей помощи. На самом деле я сделал код, и проблема в том, что ультразвуковой датчик вообще не работает. Он не отображает расстояние между объектом и датчиком. Не могли бы вы мне помочь! Вот мой код:
примечание: код содержит некоторые команды управления двигателем
int enableBridgePin = 10;
int forwardPin = 11;
int backWardPin = 9;
int tickPin = 2;
const int trig = 5;
const int echo = 6;
int dt;
int distance;
float rotationSpeed[50];
void setup() {
pinMode(enableBridgePin, OUTPUT);
pinMode(forwardPin, OUTPUT);
pinMode(backWardPin, OUTPUT);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
Serial.begin(9600);
digitalWrite(forwardPin, LOW);
digitalWrite(backWardPin, LOW);
interrupts();
digitalWrite(enableBridgePin, HIGH);
}
void loop() {
analogWrite(enableBridgePin,255);
digitalWrite(forwardPin, HIGH);
digitalWrite(backWardPin, LOW);
distancefonction(dt, distance);
if(distance>5){
detachInterrupt(digitalPinToInterrupt(tickPin));
digitalWrite(forwardPin, LOW);
}
}
int distancefonction(int dt, int distance)
{
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
dt = pulseIn(echo, HIGH);
distance = 0.034/2*dt;
Serial.println(distance );}
@kevin0304, 👍1
Обсуждение1 ответ
Лучший ответ:
Вы объявили int Distance
вне какого-либо метода. Это означает, что он доступен из всех методов. Некоторые люди называют это глобальной переменной.
Однако у вас есть метод int DistanceFonction(int dt, int Distance)
, который получает int Distance
в качестве параметра. Это приводит к двусмысленности: если вы ссылаетесь на distance
в методе типа
distance = 0.034/2*dt;
должно ли это теперь относиться к параметру distance
или к глобальной переменной distance
?
Ответ: вы не можете решить. Стандарт C/C++ решил за вас, и ответ таков: параметр будет иметь приоритет и, таким образом, скроет глобальную переменную. Эту штуку еще называют "затенением".
Что это на самом деле означает?
Глобальная переменная
distance
имеет неопределенное значение в начале программы. Предположим, что значение равно 0.
Вызывается distancefonction()
с передачейdistance
в качестве параметра. Это создаст копию значения 0 в стеке.функция рассчитает расстояние и обновит переменную в стеке.
Инструкция
Serial.println()
внутри функции обращается к переменной в стеке и печатает правильное расстояние.После завершения функции код в
loop()
получит доступ к глобальной переменнойdistance
, которая по-прежнему имеет старое значение, поскольку только копия обновлено.
Какое решение?
Конечно, есть несколько решений.
Самое простое решение, вероятно, состоит в том, чтобы удалить параметр
int Distance
изdistancefonction
. Таким образом, функция не получит копию и вместо этого будет работать с глобальной переменной.Еще одно решение — позволить
distancefonction
возвращать фактическое расстояние. Сигнатура метода уже указывает на то, что вы хотели вернуть значение:int
fromint DistanceFunction(...)
говорит об этом. На данный момент функция ничего не возвращает. Вы можете написатьвозвратное расстояние;
в конце. Такой подход может полностью исключить глобальную переменную.
«Некоторые люди называют это глобальной переменной». потому что, если он находится в верхней части основного файла ino проекта, он имеет глобальную область действия., @Juraj
большое спасибо за помощь все получилось! я фактически вернул расстояние от функции., @kevin0304
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Получение BPM из данного кода
- Как подключить более 10 датчиков к Arduino uno r3
- Как использовать два ультразвуковых датчика для управления двигателем 5 Вольт?
- Чтение датчика давления от 4 до 20 мА с использованием uno
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- SRF04 Ультразвуковой датчик - неточные показания
уменьшите скетч до минимума, чтобы измерить и распечатать расстояние, а затем проверить его., @Juraj