Simon Says Game con Arduino e LED

Gioco a microcontrollore Arduino con pulsanti e LED “Ripeti la sequenza” è un altro mini-progetto con un set minimo di componenti necessari. Per assemblare il circuito elettrico sono sufficienti una breadboard, pulsanti e LED con resistenze. Premendo i pulsanti, è necessario ripetere la sequenza di accensione dei LED collegati ad Arduino. Ad ogni nuovo livello, la velocità del “Simon Says Game Arduino” aumenterà gradualmente.




Per questa attività sono necessari:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • LED e resistenza
  • pulsanti
  • buzzer
  • breadboard
  • cavi di collegamento

Arduino gioco con LED “Simon Says Game”

Arduino gioco con LED Ripeti la sequenza
Arduino gioco con LED “Ripeti la sequenza”

I LED sono collegati alla scheda Arduino Uno in serie dalla porta digitale 2 alla 6, mentre i pulsanti sono collegati agli ingressi analogici da A0 ad A4. Le porte di connessione dei pulsanti e dei LED possono essere modificate specificandole nello sketch. Nel programma vengono utilizzate solo 10 combinazioni nell’array char* kod[]. È possibile aggiungere nuove combinazioni all’array, ma ogni LED deve essere acceso una sola volta.

Programma Arduino per gioco con LED “Ripeti la sequenza”




// pin del buzzer
#define buzzer 11
// pin del LED
int led[] = { 2, 3, 4, 5, 6 };
// pin dei pulsanti
int but[] = { A0, A1, A2, A3, A4 };
// opzioni di combinazione (è possibile aggiungerne di proprie)
char* kod[] = { "01324", "40231", "02413", "03241", "40312",
             "14320", "13402", "12304", "41203", "10423"
             };
 
int del = 1000;
int w = -1;
byte level = 1;
byte b1, b2, b3, b4, b5;
String KOD, OTV, A;

byte num_led = sizeof(led) / sizeof(int*);
byte num_but = sizeof(but) / sizeof(int*);
byte num_cod = sizeof(kod) / sizeof(char*);
byte len = strlen(kod[0]);

boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button3WasUp = true;
boolean button4WasUp = true;
boolean button5WasUp = true;

void setup() {
  pinMode(buzzer, OUTPUT);
  // regolare i pin del LED
  for (byte i = 0; i <= num_led; i++) {
    pinMode(led[i], OUTPUT);
  }
  // regolare i pin dei pulsanti
  for (byte i = 0; i <= num_but; i++) {
    pinMode(but[i], INPUT_PULLUP);
  }
  Serial.begin(9600);
  Serial.println("LEVEL - " + String(level));
  Serial.println("");
}

void loop() {
 
  // scegliere una delle combinazioni
  while (w == -1) {
    int  x = random(0, num_cod - 1);
    KOD = {kod[x]};
    b1 = 0; b2 = 0; b3 = 0; b4 = 0; b5 = 0;
    w = 0;
  }
 
  // accendere i LED in base alla combinazione
  while (w <= len - 1) {
    A = KOD[w];
    int a = A.toInt();
    digitalWrite(led[a], HIGH);
    tone(buzzer, 5 * led[a]);
    delay(10);
    noTone(buzzer);
    delay(del);
    digitalWrite(led[a], LOW);
    w++;
  }

  // attendere che siano premuti tutti i pulsanti
  while (w >= len - 1 and w <= len + len) {
    boolean button1IsUp = digitalRead(but[0]);
    boolean button2IsUp = digitalRead(but[1]);
    boolean button3IsUp = digitalRead(but[2]);
    boolean button4IsUp = digitalRead(but[3]);
    boolean button5IsUp = digitalRead(but[4]);

    if (b1 == 0 and button1WasUp and !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(but[0]);
      if (!button1IsUp) {
        tone(buzzer, 5 * led[0]);
        delay(10);
        noTone(buzzer);
        OTV = OTV + "0";
        digitalWrite(led[0], HIGH);
        b1 = 1;
        w++;
      }
    }
    button1WasUp = button1IsUp;

    if (b2 == 0 and button2WasUp and !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(but[1]);
      if (!button2IsUp) {
        tone(buzzer, 5 * led[1]);
        delay(10);
        noTone(buzzer);
        OTV = OTV + "1";
        digitalWrite(led[1], HIGH);
        b2 = 1;
        w++;
      }
    }
    button2WasUp = button2IsUp;

    if (b3 == 0 and button3WasUp and !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(but[2]);
      if (!button3IsUp) {
        tone(buzzer, 5 * led[2]);
        delay(10);
        noTone(buzzer);
        OTV = OTV + "2";
        digitalWrite(led[2], HIGH);
        b3 = 1;
        w++;
      }
    }
    button3WasUp = button3IsUp;

    if (b4 == 0 and button4WasUp and !button4IsUp) {
      delay(10);
      button4IsUp = digitalRead(but[3]);
      tone(buzzer, 5 * led[3]);
      delay(10);
      noTone(buzzer);
      if (!button4IsUp) {
        OTV = OTV + "3";
        digitalWrite(led[3], HIGH);
        b4 = 1;
        w++;
      }
    }
    button4WasUp = button4IsUp;

    if (b5 == 0 and button5WasUp and !button5IsUp) {
      delay(10);
      button5IsUp = digitalRead(but[4]);
      tone(buzzer, 5 * led[4]);
      delay(10);
      noTone(buzzer);
      if (!button5IsUp) {
        OTV = OTV + "4";
        digitalWrite(led[4], HIGH);
        b5 = 1;
        w++;
      }
    }
    button5WasUp = button5IsUp;

    // se la combinazione corrisponde, inizia un nuovo livello
    if (w == len + len and OTV == KOD) {
      Serial.println("");
      Serial.println("OK");
      Serial.println("");
      level++;
      Serial.println("LEVEL - " + String(level));
      del = del - 100;
      if (del < 10) { del = 100; }
      delay(1000);
      for (byte i = 0; i <= num_led; i++) {
        digitalWrite(led[i], LOW);
      }
      delay(2000);
      KOD = "";
      OTV = "";
      w = -1;
    }
 
    // se la combinazione non è corretta, definirne una nuova
    if (w == len + len and OTV != KOD) {
      Serial.println("");
      Serial.println("NO");
      Serial.println("");
      tone(buzzer, 100);
      delay(1000);
      noTone(buzzer);
      Serial.println("LEVEL - " + String(level));
      for (byte i = 0; i <= num_led; i++) {
        digitalWrite(led[i], LOW);
      }
      delay(2000);
      KOD = "";
      OTV = "";
      w = -1;
    }

  }
}

Spiegazione del codice per gioco Arduino con LED “Ripeti la sequenza”:



  1. dopo il livello 10 la velocità di accensione dei LED non aumenta;
  2. le porte per il collegamento dei pulsanti e dei LED possono essere cambiate nel programma senza modificare i comandi digitalRead e digitalWrite nello sketch.

Conclusione. Il livello attuale del gioco viene visualizzato sul monitor della porta IDE di Arduino. Se la sequenza viene inserita in modo errato, viene attivato un segnale sonoro sul piezodinamico (buzzer). Un altro progetto di gioco Aduino con pulsanti e LED può essere trovato qui – Guess the Code Game. Se avete domande sul programma o sulla costruzione del circuito per il gioco “Ripeti la sequenza con Arduino”, lasciatele nei commenti.

5/5 - (1 vote)


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.