Bouw een Arduino Geheugenspel (Simon Kloon) – Stap-voor-stap Handleiding
Onderdelen en Benodigdheden
| Arduino UNO | 1 |
| 330 ohm weerstanden (SparkFun) | 4 |
| 10k ohm weerstanden (SparkFun) | 4 |
| Geassorteerde LED's (SparkFun) | 4 (verschillende kleuren) |
| Mini speaker (SparkFun) | 1 (optioneel) |
| Breadboard (volledige grootte) | 1 |
| Draadjes (generic) | 1 |
Apps en Online Diensten
- Arduino IDE
Over dit Project
Herinner je je het spel "Simon"? Veel mensen mijn leeftijd (geboren in de jaren '70) hebben er veel tijd aan verspild. Het spel was simpel: 4 knoppen met verschillende kleuren die in een reeks oplichten, en je moest de reeks herhalen. Elke keer dat je het goed had, kreeg je de reeks weer met een extra kleur aan het einde.
Ik kreeg er een voor Kerstmis lang geleden, maar door verhuisde ik vaker en verdween het in een doos die nooit uitgepakt werd.
Als "volwassene" ontdekte ik de freude van Arduino en kreeg de kans mijn lang verloren tijdverdrijf tot leven te wekken.
Deze tutorial laat zien hoe je een vergelijkbaar spel maakt met een Arduino Uno, enkele LED's, weerstanden en een eenvoudig schema.
Het programma kan voor beginners wat complex zijn, dus ik probeer in de code uit te leggen wat er gebeurt en hoe.
De simpelste manier om dit spel draaiend te krijgen:
- Sluit het schema exact aan zoals getoond. De kleur van de draden is niet relevant.
- Plak de broncode in je favoriete Arduino-editor en upload naar het bord.
- Speel het spel!
Het spel start na ~3 seconden met 5 langzame knipperingen van alle LED's.

Als één of meer LED's niet knipperen, check de bedrading. Op mijn bord zitten de kleine knoppen niet altijd goed en springen eruit.
Als de bedrading klopt, wissel een werkende LED met een niet-werkende om te zien of het de bedrading of de LED is.
Na de 5 knipperingen brandt één LED. Welke is een verrassing :) Druk op de knop voor die LED. Die LED brandt weer, gevolgd door een nieuwe. Druk de juiste knoppen in volgorde... Je ziet waar dit naartoe gaat.

Vergelijkend snel zie je ze allemaal snel knipperen. Dat betekent: je hebt verloren! :D
De laatste reeks speelt af zodat je je punten kunt tellen, gevolgd door de 5 langzame knipperingen voor een nieuw spel.
Je hebt 2 seconden per knop.
Veel plezier!
Wil je het moeilijker maken? Verander de bovenste regel in de code:
#define PLAYER_WAIT_TIME 2000
Of voeg nog een LED toe. Reproduceer dit deel van het schema:

