ENIB 2023 : Swap Colors

De Les Fabriques du Ponant
Aller à : navigation, rechercher

photo de l'équipe

Groupe Swap Colors.jpg

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

Étape de construction

Cette partie explique les étapes de constructions de ce jeu.

Tester

Dans un premier temps il faudra tester les leds une par une, ainsi que les boutons pour éviter les mauvaises surprises.

Teste leds.jpg

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:
}

Catégories