un dé composé de 5 leds. Problème

bonjour,

je suis un novice, et je travaille sur un dé à 5 leds composé sur une breadboard.
Un bouton pression active le lancé virtuel du dé. Une série de chiffres aléatoires apparaissent selon la constellation classique du dé, puis se stabilise pour laisse découvrir le résultat aléatoire offert par le dé.

Le problème dont je fais face se situe sur l'activation du bouton. Il ne fonctionne pas.

voici la déclaration des variables:

//déclaration des variables

  //LEDs sur les pins 2 à 6 correspondants aux valeurs de 1-5 du dé (le 6 laissant les leds éteintes)
    int ledHautGauche=2;
    int ledBasGauche=3;
    int ledCentre=4;
    int ledHautDroite=6;
    int ledBasDroite=5;
  //bouton sur le pin 7
    int bouton=7;
  // initialisation du stockage du résultat aléatoire dans 'nombre'
    int nombre;
//////////////////////////////////////////////////////////////////////

Voici la définition de la carte:

void setup()
{
    //appel de la fonction randomSeed() pour la séquence aléatoire
    randomSeed(analogRead (0));
    
    //pin 2 à 6 en mode OUTPUT
    for (int m=2; m<7; m=m++)
    {pinMode(m,OUTPUT);}
    //pin 7 du bouton en mode INPUT_PULLUP
    pinMode (bouton, INPUT_PULLUP);
    //appel de la fonction 'setZero()' pour tout éteindre
    setZero ();
}
////////////////////////////////////////////////////////////////////////

voici le corps du programme

//boucle principale

void loop()
{
    //test de l'état du bouton avec boolean etatBouton
    boolean etatBouton = digitalRead (bouton);
    if (etatBouton == false)
    {for (int affLent=100; affLent<801; affLent=2*affLent)  //boucle for qui temporise l'affichage de plus en plus lentement
            {
                //exctinction brève des LEDs (100ms)
                setZero ();
                //tirage d'un nombre aléatoire avec la fonction random()
                nombre = random(0,6);
                //appel de la fonction d'allumage des LEDs
                allumage();
                delay(affLent);//temporisation
            }//sortie de la boucle de temporisation
    }//sortie du test bouton
//////////////////////////////////////////////////////////////////////////////

voici les fonctions associées au projet.

// les fonctions du programme

    //déclaration de la fonction setZero()
    void setZero()
    {for (int zero=0; zero<5; zero=zero++)
        {digitalWrite(zero+2,LOW);
        delay (100);}
    }
    
    //la fonction d'allumage
    void allumage()
    {
      if (nombre==1){nombre1();}
      if (nombre==2){nombre2();}
      if (nombre==3){nombre3();}
      if (nombre==4){nombre4();}
      if (nombre==5){nombre5();}  
      //inutile de tester le 0 car on a commencé par tout éteindre
      else return;}
    
    // la fonction d'alumage des motifs
    void nombre1() 
    {
    digitalWrite(ledCentre,HIGH);
    }

    void nombre2() 
    {
    digitalWrite(ledHautDroite,HIGH);
    digitalWrite(ledBasGauche,HIGH);
    }
    
    void nombre3() 
    {
    digitalWrite(ledHautDroite,HIGH);
    digitalWrite(ledCentre,HIGH);
    digitalWrite(ledBasGauche,HIGH);
    }

    void nombre4() 
    {
    digitalWrite(ledHautGauche,HIGH);
    digitalWrite(ledHautDroite,HIGH);
    digitalWrite(ledBasGauche,HIGH);
    digitalWrite(ledBasDroite,HIGH);
   }

    void nombre5()
    {
    digitalWrite(ledHautGauche,HIGH);
    digitalWrite(ledBasGauche,HIGH);
    digitalWrite(ledHautDroite,HIGH);
    digitalWrite(ledBasDroite,HIGH);
    digitalWrite(ledCentre,HIGH);
    }

Le montage fait sur le breadboard est établi comme correct.
( pin 2,3,4,5,6 utilisés pour l'allumage ; pin 7 pour le bouton déclaré en INPUT_PULLUP)

Pourquoi ça ne marche pas ?.. La compilation et le téléversement sont acceptés sans erreurs.

Merci ))

Bonjour,

Si tu penses que ton bouton ne fonctionne pas correctement, la première chose à faire est d'afficher son état dans le moniteur série.

Dans setup()

Serial.begin(115200);

Après la lecture du bouton

Serial.println(etatBouton);

Tu ouvres le moniteur série que tu règles à 115200 bds et tu voies déjà ce qui se passe quand tu appuies sure le bouton

Le bouton poussoir fonctionne. Ce soucis est est sans doute dans la programmation.

Pas certain que ton problème vienne de là, mais cette écriture n'est à priori pas correcte

    boolean etatBouton = digitalRead (bouton);
    if (etatBouton == false)

digitalRead() retourne un int la bonne écriture devrait être celle-ci

    int etatBouton = digitalRead (bouton);
    if (etatBouton == LOW)

Merci,
j'ai corrigé, mais la structure ne réagit toujours pas ..

