[Conseil] mesure et affichage batterie Li-Ion

Bien le bonjour,
je suis en train de me faire un petit système audio portable (radio, bluetooth, date/heure, réveil, SD MP3, écran tactile 3.5").
J'ai récupéré une batterie Lithium-Ion d'une ancienne Tablette que ma fille s'est fait un plaisir de casser, et donc l'objectif est d'alimenter ma mega2560 par la batterie via une platine chargeur USB, et un step-up module pour sortir du 5.2v.
Jusque là, tout fonctionne très bien, l'alimentation est stable.
J'aimerais "simplement" afficher l'état de la batterie sur l'écran (4.2v = 5 barres, 4.1v = 4 barres, 4.0v = 3 barres, 3.9v = 2 barres, 3.8v = 1 barre, et 3.7v = vide)
J'ai lu plusieurs tutos expliquant le pont diviseur (R10k sur positif, R10k sur négatif, et à la jonction des 2 R on connecte en analogique.)

Cependant dans tous les tutos que j'ai lu la batterie alimentait l'Arduino directement sans step-up module, et la mesure se faisait sur la borne VIN de l'Arduino.

Cela peut-il fonctionner si l'alimente le MC par le step-up, et la mesure de la batterie en directe via le port analogique et le pont diviseur ?

Tout grand merci d'avance pour vos réponses.

Aegnor

Bonjour,

Tu ne peux pas mesurer la tension à la sortie du step-up pour estimer la charge batterie. Elle sera toujours à la valeur nominale puis va s’effondrer d’un seul coup quand la batterie sera à plat.

Il faut que tu mesures la tension de la batterie, mais estimer la charge en fonction de la tension est très approximatif.

Bonjour Kamill, et merci pour ta réponse,
Oui, c'est très approximatif, sachant que je ne laisserait jamais la batterie descendre trop bas (très mauvais pour la batterie donc lorsqu'elle mesureras 3,9v, hop en charge)
Je ne veux pas la prendre au stepup, en fait, ce que je voudrais faire, c'est brancher la batterie sur le module de charge USB (entrée USB d'un côté, et de l'autre sortie pour charge de batterie, et out pour alimenter les périphériques), sur le out, je mets mon pont diviseur, je connecte la masse à l'arduino aussi, et ensuite je pars sur mon module step up.
Penses-tu que c'est faisable ? (je préfère demander avant de me lancer et risquer de tout faire griller lollll)

Merci

Aegnor

Comme tu parlais de diviseur de tension, je pensais que tu voulais mesurer la tension d'alimentation de l'arduino.
Une batterie li-ion a une tension nominale de 3.7V, tu n'as pas besoin de diviseur de tension.
A 3.7V tu es au début de la décharge de batterie. Si tu coupes à 3.9V tu auras à peine décharger la batterie de 10%. Il faut couper vers 3.4V

Sauf erreur de ma part, les 3.7v sont la tension déchargée (il ne faut pas aller en dessous sous peine de dégâts à la batterie certaines batteries sont capables de descendre à 2.8v, mais c'est au détriment des cycles de charge)
La tension chargée est de 4.2v (et il ne faut pas aller au dessus non plus au risque de faire de gros dégâts aussi)
En même temps, ce type de batteries est équipé de PCB de protection qui empêche la batterie des descendre sous les 3.7v et de monter au delà des 4.2v

Le pont diviseur ce sont les seuls tutos que j'ai trouvé :cry: je voulais l'adapter sur la batterie, car je n'ai absolument aucune idée du "comment mesurer la charge" et l'afficher sur le TFT

Aurais-tu une solution ?

Merciiiiiiiiiii

Aegnor

Aegnor1975:
Sauf erreur de ma part, les 3.7v sont la tension déchargée...

Non 3.7 c'est la tension nominale. La coupure est doit être à 3.4V environ

Tu relie directement le + de ta batterie sur une entrée analogique (si le 0V est commun)

J'essaye ça de ce pas ! donc, pas besoin de pont diviseur !

Grand merci Kamill, dès que c'est fait, je te fait un retour :slight_smile:

à tout de suite :slight_smile:

Tu n'as pas besoin de pont diviseur dès lors que la tension à mesurer est inférieure à 5V

Bon... il ne m'affiche qu'un 2 sur l'écran... et au multimètre, 4.12v
Je n'ai peut-être pas utilisé la bonne formule ?

int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.00 / 1023.00);
String Voltage;
Voltage = (voltage, 2);
myGLCD.print("voltage = ", 1, 160);
myGLCD.print(Voltage, 160, 160); //print the voltage to LCD

La conversion en chaine est erronée

Voltage=String(voltage);

ça fonctionne ! il me manquait un string...

