Как получить общее среднее полученных данных
У меня есть 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 данных. Я хочу получить среднее значение всех полученных данных.
@Rica Jacutina, 👍0
Обсуждение1 ответ
Лучший ответ:
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
- Подключение ACS 712 30A к солнечной панели с помощью Arduino
- INA219 с регистратором можности L298N
- Как подключить 2 сервопривода MG996R towerpro
- Разъем Arduino UNO
- Включение Arduino и узла MCU
- Контролировать ток 48 вольт и 30 ампер с помощью ШИМ-сигнала - какие компоненты необходимы для этого
- Могу ли я запустить 3 датчика движения с регулятором напряжения?
- Ток потребления зуммера
Чит: 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