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.
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);
}
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.
- 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). - Nodefinē mainīgos virs
setup():const int LED = 9;,const int POGA_START = 2;,const int POGA_REAGE = 3;. - Ieraksti funkcijā
setup()abu pogupinMode(..., INPUT_PULLUP);un LEDpinMode(LED, OUTPUT);. - Pievieno
Serial.begin(9600);, lai varētu redzēt rezultātus datorā. - 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.
- Funkcijā
loop()gaidi, līdz tiek nospiesta START poga (LOW signāls). - Pievieno nejaušu pauzi:
delay(random(1000, 4001));- Arduino gaidīs no 1 līdz 4 sekundēm. - Iededz LED un saglabā laiku ar
unsigned long sakums = millis();. - Gaidi otrās pogas nospiešanu un aprēķini reakciju:
laiks = millis() - sakums;. - Izvadi rezultātu:
Serial.print("Reakcija: "); Serial.print(laiks); Serial.println(" ms");. - 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.
- Pievieno
forciklu, kas izpilda 3 raundus. - Saglabā katra raunda laiku masīvā
int laiki[3];. - Pēc cikla aprēķini vidējo:
summa / 3un izvadi to. - 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.
- 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.
- Ievelc shēmā komponenti "Piezo" un savieno to ar 8. portu un GND.
- Pievieno LED iedegšanās brīdī rindu
tone(8, 1000, 100);. - Pievieno false start gadījumā
tone(8, 300, 400);- zemāku un garāku signālu. - 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)
- Poga darbojas otrādi: ar
INPUT_PULLUPnospiesta poga nozīmēLOW. - LED nedeg: pārbaudi rezistoru, polaritāti un pareizo pin numuru.
- Reakcijas laiks ir milzīgs: saglabā
sakumstieši LED iedegšanās brīdī. - False start nav pamanīts: pārbaudi pogu pirms LED iedegšanas un raundu sāc no jauna.
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");
}
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
- Pirms reālā Arduino kods pārbaudīts Tinkercad simulācijā.
- LED diodei pievienots 220Ω rezistors.
- Pogas izmanto
INPUT_PULLUPun kods pārbaudaLOWsignālu. - Reakcijas laiks tiek izvadīts caur
Serial Monitor. - Pēc 3 raundiem tiek izvadīts vidējais rezultāts.
- False start tiek atpazīts un raunds restartējas.