ENIB 2022 - groupe A : Simon

De Les Fabriques du Ponant
Révision datée du 14 janvier 2022 à 14:31 par HelloWorld (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher

photos

Nicolacodesimon.jpg
Img simon large.jpg

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

Imagemachinesimon.jpg
Ledallumésionm.jpg
Schema elec simon.png

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);
}

photos du projet

Img simon large.jpg
Img simon proche.jpg

Catégories