Как уточнить ультразвуковые показания
Я пытаюсь фильтровать ультразвуковые показания с помощью метода усреднения. Я также использовал функцию 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);
}
@Arun Subba, 👍0
Обсуждение1 ответ
Истекшее время=millis();
устанавливает истекшее
время равным текущему значению millis()
, которое на рисунке выше является общим временем с момента включения Uno. Таким образом,
прошедшее время превысит 1000 в любое время после первой секунды выполнения, и в этом случае время
ничего не сделает.
Вместо этого скажите elapsedTime=millis() - время начала;
в цикле. Всякий раз, когда вы хотите снова запустить цикл усреднения, скажите startTime = millis();
.
Если вы используете elapsedTime только
для управления циклом while, избавьтесь от этой переменной; вместо
while(elapsedTime < 1000)
, скажите while(millis()-startTime < 1000)
.
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Объяснение кода MPU6050
- Как я могу прервать задержку() при нажатии кнопки?
- Проблема с открытием нескольких текстовых файлов одновременно/по порядку с использованием <SD.h>
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Как установить управляющий регистр в модуле RTC DS3231 для Arduino UNO R3?
- Как повторить другое действие внутри цикла?
- Клиент веб-сокета Arduino CC3000
Вы смотрите на абсолютное время (время с момента загрузки). Вам нужно обратить внимание на *разницу во времени*. Это означает выполнение вычитания., @Majenko
@Majenko спасибо за ваш ответ. Было бы здорово, если бы вы немного изменили код., @Arun Subba
Я не могу "слегка" изменить код. Его нужно полностью переписать. Там мало что можно спасти, кроме пинг-кода., @Majenko
Посмотрите на пример BlinkWithoutDelay и подумайте об использовании библиотеки для усреднения - например, my [Average](https://github.com/MajenkoLibraries/Average) библиотека., @Majenko