HC-SR04 измерение расстояния без задержки?

Я использую ультразвуковой датчик HC-SR04 для Arduino. Я использовал следующий код для расчета расстояния, и он отлично работает.

  long duration;
  digitalWrite(trigger, LOW);  
  delayMicroseconds(2);
  digitalWrite(trigger, HIGH);
  delayMicroseconds(10); 
  digitalWrite(trigger, LOW);
  duration = pulseIn(echo, HIGH);
  distance = (duration/2) / 29.1;

Однако я хочу использовать еще три таких датчика, в общей сложности четыре. Этот блок кода будет вызываться каждый раз, когда я хочу найти расстояние от одного из датчиков. Однако я беспокоюсь, что delayMicroseconds() приостанавливает всю программу и что я не могу выполнять другие задачи во время работы датчиков (например, ведущие колеса, это робот). Следующий код объектно ориентирован для каждого датчика.

class distSensor{
   int trigPin;
   int echoPin;
   int distance;

   //Will be used in timer
   unsigned long previousMillis;

   public:
   distSensor(int tPin,int ePin){
   trigPin = tPin;
   echoPin = ePin;

   pinMode(trigPin, OUTPUT);
   pinMode(echoPin, INPUT);

   previousMillis = 0;
 }

 int calculateDistance(){

  //records time since program start
  unsigned long currentMillis = millis();

  long duration;
  digitalWrite(trigPin, LOW); 

  //check if the previous time the method was called is greater than the interval of 2
  if(currentMillis - previousMillis > 2){
    digitalWrite(trigPin, HIGH);
    previousMillis = currentMillis;
  }

  //check if distance between current time and previous time it was called is greater than interval of 10.
  if(currentMillis - previousMillis > 10){
      digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  }
  return distance;
 }
};

В методе calculateDistance() я пытаюсь сделать то же самое, что и первый код, но без delay() и вместо этого таймер. Но когда я запускаю программу, он не работает, а расстояние читается как 0. Может ли кто-нибудь помочь мне переписать код HC-SR04 с самого начала, который не задерживает всю программу?

3 голоса | спросил Don Grey 8 PMpSat, 08 Apr 2017 16:57:08 +030057Saturday 2017, 16:57:08

2 ответа


2

delay() заставляет процессор ничего не делать, а ждать. Вам нужно перейти на millis() .

В вашем коде вам нужно «захватить» текущее время, используя millis() и сохранить его в переменной. Добавьте число миллисекунд, которое вы хотите дождаться этой переменной - вам нужно будет рассмотреть случай, когда это значение будет переполнено для полного решения. Затем в вашем коде вам нужно создать бесконечный цикл, в котором вы проверите, что возвращает millis(). Когда ваше сохраненное значение и millis() совпадают, пришло время выполнить код, который обычно появляется после delay().

Здесь Игровая площадка Arduino - Как и почему избежать задержки () , delay() и millis() подробно обсуждаются.

Чтобы этот ответ охватывал ваш вопрос, подумайте о том, чтобы разместить все ваши события, которые нужно приурочить к этому бесконечному циклу. Кроме того, подумайте о том, чтобы сохранить независимые переменные, по одному для каждого события с таймированием, так что разные события синхронизируются независимо.

ответил st2000 8 PMpSat, 08 Apr 2017 17:09:52 +030009Saturday 2017, 17:09:52
-3

Попробуйте обратиться к коду в этом вопросе, HC-SR04, возвращающий неправильные расстояния .

У меня была одна и та же проблема.

ответил Rishi Swethan 11 J0000006Europe/Moscow 2017, 23:10:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132