Smoothing

Arduino Example using an array to store values in RAM, then averaging them.

http://www.objectdna.com/workshops/wp-content/uploads/2011/10/Screen-shot-2011-10-24-at-18.39.17.png 694w" sizes="(max-width: 694px) 100vw, 694px" />

/*

  Smoothing

  Reads repeatedly from an analog input, calculating a running average
  and printing it to the computer.  Keeps ten readings in an array and 
  continually averages them.
  
  The circuit:
    * Analog sensor (potentiometer will do) attached to analog input 0

  Created 22 April 2007
  By David A. Mellis  <dam@mellis.org>

  http://www.arduino.cc/en/Tutorial/Smoothing
  
  This example code is in the public domain.


*/


// Define the number of samples to keep track of.  The higher the number,
// the more the readings will be smoothed, but the slower the output will
// respond to the input.  Using a constant rather than a normal variable lets
// use this value to determine the size of the readings array.
const int numReadings = 10;

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

int inputPin = A0;

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

void loop() {
  // subtract the last reading:
  total= total - readings[index];         
  // read from the sensor:  
  readings[index] = analogRead(inputPin); 
  // add the reading to the total:
  total= total + readings[index];       
  // advance to the next position in the array:  
  index = index + 1;                    

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

  // calculate the average:
  average = total / numReadings;         
  // send it to the computer (as ASCII digits) 
  Serial.println(average, DEC);               
}


NYUAD Averaging Example. Uses a single variable to store the average; do some nice math; arrive at an average.

http://www.objectdna.com/workshops/wp-content/uploads/2011/10/Screen-shot-2011-10-24-at-18.36.28.png 790w" sizes="(max-width: 790px) 100vw, 790px" />

// 2011 NYU AD
// Smoothing

const int sensorPinNumber = A3;
int currentValue = 0;
float average = 0.0f;
float numberOfSamplesInAverage = 100.0f;
long millisecondsBetweenSamples = 100;
long lastSampleMillis = 0;

void setup() {
  Serial.begin(9600);
}

void updateAverage() {
  float fractionOfPreviousAverageToUse =  (average * ((float)(numberOfSamplesInAverage - 1))) / numberOfSamplesInAverage;
  float fractionOfCurrentValueToUse =  ((float)currentValue) / (numberOfSamplesInAverage);
  average = (fractionOfPreviousAverageToUse + fractionOfCurrentValueToUse);
}

void loop() {
  if ((millis() - lastSampleMillis) >= millisecondsBetweenSamples) {    
    currentValue = analogRead(sensorPinNumber);  
    lastSampleMillis = millis();
    updateAverage();
    Serial.print("Average: ");
    Serial.println((int)average);
  }   
}

Leave a Reply

Your email address will not be published. Required fields are marked *

 

Spam protection by WP Captcha-Free