
Reakčná hra pre dvoch hráčov – Arduino Uno
Princíp fungovania:
Obaja hráči čakajú na štartovací signál a snažia sa stlačiť svoje tlačidlo čo najrýchlejši.
Ako bude hra prebiehať?:
- LED postupne bliknú dvakrát ako uvítanie na začiatku hry.
- Hra náhodne čaká 2–6 sekúnd. Ak niekto stlačí tlačidlo príliš skoro, kolo sa zruší.
- Všetkých 5 LED sa rozsvieti — to je signál na reakciu.
- Po 3 sekundách sa rozsvieti krajné LED víťaza na 3 sekundy.
- LED zhasnú a hra sa pripraví na ďalšie kolo.
- Ak obaja stlačia tlačidlo v tom istom čase, hra to vyhodnotí ako remízu a zablikajú obe krajné LED.
Súčiastky:
- 5× LED
- 5× 470R resistor
- Dupont M-M prepojovacie vodiče 10cm a 2× 20cm
- 2× tlačidlo 6×6mm
Zapojenie:
|
Komponenta: |
Pin Arduino: |
|---|---|
|
LED 1 (ľavá) – anóda cez rezistor |
D3 |
|
LED 2 – anóda cez rezistor |
D4 |
|
LED 3 – anóda cez rezistor |
D5 |
|
LED 4 – anóda cez rezistor |
D6 |
|
LED 5 (pravá) – anóda cez rezistor |
D7 |
|
Katóda každej LED |
GND |
|
Tlačidlo ľavého hráča – jeden kontakt |
D2 |
|
Tlačidlo pravého hráča – jeden kontakt |
D8 |
|
Druhý kontakt oboch tlačidiel |
GND |
Program pro Arduino:
const int ledPins[] = {3, 4, 5, 6, 7};
const int pocetLED = 5;
const int tlacidloLavy = 2;
const int tlacidloPravy = 8;
const int ledLavyVitaz = 3;
const int ledPravyVitaz = 7;
void zhasniVsetkyLED() {
for (int i = 0; i < pocetLED; i++) {
digitalWrite(ledPins[i], LOW);
}
}
void rozsvietVsetkyLED() {
for (int i = 0; i < pocetLED; i++) {
digitalWrite(ledPins[i], HIGH);
}
}
void pockajNaUvolnenieTlacidiel() {
while (digitalRead(tlacidloLavy) == LOW ||
digitalRead(tlacidloPravy) == LOW) {
delay(10);
}
}
void uvodnaAnimacia() {
zhasniVsetkyLED();
// Kazda LED postupne blikne dvakrat
for (int i = 0; i < pocetLED; i++) {
for (int blik = 0; blik < 2; blik++) {
digitalWrite(ledPins[i], HIGH);
delay(200);
digitalWrite(ledPins[i], LOW);
delay(200);
}
}
}
void setup() {
for (int i = 0; i < pocetLED; i++) {
pinMode(ledPins[i], OUTPUT);
}
pinMode(tlacidloLavy, INPUT_PULLUP);
pinMode(tlacidloPravy, INPUT_PULLUP);
randomSeed(analogRead(A0));
uvodnaAnimacia();
}
void loop() {
zhasniVsetkyLED();
// Hra sa zacne, az ked su obe tlacidla uvolnene
pockajNaUvolnenieTlacidiel();
// Nahodne cakanie 2 az 6 sekund
unsigned long cakanie = random(2000, 6001);
unsigned long zaciatokCakania = millis();
while (millis() - zaciatokCakania < cakanie) {
bool lavyStlaceny =
digitalRead(tlacidloLavy) == LOW;
bool pravyStlaceny =
digitalRead(tlacidloPravy) == LOW;
// Predcasne stlacenie zrusi kolo
if (lavyStlaceny || pravyStlaceny) {
zhasniVsetkyLED();
pockajNaUvolnenieTlacidiel();
delay(1000);
return;
}
}
// Startovaci signal
rozsvietVsetkyLED();
int vitaz = 0;
// 1 = lavy, 2 = pravy, 3 = takmer sucasne stlacenie
while (vitaz == 0) {
bool lavyStlaceny =
digitalRead(tlacidloLavy) == LOW;
bool pravyStlaceny =
digitalRead(tlacidloPravy) == LOW;
if (lavyStlaceny & pravyStlaceny) {
vitaz = 3;
} else if (lavyStlaceny) {
vitaz = 1;
} else if (pravyStlaceny) {
vitaz = 2;
}
}
zhasniVsetkyLED();
// Pauza 3 sekundy pred oznamenim vitaza
delay(3000);
if (vitaz == 1) {
digitalWrite(ledLavyVitaz, HIGH);
} else if (vitaz == 2) {
digitalWrite(ledPravyVitaz, HIGH);
} else {
// Pri takmer sucasnom stlaceni bliknu obe krajné LED
for (int i = 0; i < 3; i++) {
digitalWrite(ledLavyVitaz, HIGH);
digitalWrite(ledPravyVitaz, HIGH);
delay(250);
digitalWrite(ledLavyVitaz, LOW);
digitalWrite(ledPravyVitaz, LOW);
delay(250);
}
}
// Vitazna LED svieti 3 sekundy
delay(3000);
zhasniVsetkyLED();
// Pauza pred dalsim kolom
pockajNaUvolnenieTlacidiel();
delay(1000);
}