Plusieurs LEDS

Bonjour à tous, voici mon problème.

Je souhaite simplement allumer telle ou telle LED selon une variable, et le faire 25 fois de suite. Chaque LED correspond à une séquence (d'ou le nom ledSeq1,...)
Voici mon code :

int ledSeq1 = 2 ;                // DÉCLARATION VARIABLES
int ledSeq2 = 3 ;                // variables contenants les n° des pins (broches) des leds.
int ledSeq3 = 4 ;
int ledSeq4 = 5 ;
int ledSeq5 = 6 ;
int ledSeq6 = 7 ;
int ledSeq7 = 8 ;
int ledSeq8 = 9 ;


int compteur = 0 ;               // Variables utilisées dans le programme pour définir les séquences.
int valeurvariable =0 ;

void setup()
{
 pinMode(ledSeq1,OUTPUT);         // les pins (broches) sont définies comme des sorties.
 pinMode(ledSeq2,OUTPUT); 
 pinMode(ledSeq3,OUTPUT); 
 pinMode(ledSeq4,OUTPUT); 
 pinMode(ledSeq5,OUTPUT); 
 pinMode(ledSeq6,OUTPUT); 
 pinMode(ledSeq7,OUTPUT); 
 pinMode(ledSeq8,OUTPUT); 
 Serial.begin(9600);              // ouvre le port série et fixe le débit de communication à 9600 bauds (bits par secondes).
}  

void loop()
{
   while (compteur < 25) // tant que compteur inférieur à 25
        { 
          valeurvariable = random(8)+1; // valeurvariable prend une valeur entre 0 et 7 puis on ajoute 1;
          Serial.println(valeurvariable); // affiche la valeur de cette variable
          if (valeurvariable = 1) // si valeurvariable = 1 alors ...
          {
           digitalWrite(ledSeq1, HIGH); // allume la led n°1.
          }  
  
          else if (valeurvariable = 2) // sinon si valeurvariable = 2 alors ...
          {
           digitalWrite(ledSeq2, HIGH); // allume la led n°2.
          }  
          else if (valeurvariable = 3) // sinon si  valeurvariable = 3 alors ...
          {
           digitalWrite(ledSeq3, HIGH); // allume la led n°.
          }  
          else if (valeurvariable = 4) // sinon si valeurvariable = 4 alors ...
          {
           digitalWrite(ledSeq4, HIGH); // allume la led n°4.
          }  
          else if (valeurvariable = 5) // sinon si valeurvariable = 5 alors ...
          {
           digitalWrite(ledSeq5, HIGH); // allume la led n°5.
          }  
          else if (valeurvariable = 6) // sinon si valeurvariable = 6 alors ...
          {
           digitalWrite(ledSeq6, HIGH); // allume la led n°6.
          }  
          else if (valeurvariable = 7) // sinon si valeurvariable = 7 alors ...
          {
           digitalWrite(ledSeq7, HIGH); // allume la led n°7.
          }  
          else if (valeurvariable = 8) // sinon valeurvariable = 8 alors ...
          {
           digitalWrite(ledSeq8, HIGH); // allume la led n°8.
          }  
          delay (5000); // on attend 5000 ms.
compteur++;
        }
}

J'ai déclaré les variables en me basant sur cette syntaxe : "int ledPin = 12 ;"
En branchant la LED sur la broche 12 ça marche bien. Mais je voulais alors le faire avec 8 LEDS.
Donc je me suis dit, je change juste le nom de la variable et je met un n° de broche différent. Bien évidement cela ne marche pas.
Ma question est donc : si je met "const" (devant toute les déclarations de variables) :const int ledSeq1 = 2; Est ce que mon code marchera ?

D'avance merci
PS : je ne peut pas testé le code tout de suite, mais jeudi matin oui =)

Salut!

Ce que tu ne dis pas, c'est le but de ton programme?!
Ensuite, pour vérifier une égalité, ce n'est pas '=' mais '==' qu'il faut utiliser:

if (valeurvariable = 1) // ARCHI FAUX! Tu donnes à ta variable la valeur 1

if (valeurvariable == 1) // ARCHI JUSTE! Tu vérifies une égalité

Ensuite, tu allumes tes leds, mais tu ne les éteints pas. Donc, au bout de 9 tours de compteur, tu peux avoir dans l'idéal les 9 leds allumées. Donc, à quoi servent tes 14 autres tours?

:slight_smile:

Dans le cadre des PPE en TSsi, nous allons utiliser la carte arduino.
voici ce que doit faire le programme :

TANT que la variable "compteur" est inférieur à 25 :

