| 
				   | 
				
| Ligne 37 : | 
Ligne 37 : | 
|   | ==fichiers à joindre==  |   | ==fichiers à joindre==  | 
|   | code, ficher d'impression 3D, de découpe laser ou vinyle, ...  |   | code, ficher d'impression 3D, de découpe laser ou vinyle, ...  | 
| − | 
  |   | 
| − | ==Code==
  |   | 
| − | <syntaxhighlight lang="Arduino" line>
  |   | 
| − | #include "FastLED.h"                    //bibliothèque pour controler le ruban led
  |   | 
| − | #define NUM_LEDS 86
  |   | 
| − | #define NUM_OF_LEDS_BY_LEVEL 17         // nombre de leds par niveau
  |   | 
| − | #define NUM_OF_LEVELS 5                  // nombre de niveaux
  |   | 
| − | #define PIN_BTN 3                       // Entree du bouton
  |   | 
| − | #define PIN_LEDS 2                      // Sortie du ruban led
  |   | 
| − | 
  |   | 
| − | // Dans ce programme nous avons utilisé presque intégralement des variables globales
  |   | 
| − | 
  |   | 
| − | CRGB leds[NUM_LEDS];
  |   | 
| − | int level = 0;        // niveau auquel le joueur est
  |   | 
| − | int delay_level = 30; // délai qui permet de controler la vitesse de déplacement de la led
  |   | 
| − | auto color = CRGB::Purple; // couleur de la led qui se déplace
  |   | 
| − | int score = 0;           // socre du joueur
  |   | 
| − | const double coef[] = {1, 1.4, 1.7, 1.9, 2, 2.2}; // coefficient multiplicateur de point par niveau
  |   | 
| − | int last_point = 0;     // sauvegarde de la derniere led allumée pour la rallumer après flash()
  |   | 
| − | 
  |   | 
| − | 
  |   | 
| − | // Déclarations de fonctions
  |   | 
| − | int compute_score(int score_of_level);    // calcul du score par niveau
  |   | 
| − | int up();           // deplacement led
  |   | 
| − | int down();         // deplacement led dans l'autre sense
  |   | 
| − | void level_up();    // passage de niveau
  |   | 
| − | void flash();       // animation de victoire d'un niveau
  |   | 
| − | 
  |   | 
| − | 
  |   | 
| − | void setup() {
  |   | 
| − |   FastLED.addLeds<NEOPIXEL, 2>(leds, NUM_LEDS);     // setup du ruban de led sur la sortie PIN_LEDS => 2
  |   | 
| − |   pinMode(PIN_BTN, INPUT);                          // setup du bouton dur l'entrée PIN_BTN => 3
  |   | 
| − |   Serial.begin(9600);                               // setup moniteur série pour debug
  |   | 
| − | }
  |   | 
| − | 
  |   | 
| − | void loop() {
  |   | 
| − | 
  |   | 
| − |   int score_of_level;
  |   | 
| − |   if (score_of_level = up())              // led avance dans un sense
  |   | 
| − |   {
  |   | 
| − |     score += compute_score(score_of_level);       // ajout score du niveau
  |   | 
| − |     level_up();
  |   | 
| − |   }
  |   | 
| − |   else if (score_of_level = down())       // led avance dans l'autre sense
  |   | 
| − |   {
  |   | 
| − |     score += compute_score(score_of_level);       // ajout score du niveau
  |   | 
| − |     level_up();
  |   | 
| − |   }
  |   | 
| − | 
  |   | 
| − | 
  |   | 
| − | }
  |   | 
| − | 
  |   | 
| − | int compute_score(int score_of_level)
  |   | 
| − | {
  |   | 
| − |   return (NUM_OF_LEDS_BY_LEVEL/2 - (int)abs((level * NUM_OF_LEDS_BY_LEVEL + NUM_OF_LEDS_BY_LEVEL / 2) - score_of_level)) * coef[level] + 1;
  |   | 
| − |   // On calcul le nombre de leds d'un niveau moins la différence entre la led du joueur et celle du milieu on ajoute 2 et on multiplie par le coefficient de points du level
  |   | 
| − | }
  |   | 
| − | 
  |   | 
| − | int up()
  |   | 
