enum { LED_ANODE=PIN3, LED_CATHODE=PIN2 };
void
charge_led_capacitance( void )
{
pinMode( LED_ANODE, OUTPUT ); // Set both pins
pinMode( LED_CATHODE, OUTPUT ); // to be outputs
digitalWrite( LED_ANODE, LOW ); // Set one low
digitalWrite( LED_CATHODE, HIGH ); // and the other high, so LED is reverse-biased (no light)
}
void
set_input_mode( void )
{
pinMode( LED_CATHODE, INPUT ); // Set the pin to read mode
digitalWrite( LED_CATHODE, LOW ); // Turn off the internal pull-up resistor on the pin
}
unsigned
read_light_level( void )
{
charge_led_capacitance();
set_input_mode();
unsigned level = 0;
for( ; level < 30000; level++ )
if( digitalRead( LED_CATHODE ) == 0 )
break;
return level;
}
class Voltage
{
enum { SENSOR_PIN = A0 };
public:
float
read( void )
{
return 5.0 * analogRead( SENSOR_PIN ) / 1024;
}
} voltage;
class Stats
{
unsigned long n;
double mean;
double variance;
double sum;
public:
Stats( void )
{
n = 0; mean = 0; variance = 0; sum = 0;
}
void sample( double s )
{
double delta = s - mean;
n++;
mean += delta / n;
sum += delta * delta;
}
double get_mean( void ) { return mean; }
double get_variance( void ) { return sum / n; }
double get_sd( void ) { return sqrt( sum / n ); }
double get_snr( void ) { return get_mean() / get_sd(); }
};
Stats digital_stats;
Stats analog_stats;
void
setup( void )
{
Serial.begin( 115200 );
}
unsigned long x = 0;
void
loop( void )
{
unsigned digital = read_light_level();
digital_stats.sample( digital );
float analog = voltage.read();
analog_stats.sample( analog );
Serial.print( x++ );
Serial.print( ": Digital " );
Serial.print( digital );
Serial.print( ", Mean=" );
Serial.print( digital_stats.get_mean(), 4 );
Serial.print( ", SD=" );
Serial.print( digital_stats.get_sd(), 4 );
Serial.print( ", SNR=" );
Serial.print( digital_stats.get_snr(), 4 );
Serial.print( ", Analog " );
Serial.print( analog, 3 );
Serial.print( ", Mean=" );
Serial.print( analog_stats.get_mean(), 4 );
Serial.print( ", SD=" );
Serial.print( analog_stats.get_sd(), 4 );
Serial.print( ", SNR=" );
Serial.println( analog_stats.get_snr(), 4 );
}