RO EN

Joc de reflexe cu LCD 16x2 și buton

24.01.2026

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);

}