Je n'ai pas compris pourquoi utiliser une boolean est incorrect.

Utiliser un boolean n'est pas 'incorrect'. En C/C++ il y a un transtypage automatique de int en boolean.
La syntaxe proposée par fdufnews est donc plus stricte, mais fait exactement la même chose qu'avec ton boolean.

Pour en revenir à ton problème, mets des Serial.println() dans ton programme pour voir l'état de tes variables et ce qui se passe exactement.

Le problème vient de là:

for (int zero=0; zero<5; zero=zero++)

il faut l'écrire comme cela

for (int zero=0; zero<5; zero++)

La remarque s'applique pour toutes les autres occurrences de for dans ton programme

Effectivement, à présent tout fonctionne.
Merci !!

salut, je suis sur le meme projet(merci openclassrooms), j'ai copier ton code pour voir les differences avec le mien meme si je me rend compte qu'il est similaire mais pourrais tu me donner ton montage pour voir ce qui ne va pas ?

// moi j ai fais ca ( j suis novice aussi du coup j apprends )
ca a l air de marcher mais je pense qu'il doit y avoir plus court pour la temporisation :confused:

//définition des variables de pin pour chaque LED
int pinledHautGauche;
int pinledBasGauche;
int pinledCentre;
int pinledHautDroite;
int pinledBasDroite;
int pinBouton;
int valPot=0;
int nombre;

//initialisation
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0)); //initialise la saléatoireéquence
pinledHautGauche=2;
pinledBasGauche=3;
pinledCentre=4;
pinledHautDroite=6;
pinledBasDroite=5;
pinBouton=7;
//définition des modes
pinMode(pinBouton, INPUT_PULLUP); //mode lecture pour le bouton
pinMode(pinledHautGauche, OUTPUT); //mode écriture pour led1
pinMode(pinledBasGauche, OUTPUT); //mode écriture pour led2
pinMode(pinledCentre, OUTPUT); //mode écriture pour led3
pinMode(pinledHautDroite, OUTPUT); //mode écriture pour led4
pinMode(pinledBasDroite, OUTPUT); //mode écriture pour led5
setZero(); // appelle de la fonction d eteignage des led
delay(2000); //attente
}

// boucle principale
void loop() {
boolean etatpinBouton = digitalRead(pinBouton);
Serial.println(etatpinBouton);

//test des conditions
if (!etatpinBouton){ //si bouton appuyé (donc le pin indique 0 car il est en mode
INPUT_PULLUP)

nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(100);
nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(100);
nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(100);
nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(100);
nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(100);
nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(200);
nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(200);
nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(200);
nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(200);
nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(500);
nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(500);
nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(500);
nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(1000);
nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(1000);
nombre=random(5); //construit le nombre aléatoire
affichage (nombre); //fonction allumage led
delay(2000);

}

}

//fonctions
void setZero(){
for (int t=2;t<7;t++){
digitalWrite(t,LOW);
delay(10);
}
}

void affichage(int nombre){
setZero();//appel de la fonction qui éteint toutes les LED

//il suffit maintenant d'allumer les bonnes diodes
//en testant la valeur de 'nombre'
if (nombre==1){
digitalWrite(pinledCentre,HIGH); //on allume la diode du centre
return;//sortie de la fonction
}
if (nombre==2){
//on allume les diodes haut/droite et bas/gauche
digitalWrite(pinledHautDroite,HIGH);
digitalWrite(pinledBasGauche,HIGH);
return;//sortie de la fonction
}
if (nombre==3){
//on allume les diodes centre, haut/gauche, bas/droite
digitalWrite(pinledHautDroite,HIGH);
digitalWrite(pinledCentre,HIGH);
digitalWrite(pinledBasGauche,HIGH);
return;//sortie de la fonction
}
if (nombre==4){
//on allume toutes les diodes sauf celle du centre
digitalWrite(pinledHautGauche,HIGH);
digitalWrite(pinledHautDroite,HIGH);
digitalWrite(pinledBasGauche,HIGH);
digitalWrite(pinledBasDroite,HIGH);
return;//sortie de la fonction
}
if (nombre==5){
//on allume toutes les diodes
digitalWrite(pinledHautGauche,HIGH);
digitalWrite(pinledBasGauche,HIGH);
digitalWrite(pinledHautDroite,HIGH);
digitalWrite(pinledBasDroite,HIGH);
digitalWrite(pinledCentre,HIGH);
return;//sortie de la fonction
}

}

:slight_smile:

oups juste mettre 6 au lieu du 5 dans la tempo sinon le chiffre 5 n apparait jamais
nombre=random(6)

mais sinon ca c est mieux !

//déclaration des variables
int ledHautGauche=2;
int ledBasGauche=3;
int ledCentre=4;
int ledHautDroite=6;
int ledBasDroite=5;
int bpoussoir=7;
//fonction d'initialisation
void setup() {
//L'instruction randomSeed permet d'initialiser le générateur aléatoire avec une valeur au hasard
randomSeed(analogRead(1));
pinMode(bpoussoir, INPUT_PULLUP);
//mise en mode OUTPUT des pins 2 à 6
for (int t=2;t<7;t++){
pinMode(t,OUTPUT);
}
setZero();//appel de la fonction qui positionne en LOW tous les leds
}

