Cálculo del porcentaje de batería usando un Arduino

Estoy haciendo un pequeño proyecto usando un cargador Lipoly y una batería de 2500mAh 3.7V, ambos de Adafruit. Estoy tratando de mostrar el porcentaje que queda en la batería. Para eso estoy usando este pequeño boceto:

long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  return result;
}

Vi en esa página que el voltaje mínimo es de 3,0 V, así que lo uso para obtener mis valores:

  float volt = (float)readVcc()/1000;
  float percent = ((volt-3)/0.7)*100;

Cuando muestro mis valores, me muestra que el porcentaje restante es -4%. ¿Debo preocuparme o estoy haciendo algo mal al calcular?

Si su cálculo ((volt-3)/0.7)*100 le da un número negativo, eso significa que su variable de "volt" es inferior a 3V.
Espere, espere... ¿Está midiendo una referencia constante de 1,1 V conectada a la entrada ADC y calculando Avcc? ADC al revés, interesante!
Kamil, ¿podrías explicar lo que acabas de decir? Debido a que la función readVCC no es mía, la obtuve en esta página: code.google.com/p/tinkerit/wiki/SecretVoltmeter
Expliqué en respuesta.

Respuestas (1)

Creo que tu cálculo está bien.

Prueba:

Si los resultados de su conversión ADC son 1024 (escala completa de 10 bits), cuando AVcc = referencia

result = 1126400L / 1024 = 1100;

Si los resultados de su conversión ADC son 512 (media escala de 10 bits), cuando AVcc = referencia / 2

result = 1126400L / 512 = 2200;

Su resultado porcentual es -4% porque el voltaje está por debajo de 3V.

percent = ((volt-3)/0.7)*100
-4 = ((volt-3)/0.7)*100
-4/100 = (volt-3)/0.7
-0.04*0.7 = volt - 3
-0.28 + 3 = volt
 2.972 = volt
¿Y es seguro tener un voltaje por debajo de 3V con una batería de 3.7V?
No. No es bueno para la batería de iones de litio. Perderá capacidad bastante rápido. Debe desconectar la batería cuando suceda o reducir la corriente a microamperios (microcontrolador en modo de suspensión, leds apagados, todo apagado) hasta que la batería se recargue.
Bueno, gracias :). ¿Tiene alguna idea de cómo apagar el Arduino cuando la batería está por debajo de 3V? Vi que hay un modo de suspensión en el arduino, ¿debería ser suficiente?
Depende de lo que tengas conectado a esa batería. Y cuánto tiempo permanecerá este circuito sin cargar. Si lo deja en modo de suspensión a 3 V durante algunas semanas, de todos modos matará la batería. Es muy difícil saberlo. No soy un tipo de arduino, no sé cómo funciona el modo de suspensión. Si activa el modo de apagado: (0,1 µA en Atmega328P), debería ser suficiente, pero es difícil saberlo sin un esquema. Si tiene I2C con pullups, pueden matar la batería sin importar si tiene activado el modo de apagado.
Muy bien, gracias por todas las respuestas! Voy a comprobar eso!
*Hola a todos, estoy tratando de unirme a la pregunta tomatediabolik y responder a Kamil y generar error en el código fuente, me gustaría saber qué tan serio es el código completo porque me parece una gran idea y estoy trabajando en un proyecto similar. Muchas gracias por adelantado.