ENIB 2024 : CatchTheJackpot
Révision datée du 30 janvier 2024 à 14:35 par Arnaud... (discussion | contributions) (→étape 2: le support)
Titre de la fiche expérience :
Sommaire
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, ...
Code :
1 #include "FastLED.h" //bibliothèque pour controler le ruban led
2 #define NUM_LEDS 86
3 #define NUM_OF_LEDS_BY_LEVEL 17 // nombre de leds par niveau
4 #define NUM_OF_LEVELS 5 // nombre de niveaux
5 #define PIN_BTN 3 // Entree du bouton
6 #define PIN_LEDS 2 // Sortie du ruban led
7
8 // Dans ce programme nous avons utilisé presque intégralement des variables globales
9
10 CRGB leds[NUM_LEDS];
11 int level = 0; // niveau auquel le joueur est
12 int delay_level = 30; // délai qui permet de controler la vitesse de déplacement de la led
13 auto color = CRGB::Purple; // couleur de la led qui se déplace
14 int score = 0; // socre du joueur
15 const double coef[] = {1, 1.4, 1.7, 1.9, 2, 2.2}; // coefficient multiplicateur de point par niveau
16 int last_point = 0; // sauvegarde de la derniere led allumée pour la rallumer après flash()
17
18
19 // Déclarations de fonctions
20 int compute_score(int score_of_level); // calcul du score par niveau
21 int up(); // deplacement led
22 int down(); // deplacement led dans l'autre sense
23 void level_up(); // passage de niveau
24 void flash(); // animation de victoire d'un niveau
25
26
27 void setup() {
28 FastLED.addLeds<NEOPIXEL, 2>(leds, NUM_LEDS); // setup du ruban de led sur la sortie PIN_LEDS => 2
29 pinMode(PIN_BTN, INPUT); // setup du bouton dur l'entrée PIN_BTN => 3
30 Serial.begin(9600); // setup moniteur série pour debug
31 }
32
33 void loop() {
34
35 int score_of_level;
36 if (score_of_level = up()) // led avance dans un sense
37 {
38 score += compute_score(score_of_level); // ajout score du niveau
39 level_up();
40 }
41 else if (score_of_level = down()) // led avance dans l'autre sense
42 {
43 score += compute_score(score_of_level); // ajout score du niveau
44 level_up();
45 }
46
47
48 }
49
50 int compute_score(int score_of_level)
51 {
52 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;
53 // 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
54 }
55
56 int up()
57 {
58 for (int i = NUM_OF_LEDS_BY_LEVEL * level; i <= (NUM_OF_LEDS_BY_LEVEL * level + NUM_OF_LEDS_BY_LEVEL - 1); i++)
59 {
60 if (digitalRead(PIN_BTN)) // appuie sur le bouton
61 {
62 while (digitalRead(PIN_BTN)) // blocage du bouton tant que celui-ci n'a pas été relaché
63 {
64 delay(2);
65 }
66 last_point = i-1; // on concerve la valeur de la led choisie pour la réafficher après le flash
67 return i - 1; // renvoie la position de la led au moment de l'appuie sur le bouton
68 }
69 leds[i - 1] = CRGB::Black;
70 delay(3);
71
72 leds[level * NUM_OF_LEDS_BY_LEVEL + NUM_OF_LEDS_BY_LEVEL / 2] = CRGB::White;
73 leds[i] = color;
74
75 FastLED.show();
76 delay(delay_level);
77 }
78 leds[NUM_OF_LEDS_BY_LEVEL * level + 20] = CRGB::Black;
79 FastLED.show();
80 delay(delay_level);
81 return 0;
82
83 }
84
85 int down()
86 {
87
88 for (int i = NUM_OF_LEDS_BY_LEVEL * level + NUM_OF_LEDS_BY_LEVEL - 1; i >= NUM_OF_LEDS_BY_LEVEL * level ; i--)
89 {
90 if (digitalRead(PIN_BTN))
91 {
92 while (digitalRead(PIN_BTN))
93 {
94 delay(2);
95 }
96 last_point = i+1;
97 return i + 1; // renvoie la position de la led au moment de l'appuie sur le bouton
98 }
99 leds[i + 1] = CRGB::Black;
100 delay(3);
101
102 leds[level * NUM_OF_LEDS_BY_LEVEL + NUM_OF_LEDS_BY_LEVEL / 2] = CRGB::White;
103 leds[i] = color;
104
105 FastLED.show();
106 delay(delay_level);
107 }
108 leds[NUM_OF_LEDS_BY_LEVEL] = CRGB::Black;
109 FastLED.show();
110 delay(delay_level);
111 return 0;
112
113
114 }
115 void flash() // fonction de décoration qui fait clignoter les leds en blanc avant le passage de niveau
116 {
117 for (int cpt = 0; cpt < 4; cpt++)
118 {
119 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
120 {
121 leds[i] = CRGB::White;
122 }
123 FastLED.show();
124
125 delay(100);
126 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
127 {
128 leds[i] = CRGB::Black;
129 }
130 FastLED.show();
131 delay(100);
132 }
133 leds[last_point] = CRGB::Red;
134 }
135
136 void score_leds() // affichage du score avec les leds
137 {
138 for (int i = 0; i < score; i++)
139 {
140 leds[i] = CRGB::Red;
141
142 FastLED.show();
143 delay(10);
144 }
145 }
146
147 void reset_leds() // on éteint toutes les leds
148 {
149 for (int i = 0; i < NUM_LEDS; i++)
150 {
151 leds[i] = CRGB::Black;
152
153 }
154 FastLED.show();
155 }
156
157 void animation_attente()
158 {
159 for(int i = 0; i < NUM_LEDS; i++)
160 {
161 leds[i].red = random(0,255);
162 leds[i].green = random(0,255);
163 leds[i].blue = random(0,255);
164 }
165 FastLED.show();
166
167 }
168 void level_up() // changement de niveau
169 {
170 flash(); // animation
171 level++; // incrémentation de la variable niveau
172 delay_level -= 4; // le jeu devient de plus en plus rapide
173 if (level >= NUM_OF_LEVELS) // fin du jeu
174 {
175 reset_leds();
176 score_leds(); // affichage score
177 delay(3000);
178 reset_leds();
179 while (!digitalRead(PIN_BTN)) // on attend que l'utilisateur appuie sur un bonton
180 {
181 animation_attente();
182 delay(200);
183 }
184 while (digitalRead(PIN_BTN)) // on vérifie que le bouton n'est pas resté appuyé
185 {
186 delay(10);
187 }
188 // on réinitialise le jeu
189 level = 0;
190 reset_leds();
191 score = 0;
192 delay_level = 30;
193
194
195 }
196
197
198 }
é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 ?
1er problème : le programme ne marchait pas car la LED était montée à l'envers