Related to averaging, you can also use oversampling with the 10bits ADC.
Read - http://www.atmel.com/Images/doc8003.pdf -
4 samples gives you 1 bit extra
16 samples gives you 2 bit extra
64 samples => 3 bit extra
256 samples => 4 bit extra
1024 samples => 5 bit extra
the price is time ...
//
// FILE: analogReadN.pde
// AUTHOR: Rob Tillaart
// DATE: 2012-05-10
//
// PURPOSE: higher precision analogRead()
//
// http://www.atmel.com/Images/doc8003.pdf
//
void setup()
{
Serial.begin(115200);
for (int b=10; b< 17; b++)
{
unsigned int val = analogReadN(A0, b);
Serial.println(val, DEC);
}
}
void loop()
{
}
uint16_t analogReadN(uint8_t pin, uint8_t bits)
{
bits = constrain(bits, 10, 16) -10;
int samples = 1 << (bits << 1);
uint32_t sum=0;
for (int i=0; i< samples; i++) sum += analogRead(pin);
return sum >> bits;
}
uint16_t analogReadNreferenc(uint8_t pin, uint8_t bits)
{
bits = constrain(bits, 10, 16) -10;
int d = 1;
for (int i=0; i<bits; i++) d *= 2;
int samples = d*d;
uint16_t sum=0;
for (int i=0; i< samples; i++) sum += analogRead(pin);
return sum / d; // rounding => return (sum + d/2) / d;
}