bclose

MEDIDOR DE CARGA BATERIAS Li-Po

Comprobando la situación de las baterías
CategoríaProyecto de usuario
AutorSuso
Fecha06/05/2016
ConceptoMedidor de carga de baterías LIPO.
DescripciónUn proyecto que combina un LCD de 16×02 y un Arduino Nano para montar un medidor de carga de baterías
DificultadMedia

 

 

Material requerido.

Imagen de Arduino UNOArduino Nano (también vale el Uno o el Mega)
Display LCDUn display LCD, de 16×2 o LCD 20×4, I2C.
componente3 x Resistencias de 330 Ω

 

rojo verde amarillo 3 LEDs, rojo, amarillo y verde
ProtoboardUna Protoboard .
conexionesAlgunos cables de protoboard, preferiblemente Dupont macho/hembra.
PotPotenciómetro de 10K
Multimetro sencillo Multimetro

 

Diagrama de conexion

 

Esquema proto board

El funcionamiento es muy sencillo. Arduino lee por la entrada analógica A0 el voltaje que tiene la batería, y lo compara con la referencia de 5V, que es a la que él trabaja, mostrando dicho voltaje por el display LCD.

Así mismo, hace un cálculo del porcentaje de carga de dicha batería, en base a que a plena carga (4.2V) nos dará el 100% y a 3.2V la carga será del 0%. Esto valores vienen porque estas baterías a plena carga arrojan un valor de 4.2V y durante su uso, el voltaje de las mismas no debe caer por debajo de 3.2V pues se pueden ir dañando y mermar sus capacidades. Se puede modificar el valor de carga mínima con tan solo modificarlo en el sketch.

Para un control a simple vista, se utilizan tres LEDs de colores verde, amarillo y rojo. El primer estará encendido hasta una carga del 40%. A partir de ahí se encenderá el amarillo hasta que la carga sea del 10% en el que se enciende el rojo, indicándonos que pronto habrá que recargar la la batería.

Igualmente, estos porcentajes se pueden modificar en el sketch y darles otros rangos.

El potenciómetro lo utilizamos como offset (Ajuste de voltaje). El proyecto está ideado para alimentarlo con una fuente externa de 5V, como puede ser un cargador de móvil y un cable modificado para alimentar la protoboard con esos 5V. De esta manera, alimentamos a Arduino y al display LCD.

Muestra la medida de voltaje

Como los cargadores o fuentes no siempre entregan 5V exactos, y pueden oscilar entre 4.85V y 4.90V (también 5.3V), Arduino estará alimentado por ese voltaje, y su ADC (Conversor Analógico Digital) también, y hará la conversión en base a ese voltaje, no a 5V. Pero en el sketch hacemos el cálculo en base a 5V y debemos corregir esa diferencia.

Para eso usamos el potenciometro,y seleccionando entre un rango de valores predeterminado podemos ajustar esa diferencia, con la ayuda de un multímetro. Una vez ajustado, ya no es necesario mientras usemos la misma fuente de alimentación.

El condensador de 100uF le he colocado para estabilizar un poco la tensión de alimentación, y evitar demasiadas fluctuaciones.

En esta foto se muestra la precisión comparado con un multímetro. Se puede observar que para la fuente de alimentación utilizada, el offset se estableció en 42.

COnfirmando con la medida del voltimetro

 

El programa de control

 

Este es el sketch

/* Sensor de voltaje para baterías Li-Po de una celda (1S).
   * Se toma el voltaje de la batería a través de la entrada A0.
   * Se muestra el voltaje y el porcentaje de carga por un display LCD I2C 1602
   * Además, tenemos tres LEDs que se van encendiendo dependiendo de la carga.
   * verde = hasta 40%
   * amarillo = hasta
   *   4.2 = 100% (máximo voltaje, máxima carga)
   *   3.2 = 0%   (mínimo voltaje de seguridad)
   *  
   * IMPORTANTE: La tensión que entra por USB o por el pin de 5V (Nano),
   * afecta a la precisión, ya que ésta puede ser difente de 5.0V en algunos mV.
   * El ADC utiliza el voltaje de alimentación como voltaje de referencia.
   * Utilizamos un potenciómetro para regular el voltaje de offset, y regular
   * la precisión, con la ayuda de un multímetro.
   *
   *
   * Por Suso. 19/04/2016
   */

  #include <LiquidCrystal_I2C.h>
  #include <Wire.h>
    /* Funcion de configuracion de pines del modulo 
       LCD/I2C (Direccion,en,rw,rs,d4,d5,d6,d7,backlight,polaridad)
    */

  LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
  byte pinV=A0; // Para leer el voltaje
  byte ledR=12; // LED rojo
  byte ledA=11; // LED amarillo
  byte ledV=10; // LED verde  

  float voltaje=0.0;
  int medida=0;
  int porcent=0;
  int pinOffset=A1;
  float offset=0.0;
  int valorPot = 0;

  unsigned long tAntes =0; // para el refresco de pantalla
  unsigned long tAhora =0;
  unsigned long tEjec =10000;

  void setup() 
     { lcd.begin(16,2); // inicializamos el LCD.
       lcd.backlight(); // encendemos la retroiluminación.
       pinMode(ledR, OUTPUT);
       pinMode(ledA, OUTPUT);
       pinMode(ledV, OUTPUT);
       Serial.begin(9600);
       digitalWrite(ledR, LOW);
       digitalWrite(ledA, LOW);
       digitalWrite(ledV, HIGH);
     }

