Как уточнить ультразвуковые показания

Я пытаюсь фильтровать ультразвуковые показания с помощью метода усреднения. Я также использовал функцию millis() для измерения времени с самого начала, чтобы вычислить показания до 1 секунды и усреднить их. Я каждый раз заново инициализировал переменную elapsedTime до нуля в цикле, но опять же, когда выполнение программы попадает в этот код, время начинается с того времени, которое было раньше. Есть ли способ решить эту проблему?

Вот этот код:

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

int dist, ctr, filteredDist;
long rawValue = 0;
unsigned long StartTime = millis();

void setup() {
  Serial.begin(115200); // Откройте последовательный монитор со скоростью 115200 бод, чтобы увидеть результаты пинга.
}
//********************************************************************************************************************
void loop() {
  delay(500);
  unsigned long elapsedTime = StartTime;

  while (elapsedTime < 1000) {
    ctr++;
    dist = sonar.ping_cm();
    rawValue += dist;
    elapsedTime = millis();
  }
  filteredDist = rawValue / ctr;
  Serial.println(filteredDist);
}

, 👍0

Обсуждение

Вы смотрите на абсолютное время (время с момента загрузки). Вам нужно обратить внимание на *разницу во времени*. Это означает выполнение вычитания., @Majenko

@Majenko спасибо за ваш ответ. Было бы здорово, если бы вы немного изменили код., @Arun Subba

Я не могу "слегка" изменить код. Его нужно полностью переписать. Там мало что можно спасти, кроме пинг-кода., @Majenko

Посмотрите на пример BlinkWithoutDelay и подумайте об использовании библиотеки для усреднения - например, my [Average](https://github.com/MajenkoLibraries/Average) библиотека., @Majenko


1 ответ


1

Истекшее время=millis(); устанавливает истекшее время равным текущему значению millis(), которое на рисунке выше является общим временем с момента включения Uno. Таким образом, прошедшее время превысит 1000 в любое время после первой секунды выполнения, и в этом случае время ничего не сделает.

Вместо этого скажите elapsedTime=millis() - время начала; в цикле. Всякий раз, когда вы хотите снова запустить цикл усреднения, скажите startTime = millis();.

Если вы используете elapsedTime только для управления циклом while, избавьтесь от этой переменной; вместо while(elapsedTime < 1000), скажите while(millis()-startTime < 1000).

,