Aide programme et branchement

Bonjour à tous, ayant besoin d'Arduino pour mon projet de BAC et n'en ayant jamais réellement fait pendant les cours, je viens vous demander de l'aide.

J'ai besoin d'un programme Arduino me permettant de lire la tension d'une batterie au plomb qui délivre entre 12 et 15v et ensuite l'afficher sur un afficheur LCD en 2x16 sous forme de pourcentage.

J'ai déjà fait les ponts diviseur pour la batterie :

En 12v :

Ici j'ai donc 3.32v

En 15v :

Et là, j'ai 4.15v

Ces valeurs sont donc bonne pour l'analog read de l'arduino.

Le schéma de câblage de l'arduino et de l'afficheur :

AnalogRead me retournera une valeur sur 10bit, si j'ai par exemple 700, j'aurais juste à faire 700/1023x5 = 3.42v, en me basant sur ce tableau :

Ma batterie serait alors très déchargé.

Maintenant, le problème c'est que je n'ai aucune connaissances en Arduino et que je ne sais même pas comment brancher mon couple Batterie + pont diviseur à l'arduino ni comment réaliser mon programme.

J'aurais donc besoin d'aide dans la réalisation de ce programme, si une âme charitable pouvait m'expliquer comment faire, je lui serait très reconnaissant. (je dis bien besoin d'aide, je ne demande pas que quelqu'un me le fasse, je préfère préciser pour ne pas m'en prendre plein la gueule :wink: )

Le programme est vraiment le plus important, le branchement peut attendre, il faut juste que j'ai un programme à mettre dans ma revue de projet.

Voilà, merci d'avance à ceux qui m'aideront :slight_smile:

Voilà un début de programme que j'ai trouvé sur le net, et qui n'est pas du tout compliqué à comprendre car seulement des initialisation de broche et description des valeurs

#include <LiquidCrystal.h>

const int RS=6; //declaration constante de broche 
const int E=7; //declaration constante de broche 
const int D4=8; //declaration constante de broche 
const int D5=9; //declaration constante de broche 
const int D6=10; //declaration constante de broche 
const int D7=11; //declaration constante de broche 

const int Voie_0=0; //declaration constante de broche analogique

int mesure_brute=0;// Variable pour acquisition résultat brut de conversion analogique numérique
float mesuref=0.0;// Variable pour calcul résultat décimal de conversion analogique numérique

float tension=0.0; // Variable tension mesurée
float tension_batterie=0.0; // Variable tension batterie calculée

LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// Création d'un objet LiquidCrystal = initialisation LCD en mode 4 bits 

void setup()   { // debut de la fonction setup()

lcd.begin(16,2); // Initialise le LCD avec 16 colonnes x 2 lignes 
delay(10); // pause rapide pour laisser temps initialisation

} // fin de la fonction setup

