Mesurer la tension d'une batterie ou d'une pile avec un Arduino ou un ESP8266 • Domotique et objets connectés à faire soi-même

Lorsqu’on développe ses propres objets connectés, on a souvent besoin de les faire fonctionner sur piles ou batterie LiPo. Seul problème, on ne connait pas l’énergie restant ni la tension d’alimentation. Heureusement, l’Arduino, les modules ESP8266 et même le Raspberry possèdent tous au moins un convertisseur analogique/numérique avec lequel on va pouvoir estimer ces deux grandeurs.

Un fois intégré à un serveur domotique, on pourra mettre en place un scénario ou une notification pour indiquer qu’il est temps de remplacer les piles ou recharger la batterie.

Comment mesurer la tension délivrée par une batterie ?

Pour écrire cet article, je n’ai pas réinventé la roue. Je me suis inspiré de cet excellent article publié par skyduino (que je remercie au passage). Nous aurons besoin de deux résistances et d’une carte disposant d’au moins une entrée analogique. J’ai utilisé une carte ESP8266 Wemos D1 Mini présentée précédemment.

Pour mesurer la tension délivrée par une batterie, nous allons réaliser un pont diviseur dont la formule suivante :

Vs = Vin * ( R2 / ( R1 + R2) )

Il faut ensuite tenir compte des caractéristiques de l’Arduino ou de la carte ESP8266. En effet, le convertisseur A/N (ADC) d’un Arduino est capable de supporter une tension de 20 Volts alors que la tension admissible par un ESP8266 est différente d’un fabricant à l’autre (quand elle est indiquée par le fabriquant !!). Voici quelques exemples :

Fabricant

Modèle

Tension max. admissible sur A0 Documentation
Adafruit

Huzzah ESP8266

1.8 Volts Consulter
Wemos

D1 mini

3.3 Volts Consulter
Sparkfun

ESP8266 Thing

? Consulter
Seeed

NodeMCU v2

 ?  Consulter

En fonction de la carte employée, il va donc falloir ajuster le pont diviseur de tension et donc choisir les résistances en conséquence. L’idée est de diminuer la tension délivrée par la batterie (ou les piles) pour ne pas dépasser la tension admissible par le convertisseur, sans trop le diminuer pour avoir une mesure précise…ouff

J’ai fait quelques petits calculs pour trouver des combinaisons de résistances en fonction de la tension admissible par le convertisseur A/N des cartes. J’ai cherché des combinaisons avec des résistances qui sont disponibles dans le Starter Kit Arduino. J’ai fait les calculs pour quelques tensions d’alimentation courantes : 2xAA, 3xAA, 4xAA, régulateur de tension LD1117V33, batterie LiPO, chargeur 5V.

Type d’alimentation

1,8V max. 3.3V max. 20V max.
R1 = 1000 ohms

R2= 220 ohms

R1 = 220 ohms

R2 = 220 ohms

R1 = 1000 ohms

R2 = 4700 ohms

3V 2xAA 0,541V 1,500V 2,474V
3,3V Pont LD1117V33 0,595 V 1,650V 2,721V
3,7V  Batterie LiPo 0,667V 1,850V 3,051V
4,5V 3xAA 0,811V 2,250V 3,711V
5V Chargeur 0,902V 2,500V 4,123V
6,5V 4xAA 1,172V 3,250V 4,650V
Coeff. diviseur du pont 0,18 0,5 0,82456

Code couleur des résistances employées :

  • 220 ohms : rouge, rouge, brun
  • 1000 ohms : brun, noir, rouge
  • 4700 ohms : jaune, violet, rouge

Voici le branchement à réaliser. Branchez la résistance R1 sur l’alimentation +5V (ici, on test l’alimentation 5V de la carte Wemos D1). Reliez la résistance R2 sur la broche GND et la sonde de mesure comme sur le schéma.

zeylsspz8ucjst2yg3za-3643699

Vous pouvez également mesurer la tension délivrée par une autre batterie. Dans ce cas, reliez les masses ensemble (batterie + carte).

Mesurer la tension du batterie avec ESP Easy

