How to do the average on 10 samples each time

Hi I would like to understand what I have to change in this sketch.
My aim is to take every time 10 output of the imu (10 y accelerations), to do the mean and to test if that mean could be over on a threshold. I don't understand the reason why the average in serial monitor is always 0. Can you help me please?
I am using an Arduino Uno rev 2

#include <Arduino_LSM6DS3.h>
const int numReadings = 10;

int readings[numReadings];      // the readings from the analog input
int readIndex = 0;              // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average

float Athr =  -0.1; 
float Bthr =  -0.2; 

void setup() {
  // initialize serial communication with computer:
  Serial.begin(9600);
  IMU.begin();
  // initialize all the readings to 0:
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {
  float x,y,z;
  IMU.readAcceleration(x, y, z);
  // subtract the last reading:
  total = total - readings[readIndex];
  // read from the sensor:
  readings[readIndex] = y;
  // add the reading to the total:
  total = total + readings[readIndex];
  // advance to the next position in the array:
  readIndex = readIndex + 1;

  // if we're at the end of the array...
  if (readIndex >= numReadings) {
    // ...wrap around to the beginning:
    readIndex = 0;
  }

  // calculate the average:
  average = total / numReadings;
  // send it to the computer as ASCII digits
  Serial.println(average);
  delay(1);        // delay in between reads for stability
}

Perhaps this code on moving average may be of some help.

I found a Kalman Filter is a bit better for the IMU thingies.

You've got mixed float and integer (specifically, "int") arithmetic.
What is the typical magnitude of a y reading?

I need to put the float value because it varies between -2.0 to 2.0 more o less (less in my case)

Imagine you're not moving the device.
Your x and y accelerations will be close to zero, and your z acceleration will be close to 1g (or -1g) depending on orientation.
If you convert your nearly zero y acceleration to an int (as you are doing) it will be zero.
Sum ten zeroes, and divide by ten, you get zero.

The OP could use words like "arduino moving average float" in an internet search engine and they might find what they are looking for.

Thus, this "int readings[numReadings];" could be float readings[numReadings]; ?

Yes. And use float for 'total' as well

In the end I created one of low-pass filter. I only need to find the proper value of cut-off frequency and the sample frequency.
Thank you to all

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.