Arduino tenaga baterai dengan indikator baterai lemah

Board arduino (uno) membutuhkan tegangan nominal sebesar 5Volt yang dilengkapi dengan regulator 1117/7805 yang mampu meregulasi tegangan hingga 15Volt (max) menjadi 5Volt.

Penggunaan baterai sebagai catu daya arduino harus memiliki voltase diatas 6Volt (mengimbangi tegangan dropout) jiks menggunakan regulator 1117.

Dalam contoh ini saya menggunakan baterai kotak 9Volt. Untuk pembacaan tegangan baterai, sebagai penyetaraannya digunakan resistor pembagi tegangan dengan nilai 1KΩ dan 10KΩ (toleransi 1% dan kehilangan arus 0.8mA). Keluaran resistor pembagi tegangan menghasilkan tegangan 0.818 Volt jika tegangan baterai 9V.

Tegangan dari resistor pembagi tegangan ini menjadi input bagi ADC channel 0. untuk lebih memaksimalkan pembacaan ADC digunakan tegangan referensi analog internal 1.1Volt.

skema baterai arduino (arduino battery):

Sketch/program arduino dengan baterai:

//pin
#define detektorBaterai A0
#define indikatorBateraiLemah 13//internal LED

//Konstanta
#define resistorPlus 10000L
#define resistorGround 1000L
#define teganganReferesiAnalog 1.1

byte bateraiLemah;
bool statusIndikator;
long indikatorMillisMulai;
uint16_t delayIndikator = 1000;

void setup() {
  pinMode(indikatorBateraiLemah, OUTPUT);
  analogReference(INTERNAL);
  analogRead(detektorBaterai);
}

void loop() {
  uint16_t rawBaterai = 0;
  for(int i=0;i<10;i++)
  {
    rawBaterai += analogRead(detektorBaterai); 
  }
  rawBaterai /= 10;
  
  double teganganPembagi = teganganReferesiAnalog * rawBaterai / 1023;//Volt
  double teganganBaterai = teganganPembagi * ((resistorPlus + resistorGround) / resistorGround);//Volt

  if((teganganBaterai < 8.0) && (bateraiLemah != 2))
  {
    bateraiLemah = 2;
    indikatorMillisMulai = millis();
  }
  else if((teganganBaterai < 8.5) && (teganganBaterai > 8.1) && (bateraiLemah != 1))
  {
    bateraiLemah = 1;
    indikatorMillisMulai = millis();
  }
  if((teganganBaterai > 8.6) && bateraiLemah)//Hysteresis
  {
    bateraiLemah = 0;
    digitalWrite(indikatorBateraiLemah, LOW);
  }
  if(bateraiLemah && (millis() - indikatorMillisMulai > delayIndikator))
  {
    digitalWrite(indikatorBateraiLemah, statusIndikator);
    if(statusIndikator)
    {
      delayIndikator = 100;
    }
    else 
    {
      if(bateraiLemah == 1)
      {
        delayIndikator = 2000;
      }
      else if(bateraiLemah == 2)
      {
        delayIndikator = 200;
      }
    }
    statusIndikator = !statusIndikator;
    indikatorMillisMulai = millis();
  }
}