int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.00 / 1023.00);
String Voltage;
Voltage = String(voltage, 2);
myGLCD.print("voltage = ", 1, 160);
myGLCD.print(Voltage, 160, 160); //print the voltage to LCD

Edit :
Ha ha, posté en même temps :smiley:

Un tout grand merci pour ton aide Kamill !!!!!!
Je n'aurais pas imaginé cette solution !

Content pour toi que ça fonctionne

Pour ceux qui sont intéressés, si ça peux aider, voici une radio simple, avec une mega2560, un module radio TEA5767, un TFT 2.2" ILI9225, batterie (récup tablette) step up module 3.7 ==> 5V, et module de charge USB 1A

et le code :

// TFT LCD
#include <UTFT.h>
extern uint8_t nadianne[];
extern uint8_t GroteskBold24x48[];

UTFT myGLCD(ILI9225, 51, 52, 22, 30, 24); // Changez pour vos paramètres
int buf[218];
int x, x2;
int y, y2;
int r;

// RADIO
#include <Wire.h>
#include <TEA5767Radio.h>
#include <EEPROM.h>

#define Next 4 // button
#define EEPROM_Memory  0 

TEA5767Radio radio = TEA5767Radio();
float frequence[] ={ // Mettez vos stations préférées)
  90.5, // viva cite
  92.5, // pure fm
  95.0, // nostalgie
  95.6, // classic 21
  99.0, // fun radio
  100.1, // equinoxe
  101.8, // panach fm
  102.2, // contact
  103.6, // bel rtl
  104.5 // nrj
  };
int Station = 0;

void setup()
{
  Wire.begin();
  readStationEEPROM();
  FrequenceStation();
  pinMode(Next, INPUT);
  myGLCD.InitLCD();
  myGLCD.setFont(nadianne);
  myGLCD.clrScr();
  myGLCD.setColor (0, 0, 255);
  for (int i = 1; i < 175; i += 5)
  {
    myGLCD.drawLine(1, i, (i * 1.44) - 10, 175);
  }
  myGLCD.setColor (255, 255, 255);
  for (int i = 175; i > 1; i -= 5)
  {
    myGLCD.drawLine(219, i, (i * 1.44) - 10, 1);
  }
  
  myGLCD.setColor(255, 0, 0);
  myGLCD.print("Aegduino", CENTER, 64);
  myGLCD.print("Radio", CENTER, 80);
  delay(5000);
  myGLCD.clrScr();
}