la variable "valeurvariable" prend une valeur entière aléatoire entre 0 et 7 puis on rajoute 1 (juste pour que cela corresponde à le N° des les LEDS)
Selon la valeur attribuée, il faut allumer telle ou telle LED pendant 10 secondes puis l'éteindre :P.
Puis incrémenté "compteur" de 1.
Ceci sera fait 25 fois,

C'est pour cela que je voudrais qu'une broche corresponde à une LED. Comme dans le programme "Blink" je voudrais qu'en déclarant une variable, celle-ci puisse se comporter comme avec ce code ci : "int ledPin = 12 ;"

j'espère que tu as compris =)

Salut,

Tu t'ai vraiment cassé la tête pour rien :wink:

/* Compteur de "tours" de la boucle loop() */
byte compteur = 0 ;

/* setup() */
void setup()
{
  /* Place les broches 2, 3, 4, 5, 6, 7, 8, 9 en sorties */
  for(byte i = 2; i < 10; i++)
    pinMode(i,OUTPUT); 

  /* Initialise le port série */
  Serial.begin(9600); 

  /* Initialise le générateur de nombre aléatoire */
  randomSeed(analogRead(A0));
}  

/* loop() */
void loop()
{
  /* Génére un nombre aléatoire entre 0 et 7 */
  byte valeurvariable = random(8);

  /* Affiche le nombre généré */
  Serial.println(valeurvariable); 

  /* Pour chaque broche utilisé */
  for(byte i = 2; i < 10; i++)
    /* si la broche en cours est celle désigné par la valeur aléatoire */
    if((valeurvariable + 2) == i)
      /* on place la sortie à "1" */
      digitalWrite(i, HIGH);
    else
      /* sinon on place la sortie à "0" */
      digitalWrite(i, LOW);

  /* delai de 5 secondes */
  delay (5000); 

  /* on incrémente le compteur de tours */
  compteur++;

  /* si le compteurs a atteint 25 tours on stop tout */
  if(compteur == 25)
    for(;;); /* Boucle infini */

}

Attention !

  • test d'égalité == et non =,
  • 8 variables pour stocker 8 chiffres de 2 à 9 ... une boucle de 2 à 9 c'est bien mieux,
  • les {} dans un if, for, while, ... ne sont pas obligatoire si il n'y as qu'une instruction aprés,
  • dans ton cas, tes if() else if() ... auraient pu être remplacé par un switch(),
  • une variable const c'est une variable classique mais qui ne peut pas être assigné (modifié),
  • 0..7 + 1 = 9, or tu as 8 sorties, cherche l'erreur :wink:

@schizophrene:

if (valeurvariable = 1) // ARCHI FAUX! Tu donnes à ta variable la valeur 1

if( () <opérande de test> )
En c/c++ c'est syntaxiquement correcte (ici sans parenthèses le compilo a du générer un warning, dissimulé par l'ide).
Mais dans son cas c'est juste une erreur de compréhension syntaxique ?

et si jamais tu veux pas utiliser les broches 2, 3, 4, 5, 6, 7, 8, 9, tu peux utiliser un tableau qui pointera vers le bon pin :wink:

Je me suis mal exprimé dans mon précédent post, avec mon "Archi Faux!"... C'est archi faux, seulement dans le cas d'une comparaison.
Comme l'on réassigne à chaque tour la valeur 1 à la variable, le premier 'if' est toujours juste et la première led est constamment allumée.

Entre autre, les leds ne sont jamais éteintes dans le code de base.

pierro421:
Dans le cadre des PPE en TSsi, nous allons utiliser la carte arduino.
voici ce que doit faire le programme :

TANT que la variable "compteur" est inférieur à 25 :

la variable "valeurvariable" prend une valeur entière aléatoire entre 0 et 7 puis on rajoute 1 (juste pour que cela corresponde à le N° des les LEDS)
Selon la valeur attribuée, il faut allumer telle ou telle LED pendant 10 secondes puis l'éteindre :P.
Puis incrémenté "compteur" de 1.
Ceci sera fait 25 fois,

C'est pour cela que je voudrais qu'une broche corresponde à une LED. Comme dans le programme "Blink" je voudrais qu'en déclarant une variable, celle-ci puisse se comporter comme avec ce code ci : "int ledPin = 12 ;"

j'espère que tu as compris =)

J'ai parfaitement compris, mais ça ne répond pas à la question. Plus clairement, quel est le but final de ton projet, à quel but veux-tu arriver?
Tu remarqueras une chose: dans ton code initial, tu n'éteins jamais tes leds, que ce soit au bout de 10 secondes ou mêmes tout de suite.

