[TUTO] Un genre de Simon avec 6 leds et 2 boutons poussoirs

TUTORIEL: Réalisation d'un simon like avec arduino !

Edit de Jean-François : tu peux regarder en éditant ton message XD => Merci d'avoir mit la vidéo :smiley:

//=== Règles du jeu :

Après une étape "démonstration" qui montre l’enchaînement de l'allumage de leds, on a un clignotement général qui indique notre tour de jeu. Il faut alors, à l'aide des deux boutons, effectuer la même combinaison qui vient d'être montrée.

  • Si on a juste, la led verte clignote et est suivie par la phase "démonstration" à laquelle s'ajoute une led supplémentaire.
  • Si on a faux, la led rouge clignote et est suivie par la phase "démonstration", sans ajout de led, et ce un nombre illimité de fois (on peut se tromper autant de fois que l'on veut, la démonstration ne passera pas au niveau suivant).

Etc... Etc...

//== Matériel requis:

  • 2x bouton poussoir
  • 5x led rouge
  • 1x led verte
  • 6x résistance 330ohm (orange orange marron or)
  • 2x résistance 10kohm
  • 2x condensateur 10nf

//=== Montage :

//=== Code :

const int L1 = 10;
const int L2 = 11;
const int L3 = 12;
const int L4 = 13;
const int led_verte = 8;
const int led_rouge = 9;
const int bt_gauche = 2;
const int bt_droite = 3;
int etat_bt_gauche = HIGH;
int etat_bt_droite = HIGH;
int mem_bt_gauche = HIGH;
int mem_bt_droite = HIGH;
int led_on = 1;
int level[]={1,2,3,2,3,2,1,2,3,4,3,2,3,2,3,4,3,4,3,4,3,2,1,2,1,2}; // A modifier avec une création aléatoire du niveau (non fonctionnel pour l'instant)
int tour = 4;
int utilisateur[40];
int var_perdu = 0;


void setup()
{
  // Initialisation des pins des leds
  pinMode(L1, OUTPUT);
  pinMode(L2, OUTPUT);
  pinMode(L3, OUTPUT);
  pinMode(L4, OUTPUT);
  pinMode(led_rouge, OUTPUT);
  pinMode(led_verte, OUTPUT);
  
  // Initialisation des pins des boutons
  pinMode(bt_gauche, INPUT);
  pinMode(bt_droite, INPUT);
  // Test du fonctionnement des leds, toutes les leds doivent clignoter.
  test_leds();
  // Création aléatoire du niveau, soit un tableau de 40 chiffres correspondant à une led.
  //============//
  // LOAD LEVEL //
  //============//
  light_leds();
}

void loop() 
{
  demo();
  test_bt();     
}

void light_leds()
{
  if(led_on == 1)
  {
    digitalWrite(L1, LOW);
    digitalWrite(L2, HIGH);
    digitalWrite(L3, HIGH);
    digitalWrite(L4, HIGH);
  }
  if(led_on == 2)
  {
    digitalWrite(L1, HIGH);
    digitalWrite(L2, LOW);
    digitalWrite(L3, HIGH);
    digitalWrite(L4, HIGH);
  }
  if(led_on == 3)
  {
    digitalWrite(L1, HIGH);
    digitalWrite(L2, HIGH);
    digitalWrite(L3, LOW);
    digitalWrite(L4, HIGH);
  }
  if(led_on == 4)
  {
    digitalWrite(L1, HIGH);
    digitalWrite(L2, HIGH);
    digitalWrite(L3, HIGH);
    digitalWrite(L4, LOW);
  }
}

void test_leds()
{
  for(int i = 0; i<6; i++)
  { digitalWrite(L1, LOW);
    digitalWrite(L2, LOW);
    digitalWrite(L3, LOW);
    digitalWrite(L4, LOW);
    digitalWrite(led_verte, LOW);
    digitalWrite(led_rouge, LOW);
    delay(100);
    digitalWrite(L1, HIGH);
    digitalWrite(L2, HIGH);
    digitalWrite(L3, HIGH);
    digitalWrite(L4, HIGH);
    digitalWrite(led_verte, HIGH);
    digitalWrite(led_rouge, HIGH);
    delay(100);
  }
  delay(300);
  
}


//================================== LOAD LEVEL [NON FONCTIONNEL]
// Vous pouvez copier ce code mais il n'est pas utilisé par le programme, je le modifierai prochainnement
int load_level()
{
  int led = 1;
  level[0] = led;
  for(int i = 1; i<40; i++)
  {
   led = random(1,5); 
   if(level[i-1] == 1)
   {
    level[i] = 2;
   } 
   if((level[i-1] == 2) && (led == 1 || led == 3))
   {
     level[i] = led;
   }
   if((level[i-1] == 3) && (led == 2 || led == 4))
   {
    level[i] == led; 
   }
   if(level[i-1] == 4)
   {
    level[i] = 3; 
   }
  }  
}

//============================================= TEST BT
void test_bt()
{
  int i = 0;
  while(i<tour-1)
  {
    
    etat_bt_gauche = digitalRead(bt_gauche);
    etat_bt_droite = digitalRead(bt_droite);
  
    if((etat_bt_gauche==LOW) && (led_on > 1) && (mem_bt_gauche == HIGH))
    {
      mem_bt_gauche = LOW;
      led_on = led_on - 1;
      light_leds();
      i++;
    }
    if((etat_bt_droite == LOW) && (led_on < 4) && (mem_bt_droite == HIGH))
    {
      mem_bt_droite = LOW;
      led_on = led_on + 1;    
      light_leds();
      i++;
    }
  
    if((etat_bt_gauche == HIGH) && (mem_bt_gauche == LOW))
    {
     mem_bt_gauche = HIGH;
    } 
    if((etat_bt_droite == HIGH) && (mem_bt_droite == LOW))
    {
     mem_bt_droite = HIGH;
    } 
    if(led_on != level[i])
    {
      var_perdu = 1;
    }
  }
  delay(600);
  if(var_perdu == 1)
  {
    perdu();
    var_perdu = 0;
  }
  else
  {
    gagne();
    tour++;
  }  
}

//========================================= DEMO
void demo()
{
  for(int i = 0; i<tour; i++)
  {
    led_on = level[i];
    light_leds();
    delay(400);    
  }
  test_leds();
  led_on = 1;
  light_leds();
}

void perdu()
{
 digitalWrite(led_rouge, LOW);
 delay(200);
 digitalWrite(led_rouge, HIGH);
 delay(200);
 digitalWrite(led_rouge, LOW);
 delay(200);
 digitalWrite(led_rouge, HIGH);
 delay(200);
 digitalWrite(led_rouge, LOW);
 delay(200);
 digitalWrite(led_rouge, HIGH);
 delay(200);
}

void gagne()
{
 digitalWrite(led_verte, LOW);
 delay(200);
 digitalWrite(led_verte, HIGH);
 delay(200);
 digitalWrite(led_verte, LOW);
 delay(200);
 digitalWrite(led_verte, HIGH);
 delay(200);
 digitalWrite(led_verte, LOW);
 delay(200);
 digitalWrite(led_verte, HIGH);
 delay(200);
}

Voilà, ceci n'est que le début, je commenterai plus en profondeur le code d'ici peu, et je tâcherai de régler le problème de génération du niveau.
Sur ce, j'attends vos commentaires ! :slight_smile:

Euh ouai, mais pour le coup, je sais toujours pas comment faire :stuck_out_tongue:

j'ai testé pleins de trucs:

[vid][/vid]

rien de tout ça ne fonctionne...

Yop merci, post modifié 8)