#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h> // Lisää tämä kirjaston käyttöönottoa varten
// LCD osoite, jos se on eri, päivitä tämä osoite
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Servo määrittelyt
Servo myServo;
const int servoPin = 9; // Määritä pinni, johon servo on kytketty
const int button1Pin = 2;
const int button2Pin = 3;
const int button3Pin = 4;
int score = 0;
int targetButton = 0;
unsigned long startTime;
unsigned long reactionTime;
unsigned long totalTime = 0;
int attempts = 0;
unsigned long lastDebounceTime = 0; // Viimeisen debounce-ajan muuttuja
unsigned long debounceDelay = 50; // Debounce-aika
int lastButton1State = HIGH;
int lastButton2State = HIGH;
int lastButton3State = HIGH;
void(* resetFunc) (void) = 0; //declare reset function @ address 0
void setup() {
pinMode(button1Pin, INPUT_PULLUP);
pinMode(button2Pin, INPUT_PULLUP);
pinMode(button3Pin, INPUT_PULLUP);
lcd.begin(20, 4); // Määritetään LCD-näytön koko (16 saraketta, 2 riviä)
lcd.backlight();
Serial.begin(9600); // Aloitetaan sarjaliikenne debuggausta varten
myServo.attach(servoPin); // Alusta servo
myServo.write(0); // Aseta servo aloitusasentoon (0 astetta)
// Näyttää "valmis" viestin käynnistyksessä
lcd.setCursor(0, 0);
lcd.print("Valmis");
delay(2000); // Viive ennen pelin aloitusta
lcd.clear();
// Aloita peli
newRound();
}
void loop() {
int reading1 = digitalRead(button1Pin);
int reading2 = digitalRead(button2Pin);
int reading3 = digitalRead(button3Pin);
if (reading1 != lastButton1State || reading2 != lastButton2State || reading3 != lastButton3State) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading1 == LOW || reading2 == LOW || reading3 == LOW) {
Serial.print("Button pressed: ");
Serial.print("button1: ");
Serial.print(reading1);
Serial.print(", button2: ");
Serial.print(reading2);
Serial.print(", button3: ");
Serial.println(reading3);
if ((reading1 == LOW && targetButton == button1Pin) ||
(reading2 == LOW && targetButton == button2Pin) ||
(reading3 == LOW && targetButton == button3Pin)) {
reactionTime = millis() - startTime;
score++;
totalTime += reactionTime;
attempts++;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Oikein!");
delay(1000); // Lyhyt viive oikean napin painalluksen jälkeen
newRound();
} else {
// Väärä nappi painettu
Serial.println("Väärä nappi painettu");
endGame();
}
}
}
// Päivitetään edellisten napin tilojen muuttujat
lastButton1State = reading1;
lastButton2State = reading2;
lastButton3State = reading3;
}
void newRound() {
targetButton = random(button1Pin, button3Pin + 1); // Valitsee satunnaisen napin
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Paina nappia: ");
lcd.setCursor(0, 1);
lcd.print(targetButton - button1Pin + 1); // Näyttää napin numeron (1, 2 tai 3)
Serial.print("Target button: ");
Serial.println(targetButton);
startTime = millis(); // Ajanotto alkaa
}
void endGame() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Peli ohi!");
lcd.setCursor(0, 1);
lcd.print("Pisteet: ");
lcd.print(score);
delay(3000);
if (score > 10) {
myServo.write(90); // Käännä servo 90 asteeseen
delay(1000); // Pidä servo asennossa hetken aikaa
myServo.write(0); // Palauta servo aloitusasentoon
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Aika: ");
lcd.print(totalTime / attempts);
lcd.print(" ms");
lcd.setCursor(0, 1);
lcd.print("Pisteet: ");
lcd.print(score);
Serial.print("Peli ohi. Pisteet: ");
Serial.print(score);
Serial.print(", Average Time: ");
Serial.print(totalTime / attempts);
Serial.println(" ms");
delay(5000); // Odota 2 sekuntia, jotta käyttäjä ehtii reagoida
// Peli uudelleenkäynnistys
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pelaa uudelleen?");
lcd.setCursor(0, 1);
lcd.print("Paina nappia 1");
while (digitalRead(button1Pin) == HIGH) {} // Odota, että käyttäjä painaa nappia 1
// Käynnistä peli uudelleen
resetFunc(); // Käynnistä Arduino uudelleen
}