uint16_t readVcc(void)
{
uint16_t result;
// Read 1.1V reference against Vcc
ADMUX = (0<<REFS0) | (12<<MUX0);
delay(2); // Wait for Vref to settle
ADCSRA |= (1<<ADSC); // Convert
while (bit_is_set(ADCSRA,ADSC));
result = ADCW;
return 1125300L / result; // Back-calculate AVcc in mV
}
void setup() {
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
}
void loop() {
uint16_t Vcc = readVcc(); // Vcc in mV
// some tests… I am powering the AtTiny with two alkaline batteries (about 3.2V)
if ( Vcc > 3150 ) // I expect this test to pass
digitalWrite(0, HIGH);
else
digitalWrite(0, LOW);
if ( Vcc > 5350 ) // I expect this test to fail
digitalWrite(1, HIGH);
else
digitalWrite(1, LOW);
}