Попытка измерить расстояние с помощью ультразвукового датчика

Я новичок в 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 );}

, 👍1

Обсуждение

уменьшите скетч до минимума, чтобы измерить и распечатать расстояние, а затем проверить его., @Juraj


1 ответ


Лучший ответ:

0

Вы объявили int Distance вне какого-либо метода. Это означает, что он доступен из всех методов. Некоторые люди называют это глобальной переменной.

Однако у вас есть метод int DistanceFonction(int dt, int Distance), который получает int Distance в качестве параметра. Это приводит к двусмысленности: если вы ссылаетесь на distance в методе типа

distance = 0.034/2*dt;

должно ли это теперь относиться к параметру distance или к глобальной переменной distance?

Ответ: вы не можете решить. Стандарт C/C++ решил за вас, и ответ таков: параметр будет иметь приоритет и, таким образом, скроет глобальную переменную. Эту штуку еще называют "затенением".

Что это на самом деле означает?

  1. Глобальная переменная distance имеет неопределенное значение в начале программы. Предположим, что значение равно 0.

  2. Вызывается
  3. distancefonction() с передачей distance в качестве параметра. Это создаст копию значения 0 в стеке.

  4. функция рассчитает расстояние и обновит переменную в стеке.

  5. Инструкция Serial.println() внутри функции обращается к переменной в стеке и печатает правильное расстояние.

  6. После завершения функции код в loop() получит доступ к глобальной переменной distance, которая по-прежнему имеет старое значение, поскольку только копия обновлено.

Какое решение?

Конечно, есть несколько решений.

  1. Самое простое решение, вероятно, состоит в том, чтобы удалить параметр int Distance из distancefonction. Таким образом, функция не получит копию и вместо этого будет работать с глобальной переменной.

  2. Еще одно решение — позволить distancefonction возвращать фактическое расстояние. Сигнатура метода уже указывает на то, что вы хотели вернуть значение: intfrom int DistanceFunction(...) говорит об этом. На данный момент функция ничего не возвращает. Вы можете написать возвратное расстояние; в конце. Такой подход может полностью исключить глобальную переменную.

,

«Некоторые люди называют это глобальной переменной». потому что, если он находится в верхней части основного файла ino проекта, он имеет глобальную область действия., @Juraj

большое спасибо за помощь все получилось! я фактически вернул расстояние от функции., @kevin0304