Pages: [1] 2   Go Down
Author Topic: Testeur de Batteries a 10 Leds  (Read 1067 times)
0 Members and 1 Guest are viewing this topic.
Bias
Offline Offline
Jr. Member
**
Karma: 0
Posts: 94
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour, je cherche a utiliser l'arduino comme testeur voltage avec 10 leds bleu ,
je m'explique ,j'ai des batteries qui ont 3 batteries en series ,on appellera sa des 3S (3Cells) et j'ai des batteries qui ont 4 batteries en series et donc on appellera sa des 4S (4Cells)

chaque batteries fait 3,7V au minimum et 4,2V au maximum
donc une batterie :
3S : minimum = 11,1v et max= 12,6V

4S : minimum = 14,8v et max = 16,8V

jusque la vous me suivait ?

et selon le voltage des batteries il arrive a savoir si c'est une 3S ou une 4S et montre le pourcentage sur les LEDS

en gros à 16,8v il va savoir que c'est une 4S et donc mettre toutes les Leds sur ON si le voltage est à 14,8v toutes les Leds seront éteintes


si une personne comprend et a une idée qu'il me la fasse partagé smiley Merci

si vous ne comprenez toujours pas ,tout ce texte très simple ici : faire varier 10 Leds selon le voltage

Merci de m'aidez ,ça m'aiderai beaucoup pour la réalisation de mon projet.

Cordialement
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3164
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du coup tu bloques où ?
Logged


Paris
Offline Offline
Full Member
***
Karma: 1
Posts: 175
Beyond the possible...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Woow...

Pourquoi ne pas utilisé un diviseur de tension c'est plus simple il te suffira de la faire lire sur un port analogique puis ensuite commander tes led   
Logged

The Mind is like a parachute it works best when opened.

Bias
Offline Offline
Jr. Member
**
Karma: 0
Posts: 94
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si la tension est inférieur ,la Led qui est avant le trait ( trait entre 2 Leds sur la pièce jointe ) doit s'éteindre donc quand la tension est a 12,6V toute les Leds sont allumés ,quand la tension est a 11,1v ,elle sont toutes éteinte .

Equation que j'ai utilisé :

Min = A
Max = B
Nombre de Leds = C
Ecart entre Min et Max = D

B - A = D

D ÷ C = Nombre de Volts entre 2 Leds

donc on en vient à ça :

Pour une 3S(comme dans le schéma de pièce jointe) :

12,6 - 11,1 = 1,5

1,5 ÷ 10 = 0,15

0,15V

Et pour une 4S :

16,8 - 14,8 = 2

2 ÷ 10 = 0,2



donc je veux que a chaque fois que la tension de la batterie est inférieur a une valeur (trait dans le schéma) une led S'éteind .




* Sans titre-1.jpg (127.25 KB, 800x700 - viewed 17 times.)
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3164
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bin
 if(tension>valeur1 && tension=<valeur2) alors allumerLed1() et éteindrelesautres()
if(tension>valeur2 && tension=<valeur3) alors allumerLed1() et allumerLed2() et éteindrelesautres()
et ainsi de suite ...
« Last Edit: April 16, 2013, 03:45:02 pm by B@tto » Logged


Bias
Offline Offline
Jr. Member
**
Karma: 0
Posts: 94
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

faut t'il changer "tension" et "valeur1" ,"valeur2" ,"valeur3" ... ?


fait moi un exemple avec la tension 3,7V ,inférieur a 3.7 La "Led1" S'éteint et supérieur a 3,7V elle s'allume , inférieur à 4V la "Led2" S'éteint ,supérieur elle s'allume avec la "Led1" toujours allumer
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3164
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Exemple simple avec deux led :

Code:
float Tension1=1.5;
float Tension2=3.5;
float Mesure;

void setup(){
pinMode(12,OUTPUT);
pinMode(11,OUTPUT);
}

void loop() {

Mesure=analogRead(0)*5.0/1024.0;

if(Mesure<Tension1) {
digitalWrite(12,LOW);
digitalWrite(11,LOW);
}

if(Mesure>Tension1 && Mesure<Tension2) {
digitalWrite(12,LOW);
digitalWrite(11,HIGH);
}

if(Mesure>Tension2) {
digitalWrite(12,HIGH);
digitalWrite(11,HIGH);
}
}