Inspire toi du code fourni par skywodd, qui a le mérite d'être compact.

Merci pour vos réponses.

Pour ce qui est du but en lui même c'est bien plus compliqué :stuck_out_tongue_closed_eyes: c'est pour cela que j'ai pas envie de tout écrire c'est trop long.

j'ai pas trop compris ce que tu as écrit skywodd...
je veux utiliser la broche 2 pour la led n°1,... la broche 9 pour la led n°8.
si valeurvariable est égale à 6 alors allumer la led n°6... un truc dans ce genre.
J'ai pas capter ton "byte" et le i....

d'avance merci

pierro421:
je veux utiliser la broche 2 pour la led n°1,... la broche 9 pour la led n°8.
si valeurvariable est égale à 6 alors allumer la led n°6... un truc dans ce genre.

Déja est ce que tu connais le principe des boucles ?
En gros : for(byte i = 2; i < 10; i++) pinMode(i,OUTPUT);
donne une fois exécute :
i = 2
pinMode(i (= 2), OUPUT)
i++ (i = 3)
i (= 3) < 10 ? -> oui !
pinMode(i (= 3), OUPUT)
i++ (i = 4)
i (= 4) < 10 ? -> oui !
... etc etc ... jusqu'a
i++ (i = 10)
i (= 10) < 10 ? -> NON !
sortie de la boucle

pierro421:
J'ai pas capter ton "byte" et le i....

byte c'est pour stocker un nombre pouvant aller de 0 à 255, j'aurai pu laisser le int mais j'aime bien optimiser :grin:

