Całe zajęcia poświęciliśmy wirtualnemu Arduino – aby każdy z nas miał swoją kopię układu nad którym pracujemy oraz… aby popracować samodzielnie w domu i zabłysnąć na kolejnych zajęciach 😉
Niestety – okazało się, że tinkercad.com nie oferuje sterownika HD44780 do obsługi popularnego LCD16x2 – musieliśmy wykorzystać komunikację UART (obiekt Serial). Troszkę szkoda…
W realu wygląda to tak:
Prawie ostateczna wersja oprogramowania (z kilkoma udziwnieniami – potencjometrami do konfigurowania trudności (szybkości) losowych zdarzeń) ale bez liczenia RUND i licznika czasu do końca gry:
byte btns[6]={2,3,4,5,6,7}; byte leds[5]={12,11,10,9,8}; byte i; int czas_staly, czas_los; void setup() { Serial.begin(9600); for (i=0;i<6; i++) pinMode(btns[i], INPUT_PULLUP); for (i=0;i<5; i++) pinMode(leds[i], OUTPUT); Serial.println(analogRead(A5)); srand(analogRead(A5)); czas_staly=2*analogRead(A0); czas_los=2*analogRead(A1); Serial.print("KONFIG:"); Serial.print("czas stały="); Serial.println(czas_staly); Serial.print("czas los="); Serial.println(czas_los); delay(1000); } byte los; unsigned long int t1,t2; void loop() { delay(czas_staly+rand()%czas_los); los=rand()%5; Serial.print("los="); Serial.println(los); digitalWrite(leds[los], HIGH); t1=millis(); while(digitalRead(btns[los])==HIGH);//nic nie rób, czekaj na klik! t2=millis(); digitalWrite(leds[los], LOW); Serial.print("refleks="); Serial.println(t2-t1); delay(2000); czas_staly=2*analogRead(A0); czas_los=2*analogRead(A1); }
Warte podkreślenia jest użycie tablic – to zdecydowanie ułatwiło losowanie LED-a i sprawdzenie, czy odpowiedni przycisk został wciśnięty czy nie.
Do zrobienia:
- rozbudowa softu o monitorowanie czasu reakcji – jeśli przekroczymy pozostały czas, to gra powinna się automatycznie zakończyć (i wyświetlić jakieś podsumowanie, a potem – rozpocząć się od początku)
- rozbudowa softu o zabezpieczenie przez „strategią małpy” – klikanie wszystkich przycisków, aż któryś się trafi i będzie bardzo krótki czas reakcji. To już troszkę trudniejsze zadanie
- niby kto powiedział, że ma to być tylko gra refleks? warto pomyśleć także o grze memory – i zaprogramować sekwencje błysków (przygotowane wcześniej lub może losowo?), które należy powtarzać i zdobywać punkty. Można w setupie() zadać pytanie o wybór gry: reflex czy memory (wybór odczytujemy klikając jeden albo drugi przycisk) a wówczas loop() będzie uruchamiał odpowiedni kod…
(c) KG 2018
P.S. Radek (pracowity gimnazjalisto) – skontaktuj się ze mną emailem, czekam! KG