Пример чтения сигнала на аналоговом входе analogRead и сглаживание значение с помощью скользящей средней. Данный пример может быть полезен при чтение зашумленного сигнала с датчика.
Код
Программа хранит последние 10 значений в массиве, каждое новое значение записывается на место самого старого и рассчитывается среднее значение.
Размер массива может быть увеличен для большего усреднения или уменьшен с помощью переменной numReadings.
//задаем размер массива
const int numReadings = 10;
int readings[numReadings]; // массив для хранения значений полученных на аналоговом входе
int readIndex = 0; // индекс последнего значения
int total = 0; // сумма значений
int average = 0; // скользящее среднее
int inputPin = A0;
void setup() {
// устанавливаем связь:
Serial.begin(9600);
//устанавливаем все значения в 0
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0;
}
}
void loop() {
// вычитанем последнее значение из суммы
total = total - readings[readIndex];
// считываем значение
readings[readIndex] = analogRead(inputPin);
// добавляем значение к сумме
total = total + readings[readIndex];
// переставляем индекс на следующую позицию
readIndex = readIndex + 1;
// проверяем если мы выскочили индексом за пределы массива
if (readIndex >= numReadings) {
// если да, то индекс на ноль
readIndex = 0;
}
// считаем среднее:
average = total / numReadings;
// выводим
Serial.println(average);
delay(1); // задержка перед следующим циклом
}
Хмм. По арифметике среднее значение равно старое значение плюс новое и делённое на два.
Пробовал такую методику на индикаторе топлива. Работало нормально. Но с резкими сменами показаний данный метод плохо работает. Данные на дуине долго усреднялись. Тактовая частота низкая.
Скользящие средние для усреднения использовать это плохая идея. Поскольку при этом возникает запаздывание. Гораздо лучше использовать AMA Кауфмана. При этом методе усреднения если присутствует полезный сигнал то постоянная времени усреднения маленькая. Если присутствует только шум, то постоянная времени усреднения становится большой.