oki la je comprend, mais je crois que tu as pas compris le principe de mon prog (c'est a cause de moi , pardon :blush: :blush: )

8 LEDS, connectées à 8 broches différentes (de la pin2 à la pin9)
une variable appelée "compteur" qui comme son nom l'indique sera utilisée comme compteur
la boucle sera comme suit : TANT QUE "compteur" < 25 FAIRE :
Donner une valeur aléatoire entière à la variable "valeurvariable" entre 0 et 7 puis lui ajouter 1 (je veux quelle prenne la valeur 1,2,3,4,5,6,7, ou 8 ) et afficher cette valeur à l'écran.
SI "valeurvariable" EST ÉGALE A 2 ALORS :
Allumer la LED N°2 (connectée à la pin n°3) pendant 10 secondes, puis l'éteindre.
(SELON LA VALEUR DE "valeurvariable" IL FAUT ALLUMER TELLE OU TELLE LED)
INCRÉMENTER la variable "compteur" de 1.
et là "ça repart au début" pour recommencer la boucle.

D'avance merci 8)
SI "compteur" EST ÉGALE A 25 alors afficher le programme est fini.

...

tu remplace delay (5000); par delay(10000); et mon programme fait exactement ce que ton algo demande.
(Excepté que je travail de 0 à 7 et non de 1 à 8, logique binaire oblige)

Prenons le morceau de code suivant :

/* Génére un nombre aléatoire entre 0 et 7 */
  byte valeurvariable = random(8);

  /* Affiche le nombre généré */
  Serial.println(valeurvariable + 1);  // J'avais oublié le +1 pour ton affichage

  /* Pour chaque broche utilisé */
  for(byte i = 2; i < 10; i++)
    /* si la broche en cours est celle désigné par la valeur aléatoire */
    if((valeurvariable + 2) == i)
      /* on place la sortie à "1" */
      digitalWrite(i, HIGH);
    else
      /* sinon on place la sortie à "0" */
      digitalWrite(i, LOW);

  /* delai de 10 secondes */
  delay (10000); 

  /* on incrémente le compteur de tours */
  compteur++;

  /* si le compteurs a atteint 25 tours on stop tout */
  if(compteur == 25)
    for(;;); /* Boucle infini */

Si valeurvariable = 5 par exemple :
boucle for avec i allant de 2 à 9

  • i = 2, (5 + 2) != 2, Digital2 -> LOW
  • i = 3, (5 + 2) != 3, Digital3 -> LOW
  • i = 4, (5 + 2) != 4, Digital4 -> LOW
  • i = 5, (5 + 2) != 5, Digital5 -> LOW
  • i = 6, (5 + 2) != 6, Digital6 -> LOW
  • i = 7, (5 + 2) == 7, Digital7 -> HIGH // 6eme led allumé, toute les autres éteintes
  • i = 8, (5 + 2) != 8, Digital8 -> LOW
  • i = 9, (5 + 2) != 9, Digital9 -> LOW

En fait, je pense que ton incompréhension vient du fait que tu réfléchis avec 1 comme référence et moi 0.
En informatique et plus particulièrement c/c++ on raisonnent en partant de 0 et non de 1.

Version en partant de 1:

/* Compteur de "tours" de la boucle loop() */
byte compteur = 0 ;

/* setup() */
void setup()
{
  /* Place les broches 2, 3, 4, 5, 6, 7, 8, 9 en sorties */
  for(byte i = 2; i < 10; i++)
    pinMode(i,OUTPUT); 

  /* Initialise le port série */
  Serial.begin(9600); 

  /* Initialise le générateur de nombre aléatoire */
  randomSeed(analogRead(A0));
}  

/* loop() */
void loop()
{
  /* Génére un nombre aléatoire entre 1 et 8 */
  byte valeurvariable = random(8) + 1;

  /* Affiche le nombre généré */
  Serial.println(valeurvariable); 

  /* Pour chaque broche utilisé */
  for(byte i = 2; i < 10; i++)
    /* si la broche en cours est celle désigné par la valeur aléatoire */
    if((valeurvariable + 1) == i)
      /* on place la sortie à "1" */
      digitalWrite(i, HIGH);
    else
      /* sinon on place la sortie à "0" */
      digitalWrite(i, LOW);

  /* delai de 10 secondes */
  delay (10000); 

  /* on incrémente le compteur de tours */
  compteur++;

  /* si loop() a atteint les 25 tours on stop tout */
  if(compteur == 25)
    for(;;); /* Boucle infini = fin du programme */

}

donc si je veux le faire 25 fois, je dois juste changer dans ton "for" ??

pierro421:
donc si je veux le faire 25 fois, je dois juste changer dans ton "for" ??

Non
Le code que je t'ai donné fait déja la boucle 25 fois !

setup() n'est exécuté qu'une fois, mais loop() est exécuté en boucle à l'infini, donc la partie compteur++ et le if(compteur == 25) s'exécutera 25 fois avant de partir dans la boucle infini et bloquer le programme.

est ce que i est une variable ?

est ce que je dois déclarer des variables ?

pierro421:
est ce que i est une variable ?

oui

pierro421:
est ce que je dois déclarer des variables ?

si tu utilise une variable tu doit toujours la déclarer.

oki c'est bon je viens de pigé le truc... ça à été dure :zipper_mouth_face: :zipper_mouth_face:

avec le code commençant par 1, le i doit être déclaré non ?? ou il se fait automatiquement dans le for qui déclare les broches en sortie ?

pierro421:
avec le code commençant par 1, le i doit être déclaré non ?? ou il se fait automatiquement dans le for qui déclare les broches en sortie ?

Le i est déclaré dans le for :wink:
C'est une particularité syntaxique du c++

En c :
byte i;
for(i = 0; .........

En c++ :
for(byte i = 0; .........

(La porté de la variable i est différente par contre, en c i est local à toute la fonction, alors qu'avec la syntaxe c++ i est local à la boucle et à son contenu uniquement.)

oki merci pour les détails ! Ça m'aidera, j'en suis sur. comment pourrais-je définir la variable i ?
Si demain je branche les leds sur les broches (je sais déjà comment les brancher), tout devrait bien marcher ? :frowning:

J'ai essayé le code, j'ai modifié certains trucs, ... Tout marche !! :smiley:
Mais voilà, quand je regarde l'ordre avec lequel les leds se sont allumées, je me rend compte qu'il y a un problème, car les séries ce répètent, je m'explique :
1ère série : led allumée 1, puis la 2, puis la 6 puis la 8,.......
2ème série : led allumée 5, puis 4, 6 ,1, 1 ,2 ....;
3ème série : led allumée 3 puis 4, 6, 8, 4 .....
4ème série : led allumée 1, puis la 2, puis la 6 puis la 8,....... EXACTEMENT LA MÊME QUE LA SÉRIE 1...

j'en ai conclu que cela venait de l'instruction randomSeed()
Après de nombreuses recherches, de programmes essayés, je n'arrive pas à répondre à cette question :comment faire pour que la série ne soit jamais la même ????

D'avance merci .

Poste nous ton code, ça nous éclairera un peu plus ...

pierro421:
j'en ai conclu que cela venait de l'instruction randomSeed()
Après de nombreuses recherches, de programmes essayés, je n'arrive pas à répondre à cette question :comment faire pour que la série ne soit jamais la même ????

randomSeed() permet d'initialiser le générateur de nombre aléatoire.
Si tu ne fait pas un randomSeed() avec un valeur non fixe (comme par exemple un analogRead(A0) avec rien de brancher sur A0) tu aura toujours la même série de nombre, donc plus du tout de l'aléatoire.