//boucle principale
void loop() {
int etatbp = digitalRead(bpoussoir);// Lire létat du bouton poussoir
if ( etatbp==LOW ){
for (int temps = 10; temps <= 500; temps += 10)
{
// l'instruction random(1,5) renvoie un nombre entier aléatoire compris entre 1 inclus et 5
affichage(random(1,5));
delay(temps);//Les LED s'allument de plus en plus lentement,
}
// delay(100);
}
}

// déclaration des fonctions

//cette fonction sert à éteindre toutes les diodes
void setZero(){
for (int t=2;t<7;t++){
digitalWrite(t,LOW);
}
}

//cette fonction récupère un nombre et allume les LED en conséquence
void affichage(int nombre){
setZero();//appel de la fonction qui éteint toutes les LED

//il suffit maintenant d'allumer les bonnes diodes
//en testant la valeur de 'nombre'
if (nombre==1){
digitalWrite(ledCentre,HIGH); //on allume la diode du centre
return;//sortie de la fonction
}
if (nombre==2){
//on allume les diodes haut/droite et bas/gauche
digitalWrite(ledHautDroite,HIGH);
digitalWrite(ledBasGauche,HIGH);
return;//sortie de la fonction
}
if (nombre==3){
//on allume les diodes centre, haut/gauche, bas/droite
digitalWrite(ledHautDroite,HIGH);
digitalWrite(ledCentre,HIGH);
digitalWrite(ledBasGauche,HIGH);
return;//sortie de la fonction
}
if (nombre==4){
//on allume toutes les diodes sauf celle du centre
digitalWrite(ledHautGauche,HIGH);
digitalWrite(ledHautDroite,HIGH);
digitalWrite(ledBasGauche,HIGH);
digitalWrite(ledBasDroite,HIGH);
return;//sortie de la fonction
}
if (nombre==5){
//on allume toutes les diodes
digitalWrite(ledHautGauche,HIGH);
digitalWrite(ledBasGauche,HIGH);
digitalWrite(ledHautDroite,HIGH);
digitalWrite(ledBasDroite,HIGH);
digitalWrite(ledCentre,HIGH);
return;//sortie de la fonction
}
//inutile de tester le 0 car on a commencé par tout éteindre
return;//sortie de la fonction
}

Vivement que vous découvriez les tableaux, les switch/case et autres if-else :slight_smile:

Continuez!

(Pour les pins c’est mieux de les définir en const byte que en int, votre hack avec la boucle for pour mettre ces pins en OUTPUT est pas top car si vous changez ensuite une des pins nommées votre boucle ne portera pas sur les bonnes pins)

Merci de modifiez tous ces posts au-dessus pour rajouter les balises de code...lire comment utiliser le forum SVP

Bonjour,

Je travaille sur le même programme, je débute et je nage...

voilà mes premières lignes, pouvez-vous me dire si ça va et m'orienter un peu pour la suite <;

Merci

Première fois sur le forum également, ce n'est peut être pas l'endroit pour poser mes questions ?
/*dé à 5 leds
*
*/
//déclaration des variables

//variable pour le bouton poussoir

const int pinBouton =7;

// les leds sont connectées au pin avec résistance de 220 ohm

const int pinLed[5]={2,3,4,5,6};

byte light [5] [5] = {
{0,0,0,0,0},
{0,0,0,1,0},
{1,1,0,0,0},
{1,0,0,1,1},
{1,1,1,1,1},
};

int nbAlea; // stockage du nombre aleatoire
int temps;
void setup()
{

//initialisation
Serial.begin(9600);

//appel de la fonction randomSeed() pour la séquence aléatoire
randomSeed(analogRead(0)); // initialise la séquence aléatoire

//pin 2 à 6 en mode OUTPUT
// configuration des broches en sortie
for (int i=0;i<5;i++){

pinMode(pinLed*, OUTPUT);*
}

//pin 7 en mode INPUT_PULLUP
pinMode(pinBouton,INPUT_PULLUP);
}

  • //appel de la fonction setZero() pour tout éteindre*

  • void setZero(){*

  • }*

*// boucle principale *
void loop()

{

  • int etatBouton=digitalRead(pinBouton); //lire l'état Bouton*

  • if(etatBouton==LOW){*

  • for (int temps=10;temps<500;temps+=10)*

  • {*

  • }*

  • // nombre aléatoire de 0 à 5*

  • nbAlea=random(0,6);*

  • delay( temps);// les leds s'allument de plus en plus lentement*

  • Serial.println(nbAlea); // affichage du nombre*

  • delay(100);*

  • setZero();{ // ttes les leds sont éteintes*

  • }} }*

Non, ça ne va pas. Ton code devrait être entre balises code comme expliqué dans les règles du forum. Et ce n'est pas juste pour t’embêter qu'on te dit ça. C'est parce que la mise en page du code est perdue et cela le rend difficile à lire.