#include <LiquidCrystal.h>
// LCD-scherm instellen met de pinnen
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int buttonPins[] = {6, 7, 8}; // Pinnen voor de knoppen
const int numButtons = 3; // Aantal knoppen
const int greenLedPin = 9; // Pin voor groene LED
const int redLedPin = 10; // Pin voor rode LED
const int buzzerPin = 13; // Pin voor de buzzer
const int resetButtonPin = A0; // Pin voor de resetknop
int buttonState[numButtons] = {0}; // Status van de knoppen
int sequence[3]; // Ingevoerde volgorde
int sequenceIndex = 0; // Huidige positie in de volgorde
void setup() {
Serial.begin(9600); // Start seriële communicatie
lcd.begin(16, 2); // Start het LCD-scherm
lcd.clear(); // Maak het scherm schoon
for (int i = 0; i < numButtons; i++) {
pinMode(buttonPins[i], INPUT); // Zet knoppen als ingangen
}
pinMode(greenLedPin, OUTPUT); // Zet groene LED als uitgang
pinMode(redLedPin, OUTPUT); // Zet rode LED als uitgang
pinMode(buzzerPin, OUTPUT); // Zet buzzer als uitgang
pinMode(resetButtonPin, INPUT); // Zet resetknop als ingang
digitalWrite(redLedPin, HIGH); // Zet rode LED aan
digitalWrite(greenLedPin, LOW); // Zet groene LED uit
}
void loop() {
if (digitalRead(resetButtonPin) == HIGH) {
resetGame(); // Reset het spel als de resetknop is ingedrukt
}
for (int i = 0; i < numButtons; i++) {
buttonState[i] = digitalRead(buttonPins[i]); // Lees de status van de knoppen
if (buttonState[i] == HIGH) {
sequence[sequenceIndex] = i + 1; // Sla de ingedrukte knop op
sequenceIndex++;
displayButtonPress(i + 1); // Toon welke knop is ingedrukt
delay(200); // Debounce vertraging
while (digitalRead(buttonPins[i]) == HIGH); // Wacht tot de knop is losgelaten
delay(200); // Debounce vertraging
if (sequenceIndex == numButtons) {
checkSequence(); // Controleer de ingevoerde volgorde
sequenceIndex = 0; // Reset de volgorde
}
}
}
}
void resetGame() {
sequenceIndex = 0;
lcd.clear();
}
void checkSequence() {
lcd.setCursor(0, 1);
lcd.print("Ingevoerd: ");
for (int i = 0; i < numButtons; i++) {
lcd.print(sequence[i]);
if (i < numButtons - 1) {
lcd.print(",");
}
}
delay(2000); // Wacht 2 seconden voordat het resultaat wordt gewist
lcd.clear();
// Controleer of de volgorde klopt
if ((sequence[0] == 1 && sequence[1] == 2 && sequence[2] == 3) ||
(sequence[0] == 3 && sequence[1] == 2 && sequence[2] == 1) ||
(sequence[0] == 2 && sequence[1] == 1 && sequence[2] == 3)) {
// Correcte volgorde
digitalWrite(greenLedPin, HIGH); // Zet groene LED aan
digitalWrite(redLedPin, LOW); // Zet rode LED uit
lcd.setCursor(0, 0);
lcd.print("Correct");
playSequenceTones(); // Speel de tonen van de knoppen
delay(2000); // Houd de groene LED 2 seconden aan
digitalWrite(greenLedPin, LOW); // Zet groene LED uit
digitalWrite(redLedPin, HIGH); // Zet rode LED aan
lcd.clear();
} else {
// Foute volgorde
lcd.setCursor(0, 0);
lcd.print("Fout");
playErrorTone(); // Speel de fouttoon
}
}
void playSequenceTones() {
for (int i = 0; i < numButtons; i++) {
playButtonTone(sequence[i] - 1); // Speel de toon voor de knop
delay(300); // Vertraging om de toon volledig af te spelen
}
}
void playButtonTone(int buttonIndex) {
switch (buttonIndex) {
case 0:
tone(buzzerPin, 261, 300); // C4 voor knop 1
break;
case 1:
tone(buzzerPin, 329, 300); // E4 voor knop 2
break;
case 2:
tone(buzzerPin, 392, 300); // G4 voor knop 3
break;
}
}
void playErrorTone() {
for (int i = 0; i < 3; i++) {
tone(buzzerPin, 1000, 200); // Hoge toon
delay(200);
tone(buzzerPin, 500, 200); // Lage toon
delay(200);
}
}
void displayButtonPress(int buttonNumber) {
lcd.setCursor(0, 1);
lcd.print("Knop ");
lcd.print(buttonNumber);
lcd.print(" ingedrukt "); // Wis extra karakters
}