Na een tijdje met Arduino te hebben gespeeld om de tijd te doden, besloot ik een verbeterde versie te maken van het goede oude buzz wire-spel dat je fouten telt en gek wordt als je de draad 10 keer raakt!
De broncode is verdeeld in drie bestanden.
In de code wordt na elke storing een "respijtperiode" van 500 ms ingesteld. Je kunt dat aanpassen om de speler een grotere pauze te geven na elke buzz.
Wat me ook opviel aan het einde was dat de LED's een beetje te fel zijn! Voel je vrij om de twee weerstanden die erop worden gebruikt te verwisselen met sterkere. De mijne zijn slechts ongeveer 100 ohm.
Voor de ring heb ik het uiteinde van een sleutelhanger gebruikt. Het mooie is dat je het gewoon kunt openen en niet helemaal terug op de draad hoeft te navigeren.
Code
- nervous_meter_score.ino
- score_display.ino
- game.ino
nervous_meter_score.inoArduino
int latchPin =3; // ST_CP [RCK] op 74HC595int clockPin =4; // SH_CP [SCK] op 74HC595int dataPin =2; // DS [S1] op 74HC595const int STOP_LED =6;const int GO_LED =7;const int BUZZ =8;const int TOUCH =10;const int fail_threshold =9;enum Status{ STOP =0, GO =1};void setup() { Serieel.begin(9600); displayInitialSetup(); gameInitialSetup();}Statusstatus =GO;int failCounter =0;void loop() { while (failCounter> fail_threshold) { gameover(); } schakelaar (status) { case GO:digitalWrite (GO_LED, HIGH); digitalWrite (STOP_LED, LAAG); digitalWrite (BUZZ, LAAG); if (digitalRead (TOUCH) ==HOOG) {status =STOP; } pauze; geval STOP:digitalWrite (GO_LED, LAAG); failCounter++; if (failCounter> fail_threshold) breken; displayDigit (failCounter); Serial.println(failCounter); faalalarm(); status =GA; pauze; }}byte seg_spin[6] ={B10000000, B01000000, B00100000, B00010000, B00001000, B00000100};void gameover(){ for (int i=0; i<6; i++) { digitalWrite(BUZZ, HIGH); vertraging (5); digitalWrite (BUZZ, LAAG); vertraging (50); digitalWrite (LatchPin, LAAG); shiftOut(dataPin, clockPin, LSBFIRST, seg_spin[i]); digitalWrite(latchPin, HOOG); vertraging(10); }}
score_display.inoArduino
byte seg_digits[10] ={ B11111100, // =0 B01100000, // =1 B11011010, // =2 B11110010, // =3 B01100110, // =4 B10110110, // =5 B10111110, // =6 B11100000, // =7 B11111110, // =8 B11100110 // =9}; void displayDigit (int x) {digitalWrite (latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, seg_digits[x]); digitalWrite(latchPin, HIGH);}void displayInitialSetup(){ pinMode(latchPin, OUTPUT); pinMode (dataPin, UITGANG); pinMode(clockPin, OUTPUT); displayDigit(0);}
game.inoArduino
void gameInitialSetup(){ pinMode(STOP_LED, OUTPUT); pinMode (GO_LED, UITGANG); pinMode (BUZZ, UITGANG); pinMode (TOUCH, HOOG); digitalWrite(TOUCH, LOW);}void failAlarm(){ digitalWrite(STOP_LED, HIGH); piep(); vertraging (150); digitalWrite (STOP_LED, LAAG); digitalWrite (BUZZ, LAAG); delay(500);}void beep(){ for(int i=0; i<3; i++) { digitalWrite(BUZZ, HIGH); vertraging (50); digitalWrite (BUZZ, LAAG); vertraging (50); }}
Schema's
Houd er rekening mee dat de D10 die wordt aangesloten op de 5V, een storing zal vormen waardoor de zoemer gaat piepen en de teller gaat tellen. In het schema was er geen manier om het te laten zien.
Dus bouw je draden en structuur dienovereenkomstig op :)