Logged


Bias
Offline Offline
Jr. Member
**
Karma: 0
Posts: 94
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci ,c'est tout de suite plus claire pour moi !!

juste dernière question : doit-je utiliser le diviseur de tension comme sa http://arduinoprojects101.com/arduino-voltmeter/
et donc l'entremêlait avec le code du testeur de batterie ?

pourrait tu me mélanger le code de testeur de batterie et celui du diviseur de tension ,si ça ne t'embête pas ,surtout merci de ton aide sans toi j'en serai encore a chercher une solution

ou sinon si tu à un tuto sous la main
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3164
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui vu tes valeurs à mesurer il faut forcement un diviseur de tension. Je te conseille également d'ajouter une référence de tension afin de recalibrer ta mesure à chaque fois car la référence interne de l'Atmega est dépendante du 5V de l'alimentation qui lui même peu varier pas mal suivant la source (Vin, USB ...).

Sinon bin il suffit juste de changer les valeur Tension1, Tension2 ... D'ailleurs tu n'est même pas obligé de faire la conversion de l'analogRead() en volt, tu peux rester sur une échelle de 0 à 1024 et fixer Tension1 et les autres à des valeur en correlation.
Logged


Bias
Offline Offline
Jr. Member
**
Karma: 0
Posts: 94
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je te conseille également d'ajouter une référence de tension afin de recalibrer ta mesure à chaque fois car la référence interne de l'Atmega est dépendante du 5V de l'alimentation

référence de tension ? je commence depuis peu le arduino donc je ne m'y connais très peu
Logged

Bias
Offline Offline
Jr. Member
**
Karma: 0
Posts: 94
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