void loop() 
    { tAhora = millis();              // Comprobamos para refrescar el LCD
      if( tAhora - tAntes >= tEjec)
        {  // cada 10 segundos
           tAntes = tAhora; // actualizamos variables
           lcd.clear();     // Refrescamos
        }

    medida = analogRead(pinV); // Leemos voltaje de la batería
    valorPot = analogRead(pinOffset); //Leemos ajuste de offset
    int ajuste = map (valorPot, 0,1023,60,5); // Mapeamos a un rango más corto

/* Podemos jugar con los dos últimos valores de la función map. Cuanta más diferencia
   haya entre ellos, menos precisión tendremos con el potenciómetro.
   El valor más grande es para voltajes más lejanos de 5V. El más pequeño para
   las fuentes muy cercanas a 5V. Así, con una fuente de 4.90V el valor de offset será
   de 9 ó 10.
*/

offset = (ajuste/100.0);
lcd.setCursor(12,1);
lcd.print (offset);
voltaje= ((((medida*5.0)/1023.0))- offset); // Convertimos a valor con decimales
if (voltaje<=0)
   { // Si es menor o igual a cero
     voltaje=0.0;  // Le damos valor 0, para evitar negativos
   }

porcent=((voltaje*100)-320); // Fórmula para mostrar el porcentaje de carga
if(porcent<=0)
   { // Evitamos valores negativos
     porcent=0;
   }

// Condicionales para encender los LEDs
if(porcent>=41)
  {  digitalWrite(ledR, LOW);
     digitalWrite(ledA, LOW);
     digitalWrite(ledV, HIGH);
  }

if(porcent<41 && porcent>10)
  {  digitalWrite(ledR, LOW);
     digitalWrite(ledA, HIGH);
     digitalWrite(ledV, LOW);
  }

if(porcent<=10)
  {  digitalWrite(ledR, HIGH);
     digitalWrite(ledA, LOW);
     digitalWrite(ledV, LOW);
  }

lcd.setCursor(0,0);
lcd.print("Voltaje: ");
lcd.print(voltaje);
lcd.print("V");
lcd.setCursor(0,1);
lcd.print("Carga: ");
lcd.print(porcent);
lcd.print("%    ");

//Descomentar para mostrar por monitor serial.
//Serial.print(medida); Serial.print("   ");
//Serial.print(voltaje);Serial.print("   ");
//Serial.print(porcent); Serial.println("%");

delay(1000);
}

Aquí una foto del medidor funcionando, con una batería de móvil en desuso:

Prototipo de medidor

Podríamos añadir un buzzer que nos avisara también cuando el nivel de voltaje llegase a un límite crítico.

Espero le guste.

Saludos.

01/05/2016

 

 

 

 

(46) Comments

    • Javier

    Muy interesante el proyecto, existiría forma de ver esos datos mediante un modulo Bluetooth y una aplicacion android?
    Un saludo.

    • Los datos ya los tienes en el Arduino, o sea que si encuentras una aplicación con la que leer lo que le llega del Arduino no tendrías más que enviarlos con un módulo Bluetooth. Un saludo.

    • Claro que si. Basta con que conectes el circuito a un Bluetooth HC_06 por ejemplo y te conectes desde el movil. Cada vez que imprimes el valor en el display puedes enviarselo a la puerta serie del bluetooth

    • Saya maurys

    hola.. excelente proyecto, tengo una pregunta , yo normalmente uso packs de baterías a diferentes voltajes , a 12 18 y 24 volts , los packs los hago yo mismo , uso baterías 18650 recicladas, como puedo hacer para usar este mismo proyecto con mis packs de baterías? o no hay manera de hacerlo?

    • Hola Saya

      Es de lo mas facil. La unica cuestion es que dependiendo del arduino que utilices tienes que asegurarte de no sobrepasar la tension de ntrada valida en los convertidores. Imaginate que quieres medir una bateria de 24V con un arduino uno de 5V maximo. Basta con que pongas un divisor de tension a la entrada con la proporcion correcta.

      Por ejemplo si pones 5 resistencias de un k seguidas y con 24 V en los extremos, si lees en los extremos de una de las resistencias tendras la quinta parte de la caida de tension, o sea 24/5 = 4.8 a tension nominal y si alcanzara 30V tendrias los 5V maximo que acepta

    • Alex Segarra

    Buenos dias y feliz año nuevo!

    Una duda… ¿ Puedo usarlo para LiPo 3S de 11.1V

    Saludos!

    • Hola alex,
      Este proyecto usa un pin de arduino para leer la carga de la bateria y el maximo que puede leer es de 5 V, pero usando un division de tension con un par de resistencias altas (Para evitar consumos inutiles) debidamente calculada podrias leer una tension aceptable con el arduino y el proyecto seguiria siendo valido. Seria tan sencillo como usar una segunda entrada con ese divisor de tension y multiplicar el resultado por el factor de conversion

Give a Reply

WordPress Anti-Spam by WP-SpamShield