Pengembangan perangkat arduino pintar salah satunya adalah mampu mendeteksi suplai tegangan utama-nya yati tegangan Vcc. Tujuannya adalah :
- mendeteksi secara dini kegagalan yang mungkin terjadi seperti kehilangan daya utama dan menyiapkan tenaga cadangan
- Menyimpan data-data penting kedalam EEPROM apabila ada indikasi tegangan akan drop
Cara mengukuran Vcc Arduino bisa dilakukan dengan dua cara :
Cara pertama
Menggunakan rangkaian pembagi tegangan sebagai input ke ADC yang menggunakan internal reference (1.1Volt)
resistor yang digunakan haruslah memiliki toleransi rendah / presisi tinggi (misal 1%).
skema pengukuran tegangan suplai arduino:

sketch / program menghitung tegangan catu daya arduino:
//pin
#define detektorBaterai A0
//Konstanta
#define resistorPlus 10000L
#define resistorGround 1000L
#define teganganReferesiAnalog 1.1
void setup() {
Serial.begin(9600);
Serial.println("Pengukuran tegangan Vcc Arduino");
Serial.println("https://www.project.semesin.com");
analogReference(INTERNAL1V1);
}
void loop() {
uint16_t rawVcc = 0;
for(int i=0;i<10;i++)
{
rawVcc += analogRead(detektorBaterai);
}
rawVcc /= 10;
double teganganPembagi = teganganReferesiAnalog * rawVcc / 1023;//Volt
double teganganVcc = teganganPembagi * ((resistorPlus + resistorGround) / resistorGround);//Volt
Serial.print("Tegangan Vcc = ");
Serial.println(teganganVcc);
delay(1000);
}
Cara kedua
Pengukuran tegangan internal bandgap (1.1V) untuk dibandingkan dengan nilain ADC dari tegangan bandgap ideal.
nilai ADC ideal tegangan bandgap adalah:

dengan menggunakan rumusan perbandingan :

metode ini tanpa komponen external dengan sketch:
//Konstanta
#define ADCBandgapIdeal 225.06
#define TeganganVccIdeal 5.0
void setup() {
Serial.begin(9600);
Serial.println("Pengukuran tegangan Vcc Arduino");
Serial.println("https://www.project.semesin.com");
}
void loop() {
uint16_t rawVcc = 0;
for(int i=0;i<10;i++)
{
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);//ADC channel bandgap
ADCSRA |= _BV( ADSC );
while( ( (ADCSRA & (1<<ADSC)) != 0 ) );
rawVcc += ADC;
}
rawVcc /= 10;
double teganganVcc = ADCBandgapIdeal * TeganganVccIdeal / rawVcc;
Serial.print("Tegangan Vcc = ");
Serial.println(teganganVcc);
delay(1000);
}