ENIB 2023 : Swap Colors
Révision datée du 26 janvier 2023 à 15:37 par Akaryne (discussion | contributions)
Sommaire
photo de l'équipe
Que fait ce projet ?
Nous vous présentons un "Simon says", sur le principe du jeu "Jacques a dit" en français. Il faudra répéter le paterne crée aléatoirement par le jeu de 1 couleur à 7 couleurs en appuyant sur les boutons dans le bonne ordre.
Liste des composants
- Carte Ardiono MEGA
- 9 led RGB
- 9 résistances de 10k
- 9 boutons d'arcades
- Câbles
- Bois
Étape de construction
Cette partie explique les étapes de constructions de ce jeu.
Construire/découper/souder
Dans un premier temps il faudra tester les leds une par une, ainsi que les boutons pour éviter les mauvaises surprises.
On découpe les contours pour créer la boîte
On soude tous les boutons, avec l'alimentation communes à tous
On branche tous les câbles.
Code
const int BUZZER = A8; const int lenBeforeCrash = 999; int gameState = 0; struct RGB { byte r,g,b; }; RGB usedColors[] = { {0,0,255}, {0,255,0}, {0,255,255}, {255,0,0}, {255,0,255}, {255,255,0}, {200,200,200}, {0,200,200}, {200,0,200} }; int simonList[lenBeforeCrash]; int buttonToCode[] = {24,25,26,27,28,29,30, 31};//, //32}; int frequencyList[] = { 262, 294, 330, 349, 392, 440, 494, 523, 587 }; void setup() { Serial.begin(115200); pinMode(A0, OUTPUT); pinMode(A1, OUTPUT); pinMode(A2, OUTPUT); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(31, INPUT); //pinMode(32, INPUT); pinMode(24, INPUT); pinMode(25, INPUT); pinMode(26, INPUT); pinMode(27, INPUT); pinMode(28, INPUT); pinMode(29, INPUT); pinMode(30, INPUT); digitalWrite(A0, 255); digitalWrite(A1, 255); digitalWrite(A2, 255); } void shutdownAll() { digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); } void showLED(int n, RGB color) { shutdownAll(); digitalWrite(n, HIGH); analogWrite(A0, 255-color.r); analogWrite(A1, 255-color.g); analogWrite(A2, 255-color.b); } int getRandomColor() { int ran = (int) random(9); return ran; } void shouldIRestart() { for (int i=0; i<((sizeof buttonToCode)/(sizeof buttonToCode[0])); i++) { int code = buttonToCode[i]; if (digitalRead(code)==1) { Serial.println("press : "); Serial.println(code); gameState=1; shutdownAll(); for (int i=0; i<lenBeforeCrash; ++i) { simonList[i] = -1; } RGB loadingColor = {255,255,255}; int loadingTime=1000; for (int i=2; i<11; ++i) { long t = millis(); while ((millis()-t) < (loadingTime/9)) { for (int j=2; j<=i;j++) { showLED(j, loadingColor); delay(1); }; }; }; shutdownAll(); delay(1000); break; }; } } void waitingLoop() { RGB startColor = {255,255,0}; for (int i=2; i<11; ++i) { showLED(i, startColor); delay(1); }; shouldIRestart(); //bool anyButton=digitalRead(22)|digitalRead(23)|digitalRead(24)|digitalRead(25)|digitalRead(26)|digitalRead(27)|digitalRead(28)|digitalRead(29)|digitalRead(30); } void gameLoop() { int i=0; for (; i<lenBeforeCrash; ++i) { if (simonList[i]!=-1) { showLED(simonList[i], usedColors[simonList[i]]); delay(1000); shutdownAll(); delay(250); } else { break; } } simonList[i] = getRandomColor(); showLED(simonList[i], usedColors[simonList[i]]); delay(1000); for (int j=0;j<2;j++) { long t = millis(); while ((millis()-t)<250) { RGB white = {0,0,255}; for (int i=2; i<11; ++i) { showLED(i, white); delay(1); }; t++; } shutdownAll(); delay(250); } int passed = 0; while (simonList[passed]!=-1) { for (int i=0; i<((sizeof buttonToCode)/(sizeof buttonToCode[0])); i++) { int code = buttonToCode[i]; if (digitalRead(code)==1) { Serial.print("Pressed on"); Serial.println(code); if (i==simonList[passed]){ passed=passed+1; } else { gameState=2; } }; } } } void looseLoop() { RGB looseColor = {255,0,0}; for (int i=2; i<11; ++i) { showLED(i, looseColor); delay(50); }; for (int i=10; i>1; --i) { showLED(i, looseColor); delay(50); }; shouldIRestart(); } void loop() { if (gameState==0) { waitingLoop(); }; if (gameState==1) { gameLoop(); }; if (gameState==2) { looseLoop(); }; // put your main code here, to run repeatedly: }