voici mon code entier et fini (enfin j'espère) :
Code:
const int LED1=2;
  const int LED2=3;
  const int LED3=4;
  const int LED4=5;
  const int LED5=6;
  const int LED6=7;
  const int LED7=8;
  const int LED8=9;
  const int LED9=10;
  const int LED10=11;
  int analogInput = 1;
  float vout = 0.0;
  float vin = 0.0;
  float R1 = 50000.0;    // !! resistance of R1 !!
  float R2 = 4400.0;     // !! resistance of R2 !!
  float Tension3=1.5;
  float Tension1=11.1;
  float Tension2=12.6;
  float Tension4=11.25;
  float Tension5=11.4;
  float Tension6=11.55;
  float Tension7=11.7;
  float Tension8=11.85;
  float Tension9=12;
  float Tension10=12.15;
  float Tension11=12.3;
  float Tension12=12.45;
  float Tension13=12.50;
  float Tension14=14.8;
  float Tension15=8.4;
  float Mesure;
// variable to store the value
  int value = 0;
 
void setup(){
  // declaration of pin modes
  pinMode(analogInput, INPUT);
  pinMode (LED1,OUTPUT); // Broche LED configurée en sortie
  pinMode (LED2,OUTPUT); // Broche LED configurée en sortie
  pinMode (LED3,OUTPUT); // Broche LED configurée en sortie
  pinMode (LED4,OUTPUT); // Broche LED configurée en sortie
  pinMode (LED5,OUTPUT); // Broche LED configurée en sortie
  pinMode (LED6,OUTPUT); // Broche LED configurée en sortie
  pinMode (LED7,OUTPUT); // Broche LED configurée en sortie
  pinMode (LED8,OUTPUT); // Broche LED configurée en sortie
  pinMode (LED9,OUTPUT); // Broche LED configurée en sortie
  pinMode (LED10,OUTPUT); // Broche LED configurée en sortie
}

void loop(){
  // read the value on analog input
  value = analogRead(analogInput);

  vout = (value * 5.0) / 1024.0;
  vin = vout / (R2/(R1+R2)); 


Mesure=analogRead(0)*5.0/1024.0;

if(Mesure<=Tension1) {
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
digitalWrite(LED7,HIGH);
digitalWrite(LED8,HIGH);
digitalWrite(LED9,HIGH);
digitalWrite(LED10,HIGH);
delay(2000);
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
digitalWrite(LED4,LOW);
digitalWrite(LED5,LOW);
digitalWrite(LED6,LOW);
digitalWrite(LED7,LOW);
digitalWrite(LED8,LOW);
digitalWrite(LED9,LOW);
digitalWrite(LED10,LOW);
delay(4000);
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
digitalWrite(LED7,HIGH);
digitalWrite(LED8,HIGH);
digitalWrite(LED9,HIGH);
digitalWrite(LED10,HIGH);
}

if(Mesure>Tension1 && Mesure<Tension2) {
digitalWrite(LED1,HIGH);
}


if(Mesure>Tension2 && Mesure<Tension3) {
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
}


if(Mesure>Tension3 && Mesure<Tension4) {
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
}

if(Mesure>Tension4 && Mesure<Tension5) {
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
}

if(Mesure>Tension5 && Mesure<Tension6) {
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
}

if(Mesure>Tension7 && Mesure<Tension8) {
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
}

if(Mesure>Tension8 && Mesure<Tension9) {
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
}

if(Mesure>Tension10 && Mesure<Tension11) {
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
digitalWrite(LED7,HIGH);
}

if(Mesure>Tension11 && Mesure<Tension12) {
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
digitalWrite(LED7,HIGH);
digitalWrite(LED8,HIGH);
}

if(Mesure>Tension12 && Mesure<Tension13) {
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
digitalWrite(LED7,HIGH);
digitalWrite(LED8,HIGH);
digitalWrite(LED9,HIGH);
}

if(Mesure>=Tension13) {
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
digitalWrite(LED7,HIGH);
digitalWrite(LED8,HIGH);
digitalWrite(LED9,HIGH);
digitalWrite(LED10,HIGH);
}

if(Mesure>=Tension14 || Mesure<=Tension15) {
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
digitalWrite(LED5,HIGH);
digitalWrite(LED6,HIGH);
digitalWrite(LED7,HIGH);
digitalWrite(LED8,HIGH);
digitalWrite(LED9,HIGH);
digitalWrite(LED10,HIGH);
delay(500);
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
digitalWrite(LED4,LOW);
digitalWrite(LED5,LOW);
digitalWrite(LED6,LOW);
digitalWrite(LED7,LOW);
digitalWrite(LED8,LOW);
digitalWrite(LED9,LOW);
digitalWrite(LED10,LOW);
delay(500);
}
}
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3164
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je vois déjà un problème : si tu mesures une tension élevée dans ta gamme, puis une tension plus faible, et bien les led ne s'éteindront pas car tu ne les éteins pas. Exemple :

Code:

if(Mesure>Tension1 && Mesure<Tension2) { // cas n°1
digitalWrite(LED1,HIGH);
}


if(Mesure>Tension2 && Mesure<Tension3) { // cas n°2
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
}

Imaginons que le cas n°2 arrive, puis le 1. LED2 restera allumée ...

Il y a ensuite une façon plus simple pour simplifier énormement le code : il suffit de rentrer des n° de pin dans un tableau, puis de faire une boucle. Exemple :

Code:

const byte pinLED[2,3,4,5];
const byte NombreDeLED=4;

...

if(Mesure>Tension1 && Mesure<Tension2) {
allumerLed(1)
}

if(Mesure>Tension2 && Mesure<Tension3) {
allumerLed(2)
}

...

void allumerLED(byte Rang){

for(byte i=0;i<NombreDeLED;i++){

    if(i<Rang) digitalWrite(pinLED[i],HIGH);
    else digitalWrite(pinLED[i],LOW);

    }

}

Logged


Bias
Offline Offline
Jr. Member
**
Karma: 0
Posts: 94
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

et si a chaque nouvelle "Tension" au début je m'étais LOW au 10 Led ,elle s'éteindront puis se rallumeront très rapidement
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3164
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui je pense que ça doit fonctionner aussi. Mais c'est pas vraiment la bonne méthode à adopter. Ici ça fonctionnera (je pense, à tester quand même) mais il suffira que dans un autre montage tu es juste un petit chronophage et tes LED scintilleront, alors que mon code non smiley-wink
Logged


Offline Offline
Full Member
***
Karma: 3
Posts: 130
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Désolé, complétement HS !
Mais il y a circuit intégré de grande diffusion qui fait ça à la perfection
http://en.wikipedia.org/wiki/LM3914
Logged

Pages: [1] 2   Go Up
Jump to: