#include <LiquidCrystal.h>
// Initialiseer het LCD-scherm 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}; // Opslaan van de status van de knoppen
int sequence[3]; // Opslaan van de ingevoerde volgorde
int sequenceIndex = 0; // Huidige positie in de volgorde
bool timerRunning = false; // Timerstatus
unsigned long startTime; // Tijd wanneer de timer startte
void setup() {
Serial.begin(9600); // Initialiseren van seriële communicatie
lcd.begin(16, 2); // Initialiseer het LCD-scherm
lcd.clear(); // Maak het scherm schoon
for (int i = 0; i < numButtons; i++) {
pinMode(buttonPins[i], INPUT); // Stel knoppen in als ingangen
}
pinMode(greenLedPin, OUTPUT); // Stel groene LED in als uitgang
pinMode(redLedPin, OUTPUT); // Stel rode LED in als uitgang
pinMode(buzzerPin, OUTPUT); // Stel buzzer in als uitgang
pinMode(resetButtonPin, INPUT); // Stel resetknop in als ingang
digitalWrite(redLedPin, HIGH); // Begin met de rode LED aan
digitalWrite(greenLedPin, LOW); // Begin met de groene LED uit
startTimer(); // Start de timer bij het begin van de simulatie
}
void loop() {
if (digitalRead(resetButtonPin) == HIGH) {
resetGame(); // Reset het spel als de resetknop wordt ingedrukt
}
if (timerRunning) {
unsigned long elapsedTime = (millis() - startTime) / 1000;
int remainingTime = 10 - elapsedTime;
lcd.setCursor(0, 0);
lcd.print("Timer: ");
lcd.print(remainingTime);
lcd.print(" "); // Clear any extra characters
if (remainingTime <= 0) {
timerRunning = false;
triggerExplosion();
}
}
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 knop die is ingedrukt 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 startTimer() {
startTime = millis();
timerRunning = true;
lcd.clear();
}
void resetGame() {
sequenceIndex = 0;
timerRunning = false;
lcd.clear();
startTimer();
}
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 ingevoerde volgorde correct is
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 de groene LED aan
digitalWrite(redLedPin, LOW); // Zet de 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 de groene LED uit
digitalWrite(redLedPin, HIGH); // Zet de rode LED aan
timerRunning = false; // Stop de timer
lcd.clear();
} else {
// Onjuiste 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 die bij de knop hoort
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 triggerExplosion() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BOOM!");
// Speel een reeks tonen voor een extreem explosiegeluid
for (int i = 0; i < 10; i++) {
tone(buzzerPin, random(200, 2000), 100); // Willekeurige toon tussen 200 en 2000 Hz
delay(50); // Korte vertraging voor intens geluid
}
delay(1000); // Wacht even voordat het bericht "Begin Opnieuw!" wordt weergegeven
noTone(buzzerPin);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Begin Opnieuw!");
delay(2000);
lcd.clear();
}
void displayButtonPress(int buttonNumber) {
lcd.setCursor(0, 1);
lcd.print("Knop ");
lcd.print(buttonNumber);
lcd.print(" ingedrukt "); // Clear any extra characters
}