Как получить общее среднее полученных данных

У меня есть Arduino Uno с двумя датчиками. Датчики напряжения и тока. Мне нужно получить среднее значение напряжения и тока каждый раз, когда данные получены. Но я не знаю, как сложить текущие и предыдущие значения и разделить их на количество полученных значений.

Может ли кто-нибудь помочь мне, пожалуйста? Мне это нужно для моего проекта

Это код, который я сделал

void setup(){
Serial.begin(9600);
}
void loop(){
    int n=5;
    float sum=0;
    float ave=0;
    for(int x=0;x<n;x++){
        float volt=analogRead(A0);
        float voltage = map(volt,0,1023,0,2500);
        voltage/=100;
        Serial.print("Voltage: ");
        Serial.print(voltage,2);
       sum=sum+voltage;
       }
ave=sum/n;
Serial.print("Average: ");
Serial.print(average,2);
delay(3000);
}

Но для этого требуется только среднее из 5 данных. Я хочу получить среднее значение всех полученных данных.

, 👍0

Обсуждение

Чит: https://github.com/MajenkoLibraries/Average, @Majenko

это на самом деле коммуникативно: (1/3 + 2/3 + 3/3) == (1+2+3)/3, @dandavis

@Majenko Предлагает ли ваша библиотека кумулятивное среднее, скользящее среднее, экспоненциальное среднее или что-то из этого?, @Duncan C

К OP, вы хотите совокупное среднее? Как упоминалось в комментариях к ответу DataFiddler, при очень большом количестве выборок среднее значение будет меняться так медленно, что будет трудно обнаружить изменение. (например, после усреднения миллиона выборок, если входное значение внезапно изменится на 0, потребуется 100 000 новых выборок, все в 0, чтобы среднее значение изменилось на 10%), @Duncan C

Вместо этого вы можете использовать экспоненциальное значение или другое скользящее среднее значение., @Duncan C

Моя библиотека предлагает всевозможные усреднения и статистический анализ данных., @Majenko


1 ответ


Лучший ответ:

3
void setup(){
Serial.begin(9600);
}
void loop(){
    static unsigned long count=0;
    static float sum=0;
    float ave=0;
    int volt=analogRead(A0);
    float voltage = map(volt,0,1023,0,2500) / 100.0;
    Serial.print("Voltage: ");
    Serial.print(voltage,2);
    sum=sum+voltage;
    count++;
    ave=sum/count;
    Serial.print("  Average: ");
    Serial.println(ave,2);
    delay(3000);
}

Это работает довольно долго. Усреднение перезапускается только при сбросе вашего ардуино.

Кроме того, вы можете узнать о скользящем среднем (также известном как фильтр нижних частот)

,

Вы печатаете неизвестную переменную среднее. Вы объявили аве. Вы также должны упомянуть, что с этим методом алгоритм может работать только некоторое время, пока число с плавающей запятой не переполнится. Более безопасным способом было бы A (1) = x (1); А(n+1) = А(n) * (n/(n+1)) + x(n+1)/(n+1). «A(n) = среднее значение на n-й итерации; x(n) значение n-го датчика»., @Peter Paul Kiefer

аве исправлено. Он переполнится через 400 лет непрерывной работы благодаря delay(3000);, @DataFiddler

Этот код получает равное значение или вывод для напряжения и его среднего значения. Возможно, он не учитывает предыдущие данные, которые он получил, @Rica Jacutina

Вы заметили ключевое слово static в sum? В конце концов вы добавите больше Serial.println для проверки суммы и подсчета для отладки?, @DataFiddler

Ой. Я понял! Большое спасибо. Я просто поместил неправильную переменную в серийный отпечаток для среднего значения., @Rica Jacutina

@Peter Paul Kiefer: n/(n+1) также станет 1 или переполнится. Это не настоящее решение. Проблема в любом случае не слишком реалистична, так как через некоторое время среднее значение будет довольно постоянным., @DataFiddler

Да, это правильно - это не очень хорошее решение. Было бы лучше добавить фиксированное количество значений, скажем, последние 40, 80 или 150, чтобы получить скользящее среднее. Причина, по которой я прошу вас упомянуть, что переменная может переполниться, заключается в том, что OP может уменьшить интервал измерения, и тогда переполнение может стать проблемой. Я так долго не думал о своем решении, поэтому сделал ошибку, что n тоже может переполниться. Так что да, моя идея не лучше, чем ваш способ сделать это., @Peter Paul Kiefer