void loop(){ // debut de la fonction loop()

mesure_brute=analogRead(Voie_0);

maintenant, sous forme de texte ce que je penses faire pour le programme :

Afficher sur le lcd en permanence sur la ligne 1 : voltage:
Afficher sur le lcd en permanence sur la ligne 2 : pourcentage:
faire le calcule suivant : valeur analog read/1023x5 (qui donne le voltage de la batterie)
Afficher le voltage de la batterie sur ligne 1, colonne 10
Donner sous forme de pourcentage la batterie sur la ligne 2, colonne 13

Pour le pourcentage de la batterie, il va donc falloir que j'initialise les valeurs du tableau plus haut, comment faire exactement ?

Faire le calcule suivant : valeur analog read/1023x5 (qui donne le voltage de la batterie)

Non cela donne la tension ramenée sur l'échelle 5V après atténuation par ton pont diviseur.
Il faut donc prendre en compte dans le calcul le rapport de d'atténuation de ton pont diviseur

Mon pont diviseur est de 18+47k, si je fait donc la valeur du calcul plus haut x(18+47)/10, j'aurais alors la valeur de la batterie ?

Exemple :
700/1023x5 = 3.42v

3.42x(18+47)/10 = 22.23v

Ce qui est pas possible car j'ai une batterie 12v, qu'est-ce qui cloche dans mon calcul ?
Si ma batterie était une 2 éléments, la tension serait égal à 11.115v, ce qui serait là bien plus logique, le problème c'est que ma batterie n'est pas une 2 éléments.

Pour le moment, ce n'est pas trop mon problème, j'aimerais juste savoir comment écrire le programme, j'ai les idées en tête, mais je ne sais pas retranscrire ça en langage arduino, c'est pour le moment mon objectif principal.

Bonjour,

Adamentys:
Exemple :
700/1023x5 = 3.42v

3.42x(18+47)/10 = 22.23v

d'ou viens le /10 ? si on remplace par /18 (valeur de la résistance) on obtient 12.35V

Aaaaah, d'accord, j'avais complètement oublié qu'il fallait diviser par la valeur de la résistance, le /10 vient d'un autre calcul de pont diviseur que j'ai fait il y a quelques temps, voilà pourquoi je me suis embrouillé et que je me demandais pourquoi /10.

Merci à toi pour m'avoir éclairé là dessus.

Voilà une petite avancée sur mon programme, je regarde un peu partout sur le net pour savoir comment l'écrire mais je ne sais pas si ce que je fait est bon :

#include <LiquidCrystal.h>

const int RS=6; //declaration constante de broche 
const int E=7; //declaration constante de broche 
const int D4=8; //declaration constante de broche 
const int D5=9; //declaration constante de broche 
const int D6=10; //declaration constante de broche 
const int D7=11; //declaration constante de broche 

const int Voie_0=0; //declaration constante de broche analogique

int mesure_brute=0;// initalisation de la valeur d'analog read

float tension=0.0; // Variable tension mesurée
float tension_batterie=0.0; // Variable tension batterie calculée avec prise en compte pont diviseur

LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// Création d'un objet LiquidCrystal = initialisation LCD en mode 4 bits 

void setup()   { // debut de la fonction setup()

lcd.begin(16,2); // Initialise le LCD avec 16 colonnes x 2 lignes 
delay(10); // pause rapide pour laisser temps initialisation

lcd.setCursor(0,0) // positionne le curseur de LCD sur la colonne 1 et ligne 1
lcd.print("TENSION:"); //afficher "tension" sur le LCD
lcd.setCursor(0,1) // positionne le curseur de LCD sur la colonne 1 et ligne 2
lcd.print("POURCENTAGE:") //afficher "pourcentage" sur le LCD"

} // fin de la fonction setup

void loop(){ // debut de la fonction loop()

unsigned int mesure_brute = analogRead(A0); // mesure de la valeur de la batterie sur analog read
float tension = ((mesure_brute / (1023*5)); // donne la tension de la batterie 
float tension_batterie = ((tension * (18+47)/18)) // donne la tension de la batterie avec prise en compte du pont diviseur
lcd.setCursor(10,0); // positionne le curseur en colonne 10 ligne 1
lcd.print("tension_batterie"); // écrit la valeur de de la tension

Maintenant il me manque l'affichage de la batterie en pourcentage.

Voilà donc le pourcentage en fonction de la tension :

100% : 15v
90% : 13.5v
80% : 12v
70% : 10.5v
60% : 9v
50% : 7.5v
40% : 6v
30% : 4.5v
20% : 3v
10% : 1.5v
5% : 0.75v
0% : 0v

Je ne pourrais pas t'aider sur la partie LCD, mais je vois quelques pb dans ton code :

( en trop et ";" corrigé, merci à toi.

Par contre, je vois pas ce qu'il ne va pas avec mes variables, je les ai déclaré au début puis je les réutilises après pour les calculs, c'est pas bon ?

si tu redeclare ta variable dans ta boucle, ce n'est plus la meme
voici ton code avec les corrections ( verifies car j'ai modifié des effectations car je n'ai pas le meme cablage. j'ai mis des XXXXXXXXXXXXXXXX derrièere les commentaires des lignes concernées

#include <LiquidCrystal.h>

const int RS=6; //declaration constante de broche
const int E=7; //declaration constante de broche
const int D4=8; //declaration constante de broche
const int D5=9; //declaration constante de broche
const int D6=10; //declaration constante de broche
const int D7=11; //declaration constante de broche

const int Voie_0=0; //declaration constante de broche analogique
const int entree_ana = A4;//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
float mesure_brute=0;// initalisation de la valeur d'analog read XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

float tension=0.0; // Variable tension mesurée
float tension_batterie=0.0; // Variable tension batterie calculée avec prise en compte pont diviseur

//LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// Création d'un objet LiquidCrystal = initialisation LCD en mode 4 bits
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //cablage du LCDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
void setup() { // debut de la fonction setup()

lcd.begin(16,2); // Initialise le LCD avec 16 colonnes x 2 lignes
delay(10); // pause rapide pour laisser temps initialisation

lcd.setCursor(0,0); // positionne le curseur de LCD sur la colonne 1 et ligne 1
lcd.print("TENSION:"); //afficher "tension" sur le LCD
lcd.setCursor(0,1); // positionne le curseur de LCD sur la colonne 1 et ligne 2
lcd.print("POURCENTAGE:"); //afficher "pourcentage" sur le LCD"

} // fin de la fonction setup

void loop(){ // debut de la fonction loop()

mesure_brute = analogRead(entree_ana); // mesure de la valeur de la batterie sur analog readXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
float tension = ((mesure_brute / (1023*5))); // donne la tension de la batterie
float tension_batterie = ((tension * (18+47)/18)); // donne la tension de la batterie avec prise en compte du pont diviseur
lcd.setCursor(10,0); // positionne le curseur en colonne 10 ligne 1
lcd.print(tension_batterie); // écrit la valeur de de la tension
}

pour le cablage de ton LCD, la pinoche 3 est le retour du curseur d'un potar dont les extrémités sont à brancher entre le +5V et la masse. habituellement, je mets un 50 K en burns multitour mais un graphite fera l'affaire.
il sert à regler le contraste.
lorsque tu lancera ton prg pour la 1ere fois, il te faudra tourner ce potar pour avoir le bon contraste sur le LCD sinon, tu n'aura rien sur le LCD ou tu aura des pavés de 5x8 pixels

D'accord, merci pour ces infos et les corrections que tu as fait sur mon code.

Maintenant, il faut que j'affiche la tension finale de la batterie sous forme de pourcentage, pour ça, il faut que je déclare toutes ces valeurs :
100% : 15v
90% : 13.5v
80% : 12v
70% : 10.5v
60% : 9v
50% : 7.5v
40% : 6v
30% : 4.5v
20% : 3v
10% : 1.5v
5% : 0.75v
0% : 0v

mais je ne vois pas comment les déclarer, peut être comme ça :

var int 15v = 100%
var int 13.5v = 90%

et ainsi de suite ?

Et ensuite, il faut attribuer un pourcentage en fonction du résultat du calcul de la tension :

if tension_batterie entre 15 et 13v (je ne vois pas commen écrire ça) = 90% et ensuite afficher pourcentage sur le LCD

ça serait bon comme ça ?

A quoi correspond le pourcentage? une batterie 12V qui délivre 7.5V n'est pas à 50% de charge mais complètement vide!

(au fait, on parle bien d'une batterie type voiture?)

abstraction de cette remarque fort juste

tu déclares
float coef = 3.61;
float coef12=0.12;
float coef15=0.15;

puis tes calculs de tension et Pourcentage
tension_calculee =(mesure_brute/1023);
tension_calculee= ((tension_calculee*5)*coef);
tension_P = (tension_calculee/coef12);

le problème: comment savoir si c'est une batterie de 12 ou 15 V?

fablath:
A quoi correspond le pourcentage? une batterie 12V qui délivre 7.5V n'est pas à 50% de charge mais complètement vide!
La Batterie c'est quoi : questions et réponses, mesures - Technologie - Mécanique / Électronique - Forum Technique - Forum Auto

(au fait, on parle bien d'une batterie type voiture?)

C'est une batterie plomb qui délivre entre 12 et 15v, 6Ah je crois, je ne l'ai pas sous les yeux.

dfgh:
abstraction de cette remarque fort juste

tu déclares
float coef = 3.61;
float coef12=0.12;
float coef15=0.15;

puis tes calculs de tension et Pourcentage
tension_calculee =(mesure_brute/1023);
tension_calculee= ((tension_calculee*5)*coef);
tension_P = (tension_calculee/coef12);

le problème: comment savoir si c'est une batterie de 12 ou 15 V?

On va dire que c'est une batterie 15v car elle peut délivrer 15v au max, c'est mieux ainsi et c'est sans réel importance.

Pour le coeff 3.61, comment est-ce que tu l'as obtenue, d'où vient-il ?

((18/(18+47))*12)=3.32
si 12V en entrée du pont diviseur, en sortie il y aura 3.32 V
d'où le coef = 12V/3.32=3.61

((18/(18+47))*15)=4.15
si 15V en entrée du pont diviseur, en sortie il y aura 4.15V
d'où le coef = 15/4.15=3.61

même coef, normal puisque c'est le même pont diviseur
le calcul de tension_p est fait pour une tension batterie de 12V
tu dis que ta batterie donne 15V, il faudra changer le coef12 par coef15
et si ta batterie te donne 12 volts, tu aura un pourcentage de 80%
ce qui sera exact

D'accord, super ces explications !

J'vais pouvoir terminer mon programme, faire l'algorithme et l'algorigramme correspondant :slight_smile:

Merci beaucoup à toi et aux autres :slight_smile: