ENIB 2022 - groupe A : Simon
Sommaire
photos
Nicolas Demailly effectuent son travail de Stakhanoviste afin de fournir un code d'une qualité exceptionnelle
Principe du jeu
"Apparu à la fin des années 70, de forme circulaire et qui comprenait 4 gros boutons lumineux de couleurs différentes => le jeu proposait une séquence lumineuse accompagnée de sons, que le joueur devait reproduire sans se tromper dans un délai donné." Le jeu du Simon trouve son origine dans le jeu pour enfant Jacques a dit, d'où il tire également son nom, puisque dans les pays anglophones ce n'est pas Jacques mais Simon (Simon Says…) qui donne les ordres. Le jeu, électronique, éclaire une des quatre couleurs et produit un son toujours associé à cette couleur. Le joueur doit alors appuyer sur la touche de la couleur qui vient de s'allumer dans un délai assez court. Le jeu répète la même couleur et le même son, puis ajoute au hasard une nouvelle couleur. Le joueur doit reproduire cette nouvelle séquence. Chaque fois que le joueur reproduit correctement la séquence, le jeu ajoute une nouvelle couleur.
Que fait ce projet ?
Notre projets propose de recréer un Simon avec les matériaux du bord et ceux disponible au fablab des fabriques du ponant.
Liste des composants
■ Arduino micro pro (x1) : shorturl.at/detAX
■ RGB Screen (x1) : shorturl.at/gtCU9
■ LED red, blue, green, yellow (x4) : shorturl.at/cABQ0
■ Resistors (220 Ohms) (x4) : https://geni.us/Ufa2s
■ Wire: https://geni.us/22AWGWire
■ Arcade Buttons (x4) : shorturl.at/howNQ
■ 5v buzzer (x1) : https://geni.us/5vBuzzer
Le Projet
Code
#include <ArduinoSTL.h> #include "Module.h" #include "Key.h" #include "Led.h" static std::vector<Module*> modules; std::vector<Module*> module::getModules() { return modules; } void module::addModule(Module* module) { modules.push_back(module); } Module::Module() { addModule(this); } const int buzzer = 10; int intro = -1; bool sound = false; int level = -1; int memory[128]; int score = 0; int decay = 0; int decayLed = 0; int play = -1; bool wait = true; int share = 0; bool first = true; int frenquencies[] = { 523, 587, 622, 554 }; void* listener = ([](Key* key, KeyEvent event, int id) { // ENTER if (!sound && (intro == -1)) { level = id; score = 0; play = 0; first = true; share = 0; key->getLed()->strobeFor(2000); intro = 5000; return; } if (intro > -1) { return; } if (event.getType() == 0) { if (sound) { tone(buzzer, frenquencies[id]); } key->getLed()->turnOn(); if (wait) { Serial.println(share); if (id == memory[share]) { Serial.println("ok"); } else { Serial.println("pas ok"); key->getLed()->strobeFor(3000); noTone(buzzer); sound = false; } } } else if (event.getType() == 2) { key->getLed()->turnOff(); noTone(buzzer); if (wait) { if (id == memory[share]) { if (share == score) { score++; share = 0; play = 0; first = true; wait = false; } else { share++; } } } } }); Led leds[] = { Led(5, Color::YELLOW), Led(14, Color::RED), Led(15, Color::BLUE), Led(16, Color::GREEN) }; Key keys[] = { Key(6, &leds[0], listener, 0), // YELLOW Key(7, &leds[1], listener, 1), // RED Key(8, &leds[2], listener, 2), // BLUE Key(9, &leds[3], listener, 3) // GREEN }; void setup() { pinMode(buzzer, OUTPUT); Serial.begin(9600); } void loop() { for (module::Module* &module : module::getModules()) module->work(); if (intro > 0) { if (intro == 2950) { decay = 2800; } if (intro == decay && intro > 1000) { leds[decayLed].toogle(); decayLed++; if (decayLed == 4) { decayLed = 0; } decay = decay - 50; } else if (intro <= 1000) { leds[0].turnOff(); leds[1].turnOff(); leds[2].turnOff(); leds[3].turnOff(); } intro--; if (intro == 0) { for (int i = 0; i < 128; i++) { memory[i] = random(0, 4); } play = 0; sound = true; wait = false; intro = -1; } } if (play >= 0) { if (!wait) { if (first) { if (play == (200 / (level + 1))) { first = false; play = 0; } } else { int toShare = memory[share]; if (play == 1) { //Serial.print("COUCOU : "); //Serial.println(toShare); keys[toShare].callEvent(KeyEvent(KeyEvent::PRESS, 0)); } if (play == (200 / (level + 1))) { keys[toShare].callEvent(KeyEvent(KeyEvent::RELEASE, 10)); } if (play == (400 / (level + 1))) { play = 0; if (share == score) { share = 0; wait = true; } else { share++; } } } } play++; } delay(1); } int AddressableModule::readAnalogValue() { this->value = analogRead(this->getAddress()); return this->value; } int AddressableModule::readDigitalValue() { this->value = digitalRead(this->getAddress()); return this->value; } void Led::setup() { pinMode(this->getAddress(), OUTPUT); } void Key::setup() { pinMode(this->getAddress(), INPUT_PULLUP); } void Led::work() { int strobe = this->getStrobe(); if (strobe > 0) { int a = (strobe / 100) % 2; if (a == 0) { this->turnOff(); } else if (a == 1) { this->turnOn(); } this->decreaseStrobe(); } digitalWrite(this->getAddress(), this->getStatus() ? HIGH : LOW); }