| − | {
  |   | 
| − |   for (int i = NUM_OF_LEDS_BY_LEVEL * level; i <= (NUM_OF_LEDS_BY_LEVEL * level + NUM_OF_LEDS_BY_LEVEL - 1); i++)
  |   | 
| − |   {
  |   | 
| − |     if (digitalRead(PIN_BTN))   // appuie sur le bouton
  |   | 
| − |     {
  |   | 
| − |       while (digitalRead(PIN_BTN))    // blocage du bouton tant que celui-ci n'a pas été relaché
  |   | 
| − |       {
  |   | 
| − |         delay(2);
  |   | 
| − |       }
  |   | 
| − |       last_point = i-1;     // on concerve la valeur de la led choisie pour la réafficher après le flash
  |   | 
| − |       return i - 1;   // renvoie la position de la led au moment de l'appuie sur le bouton
  |   | 
| − |     }
  |   | 
| − |     leds[i - 1] = CRGB::Black;
  |   | 
| − |     delay(3);
  |   | 
| − | 
  |   | 
| − |     leds[level * NUM_OF_LEDS_BY_LEVEL + NUM_OF_LEDS_BY_LEVEL / 2] = CRGB::White;
  |   | 
| − |     leds[i] = color;
  |   | 
| − | 
  |   | 
| − |     FastLED.show();
  |   | 
| − |     delay(delay_level);
  |   | 
| − |   }
  |   | 
| − |   leds[NUM_OF_LEDS_BY_LEVEL * level + 20] = CRGB::Black;
  |   | 
| − |   FastLED.show();
  |   | 
| − |   delay(delay_level);
  |   | 
| − |   return 0;
  |   | 
| − | 
  |   | 
| − | }
  |   | 
| − | 
  |   | 
| − | int down()
  |   | 
| − | {
  |   | 
| − | 
  |   | 
| − |   for (int i = NUM_OF_LEDS_BY_LEVEL * level +  NUM_OF_LEDS_BY_LEVEL - 1; i >= NUM_OF_LEDS_BY_LEVEL * level ; i--)
  |   | 
| − |   {
  |   | 
| − |     if (digitalRead(PIN_BTN))
  |   | 
| − |     {
  |   | 
| − |       while (digitalRead(PIN_BTN))
  |   | 
| − |       {
  |   | 
| − |         delay(2);
  |   | 
| − |       }
  |   | 
| − |       last_point = i+1;
  |   | 
| − |       return i + 1;   // renvoie la position de la led au moment de l'appuie sur le bouton
  |   | 
| − |     }
  |   | 
| − |     leds[i + 1] = CRGB::Black;
  |   | 
| − |     delay(3);
  |   | 
| − | 
  |   | 
| − |     leds[level * NUM_OF_LEDS_BY_LEVEL + NUM_OF_LEDS_BY_LEVEL / 2] = CRGB::White;
  |   | 
| − |     leds[i] = color;
  |   | 
| − | 
  |   | 
| − |     FastLED.show();
  |   | 
| − |     delay(delay_level);
  |   | 
| − |   }
  |   | 
| − |   leds[NUM_OF_LEDS_BY_LEVEL] = CRGB::Black;
  |   | 
| − |   FastLED.show();
  |   | 
| − |   delay(delay_level);
  |   | 
| − |   return 0;
  |   | 
| − | 
  |   | 
| − | 
  |   | 
| − | }
  |   | 
| − | void flash()   // fonction de décoration qui fait clignoter les leds en blanc avant le passage de niveau
  |   | 
| − | {
  |   | 
| − |   for (int cpt = 0; cpt < 4; cpt++) 
  |   | 
| − |   {
  |   | 
| − |     for (int i = NUM_OF_LEDS_BY_LEVEL * level; i <= (NUM_OF_LEDS_BY_LEVEL * level + NUM_OF_LEDS_BY_LEVEL - 1); i++)  // On met toute les leds du niveau en blanc
  |   | 
| − |     {
  |   | 
| − |       leds[i] = CRGB::White;
  |   | 
| − |     }
  |   | 
| − |     FastLED.show();
  |   | 
| − | 
  |   | 
| − |     delay(100);
  |   | 
| − |     for (int i = NUM_OF_LEDS_BY_LEVEL * level; i <= (NUM_OF_LEDS_BY_LEVEL * level + NUM_OF_LEDS_BY_LEVEL - 1); i++) // On éteint toutes les leds du niveau
  |   | 
| − |     {
  |   | 
| − |       leds[i] = CRGB::Black;
  |   | 
| − |     }
  |   | 
| − |     FastLED.show();
  |   | 
| − |     delay(100);
  |   | 
| − |   }
  |   | 
| − |   leds[last_point] = CRGB::Red;
  |   | 
| − | }
  |   | 
