Joc de reflexe cu LCD 16x2 și buton
Acest proiect prezintă realizarea unui joc de reflexe cu Arduino, conceput pentru a măsura timpul de reacție al utilizatorului la un semnal vizual afișat pe un ecran LCD. Sistemul este bazat pe Arduino Uno, un LCD 16x2 cu interfață I2C și un buton utilizat pentru interacțiune.
Funcționarea este directă: după pornire, pe ecran este afișat un mesaj de așteptare, urmat de un semnal afișat după un interval aleator. În momentul apariției semnalului, utilizatorul trebuie să apese butonul, iar timpul de reacție este calculat și afișat în milisecunde. Apăsările efectuate înainte de apariția semnalului sunt detectate și semnalizate corespunzător.
Implementarea logicii jocului și controlul afișajului sunt realizate în Arduino IDE, folosind o librărie dedicată pentru comunicarea cu LCD-ul și funcții interne pentru măsurarea timpului.
Componente necesare
Hardware
-
Arduino Uno (sau microcontroller compatibil)
-
Ecran LCD 16x2 cu modul I2C
-
Buton (push-button)
-
Fire de legătură (jumper wires)
-
Breadboard (opțional)
-
Cablu USB pentru programare
Conexiuni hardware
LCD 16x2 cu I2C
- GND GND
- VCC 5V
- SDA A4
- SCL A5
Buton
- Un pin D2
- Celălalt pin GND
Butonul este configurat folosind rezistența internă de tip pull-up a plăcii Arduino.
Cod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int buttonPin = 2;
unsigned long startTime;
unsigned long reactionTime;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
lcd.init();
lcd.backlight();
randomSeed(analogRead(A0));
lcd.setCursor(0, 0);
lcd.print("Reflex Master");
lcd.setCursor(0, 1);
lcd.print("Press to start");
}
void loop() {
if (digitalRead(buttonPin) == LOW) {
delay(300);
playRound();
}
}
void playRound() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wait...");
unsigned long waitTime = random(2000, 5000);
unsigned long startWait = millis();
while (millis() - startWait < waitTime) {
if (digitalRead(buttonPin) == LOW) {
tooEarly();
return;
}
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PRESS NOW!");
startTime = millis();
while (digitalRead(buttonPin) == HIGH);
reactionTime = millis() - startTime;
showReactionTime();
}
void tooEarly() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Too early!");
delay(2000);
}
void showReactionTime() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Reaction time:");
lcd.setCursor(0, 1);
lcd.print(reactionTime);
lcd.print(" ms");
delay(3000);
}
