Usted dice que está utilizando una tarjeta Arduino Mega que implica ATMega1280 o 2560. Ambos tienen un módulo de comparador analógico que está integrado. Las tarjetas Arduino salen del pin con la función alternativa de "AIN1" a la que Arduino llama "pin digital 5".
Si habilita el intervalo de banda interno como referencia para la fuente de "AIN0" (algo que se configura internamente), básicamente puede usar un divisor de potencial en D5 que se calcula de manera que cuando el voltaje de la batería caiga por debajo de cierto umbral, el centro del divisor (conectado al pin) cae por debajo de 1.1V. Cuando esto suceda, el comparador dentro de ATMega cambiará de estado y este evento se puede configurar para generar una interrupción ( ISR(ANALOG_COMP_vect)
).
El comparador se puede configurar utilizando el siguiente código C (compilable con avr-gcc):
//Code to enable comparator
ADCSRB &= ~(1 << ACME); //Connect AIN1/D5 to the comparator
DIDR1 |= (1 << AIN1D); //Disable digital functionality of AIN1 pin so we can use comparator
ACSR = (0 << ACD) | (1 << ACBG) | (1 << ACIS1) | (1 << ACIS0); //Enable comparator, connect bandgap, and set to rising edge sensitivity (AIN1 falls below AIN0)
//-------
//If you want to generate an interrupt, do this to enable it (make sure you have an ISR for ANALOG_COMP_vect):
ACSR |= (1 << ACIE); //Enable interrupt.
...
ISR(ANALOG_COMP_vect) {
//Do something when voltage drops too low
}
//-------
//If you want to do it via polling mode, do this to check the value
if (ACSR & (1 << ACO)) {
//Do something if the voltage drops too low
}
//-------