Here’s how to find the average of 9 samples, or the median number of a sorted list of samples. Arduino/Wiring and PicBasic Pro examples follow.
Thanks to Zach Layton for correcting my bubble sort code and Zach Lieberman for the correction.
Written in Wiring, tested on an Arduino board:
/* Analog median and average by Tom Igoe This program reads an analog input and gives the average of 9 readings, and sorts the list of readings and delivers the median number. Created 17 October 2005 Updated 7 August 2007 */ int numReadings = 9; // number of samples to take int median = 0; // median of the sorted samples int readingNumber; // counter for the sample array // variables for subroutines: byte i = 0; byte j = 0; byte position = 0; int analogValues[9]; //function prototypes: void bubbleSort(); int averageArray(); void setup() { Serial.begin(9600); } void loop() { for (readingNumber = 0; readingNumber < numReadings; readingNumber++) { //get the reading: analogValues[readingNumber] = analogRead(0); // increment the counter: readingNumber++; } // sort the array using a bubble sort: bubbleSort(); // get the middle element: median = analogValues[numReadings / 2]; // print the results: // print the array, nicely ASCII-formatted: Serial.print("Array: ["); for (j = 0; j < numReadings; j++) { Serial.print(analogValues[j], DEC); Serial.print (", "); } Serial.print("]\r\n"); // average the array: Serial.print(" Average = "); Serial.print(averageArray(), DEC); Serial.print("\tMedian = "); Serial.print(median, DEC); Serial.print("\r\n"); } // average the values in the array: int averageArray() { int total = 0; int average = 0; for (i = 0; i< numReadings; i++) { total = total + analogValues[i]; } average = total/(numReadings + 1); return average; } void bubbleSort() { int out, in, swapper; for(out=0 ; out < numReadings; out++) { // outer loop for(in=out; in<(numReadings-1); in++) { // inner loop if( analogValues[in] > analogValues[in+1] ) { // out of order? // swap them: swapper = analogValues[in]; analogValues [in] = analogValues[in+1]; analogValues[in+1] = swapper; } } } }
Written in PicBasic Pro, tested on a PIC 18F252:
' Analog median and average ' by Tom Igoe ' This program reads an analog input and gives the average of 9 readings, ' and sorts the list of readings and delivers the median number. ' Created 17 October 2005 ' Updated ' Define ADCIN parameters DEFINE ADC_BITS 10 ' Set number of bits in result DEFINE ADC_CLOCK 3 ' Set clock source (3=rc) DEFINE ADC_SAMPLEUS 50 ' Set sampling time in uS TRISA = %11111111 ' Set PORTA to all input ADCON1 = %10000010 ' Set PORTA analog and right justify result numReadings con 9 ' number of samples to take median var byte ' median of the sorted samples readingNumber var byte ' counter for the sample array ' serial variables and constants: tx var portc.6 rx var portc.7 inv9600 con 16468 ' variables for subroutines: i var byte j var byte position var byte analogValues var word[numReadings] total var word average var word out var byte in var byte swapper var word main: for readingNumber = 0 to (numReadings - 1) ' get the reading: adcin 0,analogValues[readingNumber] ' increment the counter: readingNumber = readingNumber + 1 next ' sort the array using a bubble sort: gosub bubbleSort ' get the middle element: median = analogValues[numReadings / 2] ' print the results: ' print the array, nicely ASCII-formatted: serout2 tx, inv9600,["Array: ["] for j = 0 to (numReadings - 1) serout2 tx, inv9600, [DEC analogValues[j], ", "] next serout2 tx, inv9600,["]", 10, 13] ' average the array: gosub averageArray serout2 tx, inv9600, ["Average: ", DEC average, 10, 13] serout2 tx, inv9600, ["Median: ", DEC median, 10, 13] GOTO MAIN ' average the values in the array: averageArray: total = 0 average = 0 for i = 0 to (numReadings - 1) total = total + analogValues[i] next average = total/numReadings RETURN bubbleSort: for out = 0 to (numReadings - 2) ' outer loop for in = out+1 to (numReadings - 1) ' inner loop if analogValues[out] > analogValues[in] then 'out of order? swapper = analogValues[out] analogValues [out] = analogValues[in] analogValues[in] = swapper endif next next return