Pour ceux qui préfèrent utiliser ESP Easy pour programmer rapidement, voici comment mesurer la tension délivrée par une batterie et la publier ur un serveur domotique à l’aide de MQTT. Si vous découvrez ESP Easy, je vous invite à lire cet article de présentation. De même, si vous débutez avec MQTT, vous pouvez commencer ici.

Connectez vous à la carte ESP et allez dans l’onglet Devices puis cliquez sur Edit de l’une des 4 lignes.

  • Dans le combo Device, sélectionnez Analog input
  • Donnez un nom (le même pour toutes les tâches pour simplifier les Topics MQTT)
  • Donnez un numéro. Inutile sous Jeedom par exemple mais si vous n’indiquez pas un numéro (ou 0), rien ne fonctionne
  • Cochez Send Data

Dans un premier temps, saisissez simplement %value% puis sur submit. Actualisez ensuite la page en appuyant sur Device. On obtient la valeur renvoyée par le convertisseur A/N, une valeur comprise entre 0 (pour 0V) et 1023 (pour 3.3V).

802frepfv9c2v1jvjaml-5310869

Valeur renvoyée par le convertisseur A/N

Maintenant commençons par calculer la valeur théorique mesurée par la sonde en sortie de pont. On l’obtient ainsi :

Value * ( Tension Max. A0 / 1024 )

Dans le cas de la Wemos, la tension max au borne du convertisseur étant de 3,3V, on aura donc pour un niveau 788

788 * ( 3,3 / 1024 ) = 2,54 Volts

Exact !

o1ovp0m15xgtutrmtjx5-4501225

Mesure de la tension en sortie du pont diviseur

Comme on sait que le pont à un coefficient diviseur de 0,5 pour la Wemos D1 Mini, on a donc

Tension Réelle = ( Value * ( 3,3 / 1024 ) ) / 0,5

ou pour être plus précis

Tension Réelle = ( Value * ( 3,3 / 1024 ) ) / ( R2 / ( R1 + R2 ) )

Il ne reste plus qu’à l’intégrer dans ESP Easy. Passez la tâche en édition en saisissez la formule suivante en remplaçant R1 et R2 par la valeur de vos résistances ou le coefficient diviseur s’il est exact.

(%value%*(3.3/1024))/0.5

C’est terminé, vous avez maintenant une mesure (correcte) de la tension délivrée par la carte.

Tension théorique calculée à l’aide d’ESP Easy

Vérifions un peu si on mesure la même chose avec un multimètre directement branché aux bornes de la carte .

Mesure de la tension réelle délivrée à la broche +5V de la Wemos D1 Mini

C’est pas trop mal !

Code Arduino (compatible ESP8266) pour mesurer la tension

Adaptez le code suivant et téléverser le dans un Arduino.

/*
 *  Testeur de batterie par pont diviseur
 *  Projets DIY - Mai 2016 - http://www.projetsdiy.fr
 *  Lire l'article complet :  
 *  Licence : 
 */

/* Constantes */
const float TMaxA0 = 3.3;     // Tension maximale admissible par le convertisseur A/N de la carte (consulter la documentation du fabriquant)
const float coeff_pont = 0.5; // R1 / ( R1 + R2 ) R1 et R2 en ohms
 
/* setup() */
void setup() {
 
  /* Initialisation du port série */
  Serial.begin(9600);
  Serial.println("Testeur Niveau Batterie");
  Serial.println(coeff_pont);
}
 
/* loop() */
void loop() {
 
  /* Mesure du niveau renvoyé par le convertisseur A/N */
  unsigned int raw_bat = analogRead(A0);
  //Serial.println(raw_bat); 
  /* Calcul de la tension réel */
  float tension_bat = ((raw_bat * ( TMaxA0 / 1024)) / coeff_pont);
 
  /* Affichage */
  Serial.println(tension_bat);
  delay(2000);
}

Vous pouvez maintenant surveiller le niveau de batterie de vos objets connectés DIY et même prévoir des scénarios pour déclencher une alerte lorsque le niveau de batterie est devenu trop faible.

Avez-vous aimé cet article ?