среднее значение

Лнд
Offline
Зарегистрирован: 28.03.2022

Добрый день! 

В программе для поиска среднего значения есть хитрость в этой строчке:

void loop() {
  // берем последнее значение...
  total= total - readings[index];

Без нее программа не работает. Не могу понять ее смысл. Не поможете на пальцах пояснить? 

 

const int numReadings = 10;

int readings[numReadings];      // данные, считанные с входного аналогового контакта
int index = 0;                  // индекс для значения, которое считывается в данный момент
int total = 0;                  // суммарное значение
int average = 0;                // среднее значение

int inputPin = A0;

void setup()
{
  // инициализируем последовательную передачу данных с компьютером:
  Serial.begin(9600);                   
  // выставляем все считываемые значения на ноль: 
  for (int thisReading = 0; thisReading < numReadings; thisReading++)
    readings[thisReading] = 0;          
}

void loop() {
  // берем последнее значение...
  total= total - readings[index]; 
  // ...которое было считано от сенсора:
  readings[index] = analogRead(inputPin); 
  // добавляем его к общей сумме:
  total= total + readings[index];       
  // продвигаемся к следующему значению в массиве:  
  index = index + 1;                    

  // если мы в конце массива...
  if (index >= numReadings)              
    // ...возвращаемся к началу: 
    index = 0;                           

  // вычисляем среднее значение:
  average = total / numReadings;         
  // выводим его на компьютер цифрами в кодировке ASCII 
  Serial.println(average);   
  delay(1);        // делаем задержку между считываниями – для стабильности программы            
}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Ну нужно просто разобраться , как работает данный алгоритм.
По факту есть массив со считанным значениями.
Он в цикле перезаписывается.
Самое старое значение заменяется новым.
В итоге после 10 измерении имеем на выходе среднее за последние 10 измерений.

Лнд
Offline
Зарегистрирован: 28.03.2022

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

mixail844
Offline
Зарегистрирован: 30.04.2012
алгоритм высчитывает среднее значение из скользящего "окна" в 10 измерений.
что бы на втором и т.д. проходе по массиву, значения измерений из предидущего прохода не попали в расчет текущего среднего , то из общей суммы вычитываеться значение из предидущего прохода..ясно ? 
v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Лнд пишет:

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

Total - это сумма элементов массива. В этой строке из этой суммы отнимается значение текущего элемента массива, потом текущий элемент массива перезаписывается новым измерением, которое тут же плюсуется к Total. Грубо говоря, в сумме элементов массива одно старое значение заменяется новым. Немного заморочено, но в принципе прозрачно.

Лнд
Offline
Зарегистрирован: 28.03.2022

Да. Спасибо. Вроде понятно. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Лнд пишет:
Без нее программа не работает.

Она и с ней не работает.

Вернее, работает, но делает именно то, что в ней написано, а именно, считает цену на прошлогодний овёс.

Подсуньте её реальные данные, которые Вы можете перепроверить ручками и убедитесь, что никакого среднего она у Вас не считает.

Могу обсудить, но не в таком виде - вставьте код правильно, чтобы не приходилось писать: "в строке № ХЗ".

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

так вроде она прошлогодний овёс отнимает, не?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

так вроде она прошлогодний овёс отнимает, не?

Вы не заметили моей ремарки:

ЕвгенийП пишет:

Могу обсудить, но не в таком виде

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

так вроде она прошлогодний овёс отнимает, не?

Вы не заметили моей ремарки:

ЕвгенийП пишет:

Могу обсудить, но не в таком виде

заметил, ждёмс ...