Bonjour, bien sur que ceci est possible mais à mon avis pas sur toute les batteries donc si tu avais un model de batterie on pourrais te dire si ça ce fait et comment ça ce fait. la on ne peut rien faire pour toi.
ok bon c'est pas un truc énorme donc tu peut effectivement te mettre au borne et réalisé une lecture, pour ce, tu place la borne - au - de ta carte ARDUINO et le + sur ton entré analogique,puis tu fait un relevé, à mon avis ça sera pas très précis mais bon.. avant de tester ce que je te dit attend que quelqu'un de surment plus confirmé que moi vienne te conseiller ^^
Sinon niveau code quelque chose dans ce gout la devrais faire l'affaire:
int sensorValue=0;
float val_batterie=0,pour_cent=0;
sensorValue = analogRead(2); // A2 , pourquoi je sais pas ^^
val_batterie = (sensorValue * 5) / 1023; // *5 pour les 5v max en lecture et 1023 car 5v = 1023
// la tu obtiens val_batterie en volts
pour_cent = (3.7/val_batterie)*100; // valeur en % 3.7 pour la valeur max de ta batterie
voila monsieur, à n'appliquer que après critique de mes collèges si il te plais je ne veux pas être responsable de ta mort ^^'
Comment est alimentée l'Arduino par rapport à la batterie ?
Ne pas oublier que la lecture 1023 sur un port analogique correspond à l'alimentation de l'Arduino.
Donc si le ATmega est alimentaté directement par la batterie 3.7V, on lira toujours 1023 même quand la batterie ne fera plus que 2V.
Il y a la possibilité de configurer le convertisseur analogique/numérique pour utiliser une tension de référence interne (Bandgap) à 1.1V au lieu de VCC.
Dans ce cas il faut mettre un pont diviseur pour que la tension délivrée sur analog-in avec une batterie en pleine charge corresponde à 1.1V
Le convertisseur analogique-numérique c'est la partie du processeur ATmega qui lit la tension analogique et convertit en une valeur numérique.
Par défaut il utilise comme tension de référence la tension d'alimentation de l'ATmega qui est normalement 5V quand tu branches l'USB ou un peu moins de 5V avec une alimentation externe.
C'est la tension de référence qui est découpée en 1024 valeurs de 0 à 1023 de telle manière que 0 soit retourné pour 0V et que 1023 soit retourné pour une mesure égale à la tension d'alimentation.
Donc il n'y a pas égalité entre 1023 et 5V, il y a égalité entre 1023 et la tension d'alimentation.
Si tu alimente ton Arduino directement avec la batterie à 3,7V, alors tu lira 1023 quand la tension vaut 3,7V
Mais de même quand la batterie va diminuer par exemple à 3V, alors ton ATmega sera alimenté avec VCC = 3V donc 1023 correspondra à 3V c'est a dire que 1023 correspondra toujours a la tension de la batterie quelque soit la tension de la batterie.
Je répète : ceci s'applique si tu alimentes l'Arduino directement en 3.7V sans passer par un convertisseur !!!
Si tu as un convertisseur qui convertir le 3.7V en 5V alors ce n'est pas vrai. Dans ce dernier cas l'ATmega étant toujours alimenté en 5V, le 1023 correspond à 5V.
Dans quel cas es-tu ?
Si tu confirme que tu es dans le premier cas, il faut que le convertisseur A/N travaille avec une tension de référence stable et indépendante de la tension d'alimentation. Il est possible de le faire travailler avec une référence interne appellée bandgap qui vaut 1.1V.
Dans ce cas, la mesure 0..1023 correspond à 0..1,1V
Mais il ne faut alors pas envoyer le 3.7V directement dans l'entrée analogique.
Il faut passer par un pont de résistance diviseur.
Par exemple
VBat -----(820ohms)---
GND -----(330ohms)----+-----> analog in
Le rapport du pont diviseur est 330/(330+820) = 0,287 ce qui donne avec un tension de 3.7V a la batterie une tension de 1,062V a l'entrée analogique
La valeur lue serait alors de 1023 * 1.062/1.1 = 987
Tout d'abord et pour éviter pertes de temps désillusions il faut rappeler que la tension aux bornes d'un accu Lithium renseigne mal sur l'état de charge. La tension varie pas mal avec le courant débité et avec la température.
Par contre entre 75% et 25% de charge la tension varie peu à faible courant de décharge.
C'est bien du point de vue fonctionnement .... moins bien du point de vue connaissance du 'SOC' (Etat de Charge) !!
On peut donc tout au plus espérer une indication très, très approximative de l'état de charge par une mesure de tension......ça permet quand même de surveiller l'approche de la décharge excessive !
Outre les méthodes expliquées ci dessus on peut mesurer Vcc, par mesure indirecte, sans ajout de composant par un tour de passe passe :
On 'mesure' la tension 'de "Bandgap" ' (1,1V +-10%) , que l'on connait déjà !, en la connectant en interne sur le convertisseur analogique.(elle se connecte comme le capteur de température interne)
Cette tension de 1,1V (connue) est donc "mesurée" en prenant Vcc (inconnu) comme référence du convertisseur.
Le calcul inverse donne Vcc.
/*
adapté de "SecretVoltmeter" pour 32u4,
mesure INDIRECTE de Vcc par mesure de Vbandgap -> déduction de Vcc
Bandgap environ 1,121 V expérimental (1,1V .... typique)
*/
long readVcc() {
long result;
// mesurer bandgap reference selon AVcc
ADMUX = _BV(REFS0) | _BV(MUX4)| _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(10); // Wait for Vref to settle
ADCSRA |= _BV(ADSC);
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH<<8;
result = 1121000L / result; // calcul inverse de Vcc
return result;
}
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print( readVcc(), DEC );
Serial.println(" mV");
delay(5000);
}
Personnellement je suis arrivé à la conclusion que les mesures analogiques avec Mega328, Mega3Uu4... nécessitent souvent une VRAIE référence externe, les 'références' de 1,1V ou 2,56V internes n'étant garanties qu'à 10% près =(.
Avec le lithium 10% c'est notoirement insuffisant comme précision.
Un bon régulateur 5V ou 3,3V fait déjà mieux que ces "références" internes.
al1fch:
Personnellement je suis arrivé à la conclusion que les mesures analogiques avec Mega328, Mega3Uu4... nécessitent souvent une VRAIE référence externe, les 'références' de 1,1V ou 2,56V internes n'étant garanties qu'à 10% près =(.
Avec le lithium 10% c'est notoirement insuffisant comme précision.
Un bon régulateur 5V ou 3,3V fait déjà mieux que ces "références" internes.
bonsoir Al1fch
même conclusion
J'aime bien utiliser des petites Vref en TO92 MCP1541 (4.096V) comme c'est une ^2 c'est facile ensuite de jouer avec une résolution simple.
Bon va falloir lui sortir une réponse claire par ce que la on la perdue.. Djo? Djo...? Bippppppppp.. on a perdue DJO !!! xDD
Bon pour faire simple :
"*5 pour les 5v max en lecture et 1023 car 5v = 1023"
ces 5v ces ton alimentatyion si tes a 4v 1023 vaudra 4v donc si tes alimenter en 3.7v 1023=3.7v
donc le résultat de ta lecture sera resultat_batterie * 3.7/1023 et tu aura ta tension en V
Le probleme c'est que si tu utilise la batterie la tension va diminuer donc ton alim aussi et donc le ratio 3.7 1023 aussi donc la ya probleme par contre..
J'ai pas trop d'idée faut écouté leur histoire de référence :
long readVcc() {
long result;
// mesurer bandgap reference selon AVcc
ADMUX = _BV(REFS0) | _BV(MUX4)| _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(10); // Wait for Vref to settle
ADCSRA |= _BV(ADSC);
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH<<8;
result = 1121000L / result; // calcul inverse de Vcc
return result;
}
et avec ça tu obtien ton VCC et tu en déduit v_batterie = analogue_batterie * (readVcc() / 1023)
al1fch:
Personnellement je suis arrivé à la conclusion que les mesures analogiques avec Mega328, Mega3Uu4... nécessitent souvent une VRAIE référence externe, les 'références' de 1,1V ou 2,56V internes n'étant garanties qu'à 10% près =(.
Avec le lithium 10% c'est notoirement insuffisant comme précision.
Un bon régulateur 5V ou 3,3V fait déjà mieux que ces "références" internes.
bonsoir Al1fch
même conclusion
J'aime bien utiliser des petites Vref en TO92 MCP1541 (4.096V) comme c'est une ^2 c'est facile ensuite de jouer avec une résolution simple.
Ces 10% c'est une erreur absolue. Dans le cas traité ici, une calibration (avec une source connue ou une mesure avec un multimètre) permet de corriger le problème.
-Carte Uno ou Duemilanov, sans ajout de composants, lancer le code d'origine de 'Secret Voltmeter' .
Il donnera déjà une bonne idée de Vcc (en mV)
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;
}
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println( readVcc(), DEC );
delay(1000);
}
-Carte Leonardo, Vinciduino, Olimexino32u4..... prendre le code adapté que j'ai testé,
avec la ligne ADMUX = _BV(REFS0) | _BV(MUX4)| _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
-Dans un second temps, on peut améliorer la précision en calibrant par retouche de la valeur 1126400L
Sur ma carte j'avais retenu 1121000L (correspond à 1,121 Volt)
djo54150:
comment voir sur le serial monitor sans etre alimenter par l usb juste par la batterie ?
Ca dépend quelle carte Arduino tu as.
Sur celles qui sélectionnent automatiquement la source d'alimentation, une solution est de te faire ton propre câble USB, sans y câbler le +5V (mais garde la masse commune!).
Comme ça l'Arduino ne va détecter que l'alim externe (je ne sais pas trop comment fonctionne cette détection mais j'étais persuadé que l'alim externe était prioritaire).