De oranje draad gaat naar een ongebruikte pin op je Arduino (vermijd 0 en 1).
Wijzig in de code:
byte noPins = 4;
byte pins[] = {2, 13, 10, 8};
Als je een LED op pin 6 toevoegt:
byte noPins = 5;
byte pins[] = {2, 13, 10, 8, 6};
Tip voor Arduino-code:
void setup() {
delay(3000);
Serial.begin(9600);
Reset();
}
Zet een korte delay als eerste statement in setup(). Het is makkelijk om de Arduino in een oneindige lus te krijgen of te blokkeren. Die delay geeft je tijd om te resetten en een lege sketch te uploaden voordat hij weer blokkeert.
Ik maakte er uiteindelijk een draagbare versie van... Als je een echt coole, geavanceerdere versie wilt zien: Lego Mini Memory Game door Peter Kent. Hij maakte het spel mobiel met interface naar een Lego-auto. Echt geweldig!
Code
Geheugenspel Code (Arduino)
Dit is de complete code. Kopieer en plak in je IDE en upload naar de Arduino.
#define PLAYER_WAIT_TIME 2000 // Tijd tussen knopindrukken - 2s
byte sequence[100]; // Opslag voor lichtreeks
byte curLen = 0; // Huidige lengte van de reeks
byte inputCount = 0; // Aantal correcte knopindrukken in deze beurt
byte lastInput = 0; // Laatste invoer van de speler
byte expRd = 0; // De LED die de speler moet indrukken
bool btnDwn = false; // Check of knop ingedrukt is
bool wait = false; // Wacht op speler?
bool resetFlag = false; // Speler verloren indicator
byte soundPin = 5; // Speaker output
byte noPins = 4; // Aantal knoppen/LEDs
byte pins[] = {2, 13, 10, 8}; // Knop input & LED output pinnen
long inputTime = 0; // Timer voor reactietijd speler
void setup() {
delay(3000);
Serial.begin(9600);
Reset();
}
void setPinDirection(byte dir) {
for (byte i = 0; i < noPins; i++) pinMode(pins[i], dir);
}
void writeAllPins(byte val) {
for (byte i = 0; i < noPins; i++) digitalWrite(pins[i], val);
}
void beep(byte freq) {
analogWrite(soundPin, 2);
delay(freq);
analogWrite(soundPin, 0);
delay(freq);
}
void flash(short freq) {
setPinDirection(OUTPUT);
for (int i = 0; i < 5; i++) {
writeAllPins(HIGH);
beep(50);
delay(freq);
writeAllPins(LOW);
delay(freq);
}
}
void Reset() {
flash(500);
curLen = 0; inputCount = 0; lastInput = 0; expRd = 0;
btnDwn = false; wait = false; resetFlag = false;
}
void Lose() {
flash(50);
}
void playSequence() {
for (int i = 0; i < curLen; i++) {
Serial.print("Seq: "); Serial.print(i); Serial.print(" Pin: "); Serial.println(sequence[i]);
digitalWrite(sequence[i], HIGH);
delay(500);
digitalWrite(sequence[i], LOW);
delay(250);
}
}
void DoLoseProcess() {
Lose();
delay(1000);
playSequence(); // Laatste reeks tonen voor score
delay(1000);
Reset();
}
void loop() {
if (!wait) {
// Arduino's beurt
setPinDirection(OUTPUT);
randomSeed(analogRead(A0));
sequence[curLen] = pins[random(0, noPins)];
curLen++;
playSequence();
beep(50);
wait = true;
inputTime = millis();
} else {
// Speler's beurt
setPinDirection(INPUT);
if (millis() - inputTime > PLAYER_WAIT_TIME) {
DoLoseProcess();
return;
}
if (!btnDwn) {
expRd = sequence[inputCount];
Serial.print("Verwacht: "); Serial.println(expRd);
for (int i = 0; i < noPins; i++) {
if (pins[i] == expRd) continue;
if (digitalRead(pins[i]) == HIGH) {
lastInput = pins[i];
resetFlag = true;
btnDwn = true;
Serial.print("Gelezen: "); Serial.println(lastInput);
}
}
}
if (digitalRead(expRd) == 1 && !btnDwn) {
inputTime = millis();
inputCount++;
btnDwn = true;
Serial.print("Gelezen: "); Serial.println(expRd);
} else {
if (btnDwn && digitalRead(lastInput) == LOW) {
btnDwn = false;
delay(20);
if (resetFlag) {
DoLoseProcess();
} else {
if (inputCount == curLen) {
wait = false;
inputCount = 0;
delay(1500);
}
}
}
}
}
}
Schema's
simonsays_siKds3Jmk2.fzz

Productieproces
- Bouw een indrukwekkend monitor Ambilight-systeem met Arduino
- Bouw een real-time gyroscoop-spel met Arduino Nano & MPU-6050 sensor
- Interactieve gyroscoop LED-display met NeoPixel-ring en Arduino
- Bouw een Klassiek Pong-spel op Arduino UNO met OLED-display – Stap-voor-stap Tutorial
- DIY Arduino USB Gaming Controller – Bouw Je Eigen High-Performance Gamepad
- Arduino Touch Breakout-spel: Bouw een Klassieke Arcade op een 2,4″ TFT LCD
- Pixie: Een Arduino-gebaseerde NeoPixel-polshorloge – Modern, DIY LED-tijdstuk
- Pixel Chaser: Interactieve één-tik LED-spel met Arduino Nano
- Bouw een geautomatiseerde Google Chrome Dino Game met Arduino
- Draagbare Remote Surveillance Camera Robot
- Slimme gebaar-naar-tekst handskoen voor gebarentaal