| − | 
  |   | 
| − | void score_leds()   // affichage du score avec les leds
  |   | 
| − | {
  |   | 
| − |   for (int i = 0; i < score; i++)
  |   | 
| − |   {
  |   | 
| − |     leds[i] = CRGB::Red;
  |   | 
| − | 
  |   | 
| − |     FastLED.show();
  |   | 
| − |     delay(10);
  |   | 
| − |   }
  |   | 
| − | }
  |   | 
| − | 
  |   | 
| − | void reset_leds()   // on éteint toutes les leds
  |   | 
| − | {
  |   | 
| − |   for (int i = 0; i < NUM_LEDS; i++)
  |   | 
| − |   {
  |   | 
| − |     leds[i] = CRGB::Black;
  |   | 
| − | 
  |   | 
| − |   }
  |   | 
| − |   FastLED.show();
  |   | 
| − | }
  |   | 
| − | 
  |   | 
| − | void animation_attente()
  |   | 
| − | {
  |   | 
| − |     for(int i = 0; i < NUM_LEDS; i++)
  |   | 
| − |     {
  |   | 
| − |       leds[i].red = random(0,255);
  |   | 
| − |       leds[i].green = random(0,255);
  |   | 
| − |       leds[i].blue = random(0,255);
  |   | 
| − |     }
  |   | 
| − |     FastLED.show();
  |   | 
| − |   
  |   | 
| − | }
  |   | 
| − | void level_up()   // changement de niveau
  |   | 
| − | {
  |   | 
| − |   flash();  // animation
  |   | 
| − |   level++;  // incrémentation de la variable niveau
  |   | 
| − |   delay_level -= 4; // le jeu devient de plus en plus rapide
  |   | 
| − |   if (level >= NUM_OF_LEVELS)   // fin du jeu
  |   | 
| − |   {
  |   | 
| − |     reset_leds();
  |   | 
| − |     score_leds();   // affichage score
  |   | 
| − |     delay(3000);
  |   | 
| − |     reset_leds();
  |   | 
| − |     while (!digitalRead(PIN_BTN))   // on attend que l'utilisateur appuie sur un bonton
  |   | 
| − |     {
  |   | 
| − |       animation_attente();
  |   | 
| − |       delay(200);
  |   | 
| − |     }
  |   | 
| − |     while (digitalRead(PIN_BTN))  // on vérifie que le bouton n'est pas resté appuyé
  |   | 
| − |     {
  |   | 
| − |       delay(10);
  |   | 
| − |     }
  |   | 
| − |     // on réinitialise le jeu
  |   | 
| − |     level = 0;      
  |   | 
| − |     reset_leds();
  |   | 
| − |     score = 0;
  |   | 
| − |     delay_level = 30;
  |   | 
| − | 
  |   | 
| − | 
  |   | 
| − |   }
  |   | 
| − | 
  |   | 
| − | 
  |   | 
| − | }
  |   | 
| − | </syntaxhighlight>
  |   | 
| − | 
  |   | 
|   |  |   |  | 
|   | ==étapes de fabrication==  |   | ==étapes de fabrication==  | 
Titre de la fiche expérience :
description
Ce projet fonction grâce à une carte Arduino, des LEDs et un bouton. 
Une lumière traverse le ruban de gauche à droite et lorsqu'elle est au milieu, il faut appuyer sur le bouton au bon moment pour gagner.
réalisé par :
-Arnaud Genty
-Maxime Bintein
-Tristan Le Coz
Introduction
éventuelle vidéo
Liste des composants
-  Bouton poussoir style Arcade
 
-  Arduino nano
 
-  2 rubans de LED adressable (85 LEDs pour être exacte) 
 
-  Carton
 
-  Câbles mini-USB
 
-  Câbles
 
Outils
-  Cutter
 
-  Marqueur noir
 
-  Pistolet à colle
 
-  Scotch
 
-  Fer à souder
 
-  Bibliothèque Arduino FastLed 
 
 https://fastled.io/
fichiers à joindre
code, ficher d'impression 3D, de découpe laser ou vinyle, ...
étapes de fabrication
étape 1: câbler et souder
câbler les fils entre les leds, la carte arduino et le bouton puis souder les fils si nécessaire
étape 2: le support
réaliser le support en coupant et collant les cartons
étape ...
troubleshouting
quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?
Sources et documentation complémentaire
ne pas modifier sous cette ligne