ebSkola

2.5 Noslēguma projekts: Reakcijas spēle

Stundas uzdevums: Izveidot Arduino reakcijas spēli, apvienojot iepriekš apgūto LED izvadi, pogas ievadi, if/else, mainīgos un Serial Monitor rezultātu izvadi.

D.7.1.1. Sintakse un mainīgie D.7.2.1. Elektriskā ķēde D.7.3.1. Signāli un loģika D.7.6.1. Komponenšu integrācija

70 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~15 min) - saslēdz shēmu un nodefinē mainīgos · 2. uzdevums (~25 min) - uzraksti spēles loģiku ar millis() · 3. uzdevums (~20 min) - pievieno 3 raundus, vidējo un false start. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.

Pirms sāc: atver tinkercad.com, sagatavo zaļu LED, 220 omu rezistoru un divas spiedpogas - visu spēli vispirms pārbaudīsi simulācijā.

Teorija: reakcijas spēle no LED, pogas un laika mērījuma

Spēle sākas, kad spēlētājs ar pirmo pogas piespiedienu signalizē "esmu gatavs". LED diode pēc nejauša laika (1–4 sekundes) iedegas zaļa. Spēlētājam jānospiež otra poga pēc iespējas ātrāk. Mikrokontrolieris izmēra reakcijas laiku milisekundēs un pārraida to caur sērijas portu (Serial Monitor). Pēc 3 raundiem tiek aprēķināts vidējais reakcijas laiks. Ja spēlētājs nospiež pogu pirms LED iedegas - fiksēts false start.

unsigned long sakums = millis();

if (digitalRead(POGA_REAGE) == LOW) {
  unsigned long reakcija = millis() - sakums;
  Serial.println(reakcija);
}
Jaunais fragments ir skaidrots pirms uzdevuma: millis() atgriež laiku kopš programmas palaišanas.

Darba uzdevuma gaita

1. uzdevums -

Saslēdz shēmu un nodefinē mainīgos

Beigās tava shēma būs gatava un kods zinās, kurā portā ir katra detaļa.

  1. Saslēdz uz maketo plates: zaļo LED ar 220Ω rezistoru pie pin 9, divas spiedpogas pie pin 2 un pin 3 (ar INPUT_PULLUP).
  2. Nodefinē mainīgos virs setup(): const int LED = 9;, const int POGA_START = 2;, const int POGA_REAGE = 3;.
  3. Ieraksti funkcijā setup() abu pogu pinMode(..., INPUT_PULLUP); un LED pinMode(LED, OUTPUT);.
  4. Pievieno Serial.begin(9600);, lai varētu redzēt rezultātus datorā.
  5. Palaid simulāciju un pārbaudi, ka kods kompilējas bez kļūdām.

Gatavs, kad: kods kompilējas un mainīgie ir virs setup(), nevis iekšā tajā - citādi loop() tos neredz.

2. uzdevums -

Uzraksti spēles loģiku ar millis()

Beigās Serial Monitor parādīs tavu reakcijas laiku milisekundēs.

  1. Funkcijā loop() gaidi, līdz tiek nospiesta START poga (LOW signāls).
  2. Pievieno nejaušu pauzi: delay(random(1000, 4001)); - Arduino gaidīs no 1 līdz 4 sekundēm.
  3. Iededz LED un saglabā laiku ar unsigned long sakums = millis();.
  4. Gaidi otrās pogas nospiešanu un aprēķini reakciju: laiks = millis() - sakums;.
  5. Izvadi rezultātu: Serial.print("Reakcija: "); Serial.print(laiks); Serial.println(" ms");.
  6. Palaid simulāciju un izspēlē vienu raundu.

Gatavs, kad: pēc pogas nospiešanas Serial Monitor parāda skaitli, kas ir aptuveni 200-500 ms.

3. uzdevums -

Pievieno 3 raundus, vidējo un false start

