ENIB 2024 : Cyclone foireux
Révision datée du 30 janvier 2024 à 14:58 par Kilian29 (discussion | contributions) (→Sources et documentation complémentaire)
Sommaire
Description
Vous avez un anneau LED avec un point LED en cours d'exécution et un marqueur de cible LED. Le point de joueur traverse le ring à une vitesse définie et vous devez essayer d'appuyer sur un bouton dès que le point de joueur est congruent avec le marqueur cible.
Membre du groupe :
Vidéo d'exemple
Insérer vidéo jeu
Outils et matériel nécessaires
Matériel nécessaire à la fabrication
- 1
- 2
- 3
- 4
- 5
- 6
Outils aidant à la fabrication
- Fer à souder
Fichiers ressources
code, ficher d'impression 3D, de découpe laser ou vinyle, ...
Code Arduino
1
2 //Code cyclone
3 #include "FastLED.h"
4 #define NUM_LEDS 60
5 #define DATA_PIN A0
6 #define SCORE_PIN 6
7 #define SCORE_LEDS 6
8 #define BRIGHTNESS 55
9 CRGB leds[NUM_LEDS];
10 CRGB sleds[NUM_LEDS];
11
12 bool reachedEnd = false;
13 byte gameState = 0;
14 //byte ledSpeed = 0;
15 int period = 1000;
16 unsigned long time_now = 0;
17 byte Position = 0;
18 byte level = 0;
19
20 const byte ledSpeed[6] = {50, 40, 30, 20, 14, 7};
21
22 //Debounce
23 bool findRandom = false;
24 byte spot = 0;
25
26 void setup() {
27 // put your setup code here, to run once:
28 FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
29 FastLED.addLeds<WS2812B, SCORE_PIN, GRB>(sleds, SCORE_LEDS);
30 pinMode(A3, INPUT_PULLUP);
31 Serial.begin(9600);
32 Serial.println("Reset");
33 }
34
35 void loop() {
36 // put your main code here, to run repeatedly:
37 FastLED.setBrightness(BRIGHTNESS );
38 if (gameState == 0) {
39 fill_rainbow(leds, NUM_LEDS, 0, 20); //2 = longer gradient strip
40 fill_rainbow(sleds, SCORE_LEDS, 0, 40); //2 = longer gradient strip
41
42 if (digitalRead(A3) == LOW) {
43 Position = 0;
44 findRandom = true;
45 delay(500);
46 for (byte i = 0; i < NUM_LEDS; i++) {
47 leds[i].setRGB(0, 0, 0);
48 delay(40);
49 FastLED.show();
50 int thisPitch = map (i, 60, 0, 100, 1500);
51 tone(9, thisPitch,120);
52 }
53 for (byte i = 0; i < SCORE_LEDS; i++) {
54 sleds[i].setRGB(0, 0, 0);
55 delay(100);
56 FastLED.show();
57 }
58 gameState = 1;
59 }
60 FastLED.show();
61 }
62 if (gameState == 1) {
63 period = ledSpeed[0];
64 if (millis() > time_now + period) {
65 time_now = millis();
66 if (findRandom) {
67 spot = random(56) + 3;
68 findRandom = false;
69 }
70 leds[spot - 1].setRGB(255, 140, 0);
71 leds[spot].setRGB(0, 255, 0);
72 leds[spot + 1].setRGB(255, 110, 0);
73 sleds[0].setRGB(0, 255, 0);
74 PlayGame(spot - 1, spot + 1);
75 }
76 if (digitalRead(A3) == LOW) {
77 delay(300);
78 findRandom = false;
79 if (Position > spot - 1 && Position < spot + 3) {
80 level = gameState;
81 gameState = 98;
82 } else {
83 gameState = 99;
84 }
85 }
86 }
87 if (gameState == 2) {
88 // period = 320;
89 period = ledSpeed[1];
90 if (millis() > time_now + period) {
91 time_now = millis();
92 if (findRandom) {
93 spot = random(56) + 3;
94 findRandom = false;
95 }
96 leds[spot - 1].setRGB(255, 190, 0);
97 leds[spot].setRGB(0, 255, 0);
98 leds[spot + 1].setRGB(255, 190, 0);
99 sleds[1].setRGB(255, 255, 0);
100 PlayGame(spot - 1, spot + 1);
101 }
102 if (digitalRead(A3) == LOW) {
103 delay(300);
104 if (spot - 1 && Position < spot + 3) {
105 level = gameState;
106 gameState = 98;
107 } else {
108 gameState = 99;
109 }
110 }
111 }
112 if (gameState == 3) {
113 period = ledSpeed[2];
114 if (millis() > time_now + period) {
115 time_now = millis();
116 if (findRandom) {
117 spot = random(56) + 3;
118 findRandom = false;
119 }
120 leds[spot].setRGB(0, 255, 0);
121 sleds[2].setRGB(255, 50, 0);
122 PlayGame(spot, spot);
123 }
124 if (digitalRead(A3) == LOW) {
125 delay(300);
126 if (Position == spot+1) {
127 level = gameState;
128 gameState = 98;
129 } else {
130 gameState = 99;
131 }
132 }
133 }
134 if (gameState == 4) {
135 period = ledSpeed[3];
136 if (millis() > time_now + period) {
137 time_now = millis();
138 if (findRandom) {
139 spot = random(56) + 3;
140 findRandom = false;
141 }
142 leds[spot].setRGB(0, 255, 0);
143 sleds[3].setRGB(255, 0, 0);
144 PlayGame(spot, spot);
145 }
146 if (digitalRead(A3) == LOW) {
147 delay(300);
148 if (Position == spot+1) {
149 level = gameState;
150 gameState = 98;
151 } else {
152 gameState = 99;
153 }
154 }
155 }
156
157 if (gameState == 5) {
158 period = ledSpeed[4];
159 if (millis() > time_now + period) {
160 time_now = millis();
161 if (findRandom) {
162 spot = random(56) + 3;
163 findRandom = false;
164 }
165 leds[spot].setRGB(0, 255, 0);
166 sleds[4].setRGB(0, 50, 255);
167 PlayGame(spot , spot);
168 }
169 if (digitalRead(A3) == LOW) {
170 delay(300);
171 if (Position == spot+1) {
172 level = gameState;
173 gameState = 98;
174 } else {
175 gameState = 99;
176 }
177 }
178 }
179
180 if (gameState == 6) {
181 period = ledSpeed[5];
182 if (millis() > time_now + period) {
183 time_now = millis();
184 if (findRandom) {
185 spot = random(56) + 3;
186 findRandom = false;
187 }
188 leds[spot].setRGB(0, 255, 0);
189 sleds[5].setRGB(0, 150, 255);
190 PlayGame(spot , spot);
191 }
192 if (digitalRead(A3) == LOW) {
193 delay(300);
194 if (Position == spot+1) {
195 level = gameState;
196 gameState = 98;
197 } else {
198 gameState = 99;
199 }
200 }
201 }
202
203 if (gameState == 98) {
204 winner();
205 }
206 if (gameState == 99) {
207 loser();
208 }
209 }
210 void PlayGame(byte bound1, byte bound2) {
211 leds[Position].setRGB(255, 0, 0);
212 if (Position < bound1 + 1 || Position > bound2 + 1) {
213 leds[Position - 1].setRGB(0, 0, 0);
214 }
215 FastLED.show();
216 Position++;
217 if (Position >= NUM_LEDS) {
218 leds[Position - 1].setRGB(0, 0, 0);
219 Position = 0;
220 }
221 }
222
223 void winner() {
224 for (byte i = 0; i < 3; i++) {
225 for (byte j = 0; j < NUM_LEDS; j++) {
226 leds[j].setRGB(0, 255, 0);
227 tone(9, 1000, 250);
228 }
229 FastLED.show();
230 delay(500);
231 clearLEDS();
232 FastLED.show();
233 delay(500);
234
235 }
236 findRandom = true;
237 Position = 0;
238
239 gameState = level + 1;
240 if (gameState > 6) {
241 gameState = 0;
242 }
243 }
244 void loser() {
245 for (byte i = 0; i < 3; i++) {
246 for (byte j = 0; j < NUM_LEDS; j++) {
247 leds[j].setRGB(255, 0, 0);
248 tone(9, 200, 250);
249 }
250 FastLED.show();
251 delay(500);
252 clearLEDS();
253 FastLED.show();
254 delay(500);
255 }
256 gameState = 0;
257 }
258 void clearLEDS() {
259 for (byte i = 0; i < NUM_LEDS; i++) {
260 leds[i].setRGB(0, 0, 0);
261 }
262 }
263 void winAll(){
264
265 }
étapes de fabrication
indiquer autant d'étape que nécessaire, chacune illustrée par des images (phot, dessins, ...)
étape 1
étape 2
étape ...
Difficultés
quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?