void loop(){
  float s = EEPROM.read(EEPROM_Memory);
  String Frequ;
  Frequ = (s);
  myGLCD.setFont(nadianne);
  myGLCD.setColor(0,0,255);
  myGLCD.print("Aegduino", CENTER, 1);
  myGLCD.print("Radio Station", CENTER, 17);
  myGLCD.setColor(0,255,0);
  myGLCD.print("Mhz", 130, 40);
  if(Frequ == "0.00"){
    myGLCD.setFont(GroteskBold24x48);
    myGLCD.setColor(255,0,0);
    myGLCD.print(" 90.5", 1, 40);
    myGLCD.setFont(nadianne);
    myGLCD.setColor(VGA_YELLOW);
    myGLCD.print("Viva Cite ", 1, 120);
  }
  if(Frequ == "1.00"){
    myGLCD.setFont(GroteskBold24x48);
    myGLCD.setColor(255,0,0);
    myGLCD.print(" 92.5", 1, 40);
    myGLCD.setFont(nadianne);
    myGLCD.setColor(VGA_YELLOW);
    myGLCD.print("Pure FM   ", 1, 120);
  }
  if(Frequ == "2.00"){
    myGLCD.setFont(GroteskBold24x48);
    myGLCD.setColor(255,0,0);
    myGLCD.print(" 95.0", 1, 40);
    myGLCD.setFont(nadianne);
    myGLCD.setColor(VGA_YELLOW);
    myGLCD.print("Nostalgie ", 1, 120);
  }
  if(Frequ == "3.00"){
    myGLCD.setFont(GroteskBold24x48);
    myGLCD.setColor(255,0,0);
    myGLCD.print(" 95.6", 1, 40);
    myGLCD.setFont(nadianne);
    myGLCD.setColor(VGA_YELLOW);
    myGLCD.print("Classic 21", 1, 120);
  }
  if(Frequ == "4.00"){
    myGLCD.setFont(GroteskBold24x48);
    myGLCD.setColor(255,0,0);
    myGLCD.print(" 99.0", 1, 40);
    myGLCD.setFont(nadianne);
    myGLCD.setColor(VGA_YELLOW);
    myGLCD.print("Fun Radio  ", 1, 120);
  }
  if(Frequ == "5.00"){
    myGLCD.setFont(GroteskBold24x48);
    myGLCD.setColor(255,0,0);
    myGLCD.print("101.1", 1, 40);
    myGLCD.setFont(nadianne);
    myGLCD.setColor(VGA_YELLOW);
    myGLCD.print("Equinoxe  ", 1, 120);
  }
  if(Frequ == "6.00"){
    myGLCD.setFont(GroteskBold24x48);
    myGLCD.setColor(255,0,0);
    myGLCD.print("101.8", 1, 40);
    myGLCD.setFont(nadianne);
    myGLCD.setColor(VGA_YELLOW);
    myGLCD.print("Panach FM ", 1, 120);
  }
  if(Frequ == "7.00"){
    myGLCD.setFont(GroteskBold24x48);
    myGLCD.setColor(255,0,0);
    myGLCD.print("102.2", 1, 40);
    myGLCD.setFont(nadianne);
    myGLCD.setColor(VGA_YELLOW);
    myGLCD.print("Contact FM", 1, 120);
  }
  if(Frequ == "8.00"){
    myGLCD.setFont(GroteskBold24x48);
    myGLCD.setColor(255,0,0);
    myGLCD.print("103.6", 1, 40);
    myGLCD.setFont(nadianne);
    myGLCD.setColor(VGA_YELLOW);
    myGLCD.print("Bel RTL   ", 1, 120);
  }
  if(Frequ == "9.00"){
    myGLCD.setFont(GroteskBold24x48);
    myGLCD.setColor(255,0,0);
    myGLCD.print("104.5", 1, 40);
    myGLCD.setFont(nadianne);
    myGLCD.setColor(VGA_YELLOW);
    myGLCD.print("NRJ       ", 1, 120);
  }
  int sensorValue = analogRead(A0); 
  float voltage = sensorValue * (4.65/ 1023.00);
  String Voltage;
  Voltage = String(voltage, 2);
  myGLCD.setColor(0,0,255);
  myGLCD.drawRect(1,145,105,172);
  myGLCD.fillRect(106,150,110,167);
  myGLCD.setColor(0,0,255);
  myGLCD.print(Voltage, 115, 150);
  if(Voltage > "4.10"){
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(5,150,20,170);
    myGLCD.setColor(255,165,0);
    myGLCD.fillRect(23,150,40,170);
    myGLCD.setColor(255,215,0);
    myGLCD.fillRect(43,150,60,170);
    myGLCD.setColor(139,139,0);
    myGLCD.fillRect(63,150,80,170);
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(83,150,100,170);
  }
  if(Voltage > "4.00" && (Voltage <= "4.10")){
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(3,150,20,170);
    myGLCD.setColor(255,165,0);
    myGLCD.fillRect(23,150,40,170);
    myGLCD.setColor(255,215,0);
    myGLCD.fillRect(43,150,60,170);
    myGLCD.setColor(139,139,0);
    myGLCD.fillRect(63,150,80,170);
    myGLCD.setColor(0,0,0);
    myGLCD.fillRect(83,150,100,170);
  }
  if(Voltage > "3.90" && (Voltage <= "4.00")){
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(3,150,20,170);
    myGLCD.setColor(255,165,0);
    myGLCD.fillRect(23,150,40,170);
    myGLCD.setColor(255,215,0);
    myGLCD.fillRect(43,150,60,170);
    myGLCD.setColor(0,0,0);
    myGLCD.fillRect(63,150,100,170);
  }
  if(Voltage > "3.80" && (Voltage <= "3.90")){
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(3,150,20,170);
    myGLCD.setColor(255,165,0);
    myGLCD.fillRect(23,150,40,170);
    myGLCD.setColor(0,0,0);
    myGLCD.fillRect(43,150,100,170);
  }
  if(Voltage > "3.70" && (Voltage <= "3.80")){
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(3,150,20,170);
    myGLCD.setColor(0,0,0);
    myGLCD.fillRect(23,150,100,170);
  }

  if (voltage < 3.70) //set the voltage considered low battery here
  {
    myGLCD.setColor(255,0,0);
    myGLCD.print("!", 200, 160);
  }
  boolean NextStation = digitalRead(Next);
  if(NextStation)
  {
    changeNextStation();
    writeStationEEPROM();
    delay(500);
  }
  
  
  delay(20);
  
  
  
}

void FrequenceStation()
{
  radio.setFrequency(frequence[Station]);
}

void changeNextStation()
{
  Station ++;
  if(Station >= sizeof(frequence) / sizeof(frequence[0]))
  {
    Station = 0;
  }
  FrequenceStation();
  
}

void writeStationEEPROM()
{
  EEPROM.write(EEPROM_Memory, Station);
}

void readStationEEPROM()
{
  int station = EEPROM.read(EEPROM_Memory);
  if(station < 0 || 
    station > sizeof(frequence) / sizeof(frequence[0]))  
  {
    station = 0;
    EEPROM.write(EEPROM_Memory, station);
  }
  Station = station;
}