Pages: [1] 2   Go Down
Author Topic: Plusieurs LEDS  (Read 2652 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
AU
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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?

smiley
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-razz.
                     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 =)
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5354
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut,

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

Code:
/* 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 smiley-wink

@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  ?
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

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

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 smiley-wink
Logged


Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-razz.
                     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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5354
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-cool
                                                SI "compteur" EST ÉGALE A 25 alors afficher le programme est fini.
         
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5354
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

...

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:
/* 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:
/* 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 */

}
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5354
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

est ce que i est une variable ?

est ce que je dois déclarer des variables ?
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5354
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?

Logged

Pages: [1] 2   Go Up
Jump to: