Go Down

Topic: Plusieurs LEDS (Read 3105 times) previous topic - next topic

pierro421

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 :

Code: [Select]
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) :
Code: [Select]
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 =)


schizophrene

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:
Code: [Select]
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?

:)

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 =)

skywodd

Salut,

Tu t'ai vraiment cassé la tête pour rien ;)

Code: [Select]
/* 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 ;)

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

if( (<assignation>) <opérande de test> <valeur>) <instruction>
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  ?
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

B@tto

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 ;)
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

schizophrene

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.


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.

pierro421

Merci pour vos réponses.

Pour ce qui est du but en lui même c'est bien plus compliqué :smiley-yell: 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

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.

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


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 :smiley-mr-green:
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

pierro421

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


          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.
         

skywodd

...

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 :
Code: [Select]
/* 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:
Code: [Select]
/* 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 */

}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

pierro421

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

skywodd


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.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

pierro421

est ce que i est une variable ?

est ce que je dois déclarer des variables ?

skywodd


est ce que i est une variable ?

oui


est ce que je dois déclarer des variables ?

si tu utilise une variable tu doit toujours la déclarer.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

pierro421

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

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 ?


Go Up