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); }