Beigās spēle nospēlēs trīs raundus un pateiks tavu vidējo reakcijas laiku.

  1. Pievieno for ciklu, kas izpilda 3 raundus.
  2. Saglabā katra raunda laiku masīvā int laiki[3];.
  3. Pēc cikla aprēķini vidējo: summa / 3 un izvadi to.
  4. Pievieno pārbaudi: ja spēlētājs nospiež pogu, kamēr LED vēl nav iedegusies - paziņo "FALSE START!" un sāc raundu no jauna.
  5. Pārbaudi abus scenārijus: godīgu raundu un apzinātu false start.

Gatavs, kad: pēc trim raundiem parādās vidējais laiks, bet par agru nospiesta poga dod "FALSE START!" un raunds sākas no jauna.

Papildu uzdevums - Skaņas signāls

Ja pamatdarbs ir gatavs, pievieno pīkstuli, kas apstiprina startu un brīdina par false start.

  1. Ievelc shēmā komponenti "Piezo" un savieno to ar 8. portu un GND.
  2. Pievieno LED iedegšanās brīdī rindu tone(8, 1000, 100);.
  3. Pievieno false start gadījumā tone(8, 300, 400); - zemāku un garāku signālu.
  4. Palaid spēli un pārbaudi abas skaņas.

Gatavs, kad: starts un false start skan atšķirīgi, un tu vari tos atšķirt ar aizvērtām acīm.

Biežākās kļūdas (un kā tās labot)

Koda piemērs (false start un millis() - grūtākā daļa)

// Grūtākā daļa nav laika mērīšana, bet GAIDĪŠANA.
// Ja nejaušās pauzes laikā lieto delay(), Arduino tajā brīdī ir "kurls"
// un false start palaiž garām. Tāpēc gaidīt vajag ciklā, kas VIENLAIKUS
// skatās pulksteni UN pogu.

unsigned long pauze = random(1000, 4001);
unsigned long pauzesSakums = millis();
bool falseStart = false;

// Gaida nejaušo pauzi, bet visu laiku vēro arī pogu
while (millis() - pauzesSakums < pauze) {
  if (digitalRead(POGA_REAGE) == LOW) {   // nospieda PIRMS laika
    Serial.println("FALSE START!");
    falseStart = true;
    break;
  }
}

if (!falseStart) {
  digitalWrite(LED, HIGH);
  unsigned long sakums = millis();        // pulkstenis sākas TIEŠI te

  while (digitalRead(POGA_REAGE) == HIGH) {
    // gaida, līdz spēlētājs nospiež pogu
  }

  unsigned long laiks = millis() - sakums;
  digitalWrite(LED, LOW);
  Serial.print("Reakcija: ");
  Serial.print(laiks);
  Serial.println(" ms");
}
Godīgā raundā Serial Monitor rāda, piemēram, "Reakcija: 284 ms". Ja pogu nospiež, kamēr LED vēl ir tumša, parādās "FALSE START!" un raunds netiek ieskaitīts. Ja nejaušo pauzi taisa ar delay(), false start netiek pamanīts vispār.

Vērtēšanas kritēriji

Kritērijs Sācis (1-3) Turpina (4-6) Apguvis (7-8) Padziļināti (9-10)
Shēma Pieslēgumi nestabili vai īssavienojumā. Shēma darbojas, bet vadi haotiski. Stabila shēma, loģisks vadu izkārtojums. Izcils kabeļu menedžments, krāsu kodējums (sarkans/melns).
Programmēšana un mainīgie Sintakses kļūdas, kods nekompilējas. Kods strādā, bet bez mainīgajiem (cietkodēti skaitļi). Lieto mainīgos un funkcijas, kods bez kļūdām. Patstāvīgi izveidotas papildu funkcijas, kods optimizēts.
Spēles loģika Reakcija netiek mērīta. Mēra laiku, bet rezultāti neuzkrājas. 3 raundi un vidējais aprēķins darbojas. Pievienota false-start pārbaude un papildu uzlabojumi.
Izpratne Nespēj paskaidrot koda darbību. Pamatkomandas paskaidrojamas, bet loģika apjucīga. Pilnībā izprot savu kodu un shēmu. Brīvi modificē kodu pēc lūguma, palīdz citiem.

Pašpārbaudes saraksts