ENIB 2024 : Le Cyclone Breton
Titre de la fiche expérience :
Sommaire
description (résumé)
éventuelle photo de l'équipe
Introduction
éventuelle vidéo
outil et matériel
Outils :
- Fer à souder pour l’étain
- Scie
Matériel :
1 Arduino-Nano
1 Anneau WS2812 avec 60 LED
1 Encodeur rotatif avec bouton-poussoir
Gros bouton Arcade fait maison
Transistor à usage général NPN
Avertisseur sonore
2 Résistance 220 ohms
1 Résistance à trou traversant, 820 ohm
Batterie ??
Bobine d'étain
fichiers à joindre
code, ficher d'impression 3D, de découpe laser ou vinyle, ...
Code Arduino
1
2 #include "FastLED.h"
3 #define NUM_LEDS 60
4 #define DATA_PIN A0
5 #define SCORE_PIN 5
6 #define SCORE_LEDS 5
7 #define BRIGHTNESS 55
8 CRGB leds[NUM_LEDS];
9 CRGB sleds[NUM_LEDS];
10
11 bool reachedEnd = false;
12 byte gameState = 0;
13 //byte ledSpeed = 0;
14 int period = 1000;
15 unsigned long time_now = 0;
16 byte Position = 0;
17 byte level = 0;
18
19 const byte ledSpeed[6] = {50, 40, 30, 20, 14, 7};
20
21 //Debounce
22 bool findRandom = false;
23 byte spot = 0;
24
25 void setup() {
26 // put your setup code here, to run once:
27 FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
28 FastLED.addLeds<WS2812B, SCORE_PIN, GRB>(sleds, SCORE_LEDS);
29 pinMode(A3, INPUT_PULLUP);
30 Serial.begin(9600);
31 Serial.println("Reset");
32 }
33
34 void loop() {
35 // put your main code here, to run repeatedly:
36 FastLED.setBrightness(BRIGHTNESS );
37 if (gameState == 0) {
38 fill_rainbow(leds, NUM_LEDS, 0, 20); //2 = longer gradient strip
39 fill_rainbow(sleds, SCORE_LEDS, 0, 40); //2 = longer gradient strip
40
41 if (digitalRead(A3) == LOW) {
42 Position = 0;
43 findRandom = true;
44 delay(500);
45 for (byte i = 0; i < NUM_LEDS; i++) {
46 leds[i].setRGB(0, 0, 0);
47 delay(40);
48 FastLED.show();
49 int thisPitch = map (i, 60, 0, 100, 1500);
50 tone(9, thisPitch,120);
51 }
52 for (byte i = 0; i < SCORE_LEDS; i++) {
53 sleds[i].setRGB(0, 0, 0);
54 delay(100);
55 FastLED.show();
56 }
57 gameState = 1;
58 }
59 FastLED.show();
60 }
61 if (gameState == 1) {
62 period = ledSpeed[0];
63 if (millis() > time_now + period) {
64 time_now = millis();
65 if (findRandom) {
66 spot = random(56) + 3;
67 findRandom = false;
68 }
69 leds[spot - 1].setRGB(255, 140, 0);
70 leds[spot].setRGB(0, 255, 0);
71 leds[spot + 1].setRGB(255, 110, 0);
72 sleds[0].setRGB(0, 255, 0);
73 PlayGame(spot - 1, spot + 1);
74 }
75 if (digitalRead(A3) == LOW) {
76 delay(300);
77 findRandom = false;
78 if (Position > spot - 1 && Position < spot + 3) {
79 level = gameState;
80 gameState = 98;
81 } else {
82 gameState = 99;
83 }
84 }
85 }
86 if (gameState == 2) {
87 // period = 320;
88 period = ledSpeed[1];
89 if (millis() > time_now + period) {
90 time_now = millis();
91 if (findRandom) {
92 spot = random(56) + 3;
93 findRandom = false;
94 }
95 leds[spot - 1].setRGB(255, 190, 0);
96 leds[spot].setRGB(0, 255, 0);
97 leds[spot + 1].setRGB(255, 190, 0);
98 sleds[1].setRGB(255, 255, 0);
99 PlayGame(spot - 1, spot + 1);
100 }
101 if (digitalRead(A3) == LOW) {
102 delay(300);
103 if (spot - 1 && Position < spot + 3) {
104 level = gameState;
105 gameState = 98;
106 } else {
107 gameState = 99;
108 }
109 }
110 }
111 if (gameState == 3) {
112 period = ledSpeed[2];
113 if (millis() > time_now + period) {
114 time_now = millis();
115 if (findRandom) {
116 spot = random(56) + 3;
117 findRandom = false;
118 }
119 leds[spot].setRGB(0, 255, 0);
120 sleds[2].setRGB(255, 50, 0);
121 PlayGame(spot, spot);
122 }
123 if (digitalRead(A3) == LOW) {
124 delay(300);
125 if (Position == spot+1) {
126 level = gameState;
127 gameState = 98;
128 } else {
129 gameState = 99;
130 }
131 }
132 }
133 if (gameState == 4) {
134 period = ledSpeed[3];
135 if (millis() > time_now + period) {
136 time_now = millis();
137 if (findRandom) {
138 spot = random(56) + 3;
139 findRandom = false;
140 }
141 leds[spot].setRGB(0, 255, 0);
142 sleds[3].setRGB(255, 0, 0);
143 PlayGame(spot, spot);
144 }
145 if (digitalRead(A3) == LOW) {
146 delay(300);
147 if (Position == spot+1) {
148 level = gameState;
149 gameState = 98;
150 } else {
151 gameState = 99;
152 }
153 }
154 }
155
156 if (gameState == 5) {
157 period = ledSpeed[4];
158 if (millis() > time_now + period) {
159 time_now = millis();
160 if (findRandom) {
161 spot = random(56) + 3;
162 findRandom = false;
163 }
164 leds[spot].setRGB(0, 255, 0);
165 sleds[4].setRGB(0, 150, 255);
166 PlayGame(spot , spot);
167 }
168 if (digitalRead(A3) == LOW) {
169 delay(300);
170 if (Position == spot+1) {
171 level = gameState;
172 gameState = 98;
173 } else {
174 gameState = 99;
175 }
176 }
177 }
178
179 /*if (gameState == 6) {
180 period = ledSpeed[5];
181 if (millis() > time_now + period) {
182 time_now = millis();
183 if (findRandom) {
184 spot = random(56) + 3;
185 findRandom = false;
186 }
187 leds[spot].setRGB(0, 255, 0);
188 sleds[5].setRGB(0, 150, 255);
189 PlayGame(spot , spot);
190 }
191 if (digitalRead(A3) == LOW) {
192 delay(300);
193 if (Position == spot+1) {
194 level = gameState;
195 gameState = 98;
196 } else {
197 gameState = 99;
198 }
199 }
200 }*/
201
202 if (gameState == 98) {
203 winner();
204 }
205 if (gameState == 99) {
206 loser();
207 }
208 }
209 void PlayGame(byte bound1, byte bound2) {
210 leds[Position].setRGB(255, 0, 0);
211 if (Position < bound1 + 1 || Position > bound2 + 1) {
212 leds[Position - 1].setRGB(0, 0, 0);
213 }
214 FastLED.show();
215 Position++;
216 if (Position >= NUM_LEDS) {
217 leds[Position - 1].setRGB(0, 0, 0);
218 Position = 0;
219 }
220 }
221
222 void winner() {
223 for (byte i = 0; i < 3; i++) {
224 for (byte j = 0; j < NUM_LEDS; j++) {
225 leds[j].setRGB(0, 255, 0);
226 //tone(9, 1000, 250);
227 //mario win
228 for (byte k = 0; k < 4; k++){
229 tone(9, 659, 250);}
230 tone(9, 659, 750);
231 tone(9, 523, 750);
232 tone(9, 587, 750);
233 tone(9, 659, 250);
234 tone(9, 587, 250);
235 tone(9, 659, 250);
236 }
237 FastLED.show();
238 delay(500);
239 clearLEDS();
240 FastLED.show();
241 delay(500);
242
243 }
244 findRandom = true;
245 Position = 0;
246
247 gameState = level + 1;
248 if (gameState > 5) {
249 gameState = 0;
250 }
251 }
252 void loser() {
253 for (byte i = 0; i < 3; i++) {
254 for (byte j = 0; j < NUM_LEDS; j++) {
255 leds[j].setRGB(255, 0, 0);
256 //tone(9, 200, 250);
257 //imperial march lose
258 for (byte k = 0; k < 4; k++){
259 tone(9, 440, 500);}
260
261 tone(9, 349, 350);
262 tone(9, 523, 150);
263 tone(9, 440, 500);
264 tone(9, 349, 350);
265 tone(9, 523, 150);
266 tone(9, 440, 1000);
267 tone(9, 659, 659);
268 tone(9, 659, 659);
269 tone(9, 659, 659);
270 tone(9, 698, 698);
271 tone(9, 523, 523);
272 tone(9, 415, 415);
273 tone(9, 349, 349);
274 tone(9, 523, 523);
275 tone(9, 440, 440);
276
277 }
278 FastLED.show();
279 delay(500);
280 clearLEDS();
281 FastLED.show();
282 delay(500);
283 }
284 gameState = 0;
285 }
286 void clearLEDS() {
287 for (byte i = 0; i < NUM_LEDS; i++) {
288 leds[i].setRGB(0, 0, 0);
289 }
290 }
291 void winAll(){
292
293 }
étapes de fabrication
indiquer autant d'étape que nécessaire, chacune illustrée par des images (phot, dessins, ...)
Étape 1 : Code
- Télécharger le dossier zip FastLed au lien suivant : https://www.hackster.io/focalintent/fastled-f872e5
- Démarrer le logiciel Arduino
- Copier dans le logiciel le programme ci-dessus, l'enregistrer dans le dossier FastLED-master/src puis aller dans « édition » et cliquer sur « téléversement »
Étape 2 : Montage
Étape 3 : Résultat
Si tout se passe bien, sur le cercle de LEDs, il y aura une LED verte fixe qui est l’objectif, une zone jaune qui est la zone acceptable de réussite (qui se réduira selon les niveaux) et une LED rouge qui parcourt tout le cercle.
Le joueur aura à sa disposition un bouton sur lequel il devra appuyer quand il estime que la LED rouge est au même niveau que la LED verte ou dans la zone acceptable.
S’il réussit, le joueur passera au niveau supérieur et une nouvelle LED sur un bandeau représentant les niveaux s’allumera.
Enfin, s'il passe tous les niveaux, une musique de victoire se lancera et de même en cas de défaite.
Les problèmes possibles
quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?