Dit is een op maat gemaakte whac-a-mole-game. Voorlopig is het geprogrammeerd met een basisspel, maar het is mogelijk om updates in de functie te maken.
Begin eerst met het monteren van de behuizing.
Monteer de 3D-geprinte montagebeugels op de bovenklep.
Verf de behuizing als je wilt.
Monteer vervolgens de LED-displaysteunen. Vergeet niet de bouten onder de steunen te plaatsen, anders kunnen de verticale staven niet worden vastgezet.
Monteer het Arduino-schild. Ik heb een extra set stapelbare headers gebruikt, zodat er meer ruimte is tussen het schild en de Arduino.
Monteer het achterste bedieningspaneel.
Monteer de bovenklep (knoppen en LED-panelen).
Het achterste bedieningspaneel bevat twee potentiometerbedieningen; één voor de volumeregeling, één voor niveauselectie.
op het linker led-cijferpaneel ziet u het geselecteerde niveau. U kunt niveau 1 (eenvoudig) tot 10 (krankzinnig) selecteren. Op het rechter led-cijferpaneel ziet u de hoogste score voor het bijbehorende niveau. Tijdens een actief spel geeft het linker cijferpaneel de huidige score weer. Druk nu op de groene knop om het spel te starten. Na het aftellen begint het spel.
Code
Wac_A_Mole_v1.0.0Arduino
Arduino-code, geschreven in Visual Studio/*Whac_A_Mole_v1.0.0By WT040*/#include "Wire.h"#include "Adafruit_LEDBackpack.h"#include "Adafruit_GFX.h"Adafruit_7segment matrix1 =Adafruit_7segment();Adafruit_7segment matrix2 =Adafruit_7segment();#define debounceTime 10 //declare potmeter controls#define potmeterVolume 0#define potmeterGameLevel 1//declare amp power pin#define ampPower 32//declare buttons#define btn1Pin 22#define btn2Pin 24#define btn3Pin4Pdein 28#define btn5Pin 30byte btnArray[] ={ btn1Pin, btn2Pin, btn3Pin, btn4Pin, btn5Pin};#define btn1 0 // voor gebruik van de btn array#define btn2 1 // voor gebruik van de btn3 2 // btt gebruik van de btn-array#define btn4 3 // voor gebruik van de btn-array#define btn5 4 // voor gebruik van de btn-array//declare-knop leds#define btnLed1Pin 9#define btnLed2Pin 10#define btnLed3Pin 11#define btnLed5BinnLed5 13 byte btnLedArray[] ={ btnLed1Pin, btnLed2Pin, btnLed3Pin, btnLed4Pin, btnLed5Pin};#define btnLed1 0 // f of het gebruik van de btn array#define btnLed2 1 // voor het gebruik van de btn array#define btnLed3 2 // voor het gebruik van de btn array#define btnLed4 3 // voor het gebruik van de btn array#define btnLed5 4 // voor het gebruik van de btn array/ /declare audio fx digitals#define fx0TriggerPin 29#define fx1TriggerPin 31#define fx2TriggerPin 33#define fx3TriggerPin 35#define fx4TriggerPin 37#define fx5TriggerPin 39#define fx6TriggerPindex#define fx6TriggerPindex7 41#define fx6TriggerPinde 49 definieert fxVolUpPin 51 # definiëren fxVolDnPin 53byte fxTriggerArray [] ={fx0TriggerPin, fx1TriggerPin, fx2TriggerPin, fx3TriggerPin, fx4TriggerPin, fx5TriggerPin, fx6TriggerPin, fx7TriggerPin, fx8TriggerPin, fx9TriggerPin, fx10TriggerPin}; byte fxVolumeArray [] ={fxVolUpPin, fxVolDnPin}; # definiëren fx0Trigger 0 // voor het gebruik van de btn array#define fx1Trigger 1 // voor het gebruik van de btn array#define fx2Trigger 2 // voor het gebruik van de btn array#define fx3Trigger 3 // voor het gebruik van de btn array#define fx4Trigger 4 // voor het gebruik van de btn array tn array#define fx5Trigger 5 // voor gebruik van de btn array#define fx6Trigger 6 // voor gebruik van de btn array#define fx7Trigger 7 // voor gebruik van de btn array#define fx8Trigger 8 // voor gebruik van de btn array#define fx9Trigger 9 // voor het gebruik van de btn array#define fx10Trigger 10 // voor het gebruik van de btn array#define fxVolUp 0 // voor het gebruik van de btn array#define fxVolDn 1 // voor het gebruik van de btn arraysigned int currentPlayingSound =-1;byte btnPressed[5 ], ledState[5];//blink ledunsigned lange vorigeMillisLedBlink =0; //voor knipperende led#define intervalLedBlink 750 ////game start sequenceunsigned long previousMillisGameStarting =0;#define intervalCountDown 1000byte gameStartCountDown;////game stepsunsigned long previousMillisGameStep =0;int gameStepLength =0; // lengte van een individuele stepint gameStepBtn =0; //de knop die moet worden ingedrukt //int valPotmeterVolume =0;int volume =0;int actualVolume =35; //volume van het adafruit fx boardint valPotmeterGameLevel =0;int gameLevel;int currentScore;int highScore;int highScoreAddr =1;byte activeBtn;bool debug; // schakel debug of notbyte wackAMoleState in; //status van de gamebool SystemInitialized =false;#define stateUnknown 0#define waitForStart 1#define start 2#define running 3#define gameOver 4#define gestopt 5void setup(){ Serial.begin(9600); // init versterker power pin pinMode (ampPower, OUTPUT); digitalWrite (versterkervermogen, LAAG); //init btn-pinnen voor (int Pin =0; Pin <5; Pin ++) {pinMode (btnArray [Pin], INPUT); } //init btn led-pinnen voor (int Pin =0; Pin <5; Pin ++) {pinMode (btnLedArray [Pin], OUTPUT); } //init btn fx pinnen voor (int Pin =0; Pin <11; Pin ++) { pinMode (fxTriggerArray [Pin], OUTPUT); digitalWrite (fxTriggerArray [Pin], HOOG); } //init btn fx volume pinnen voor (int Pin =0; Pin <2; Pin ++) { pinMode (fxVolumeArray [Pin], OUTPUT); digitalWrite(fxVolumeArray[Pin], HOOG); } matrix1.begin(0x70); matrix2.begin(0x71); while (!eeprom_is_ready()); // Wacht tot EEPROM gereed is cli(); highScore =eeprom_read_word((uint16_t*)(gameLevel * 2)); zie(); matrix1.print(0); matrix1.writeDisplay(); matrix2.print(0); matrix2.writeDisplay(); initializeSystem();}void loop(){ checkButtonInputs(); // wanneer we de schakelaars controleren, krijgen we de huidige status readVolumePotmeter(); if (wackAMoleState ==waitForStart) { playSound (fx0Trigger); if (btnPressed[btn4]) { wackAMoleState =starten; } leesGameLevelPotmeter(); ledBlinkStart(); } if (wackAMoleState ==starten) { startGame(); } if (wackAMoleState ==actief) { playSound (fx1Trigger); checkVolgendeGameStep(); }} ongeldig checkNextGameStep() { unsigned long currentMillisGameStep =millis(); int hoeveelheidVanButtonPresses =0; for (int btn =0; btn <5; btn++) {if (btnPressed[btn]) {hoeveelheidKnoppers++; } } if (vorigeMillisGameStep ==0) { previousMillisGameStep =huidigeMillisGameStep; digitalWrite (btnLedArray [btnLed4], LAAG); randomSeed(analogRead (2)); gameStepBtn =willekeurig (0, 5); gameStepLength =willekeurig (3000 / gameLevel, 5000 / gameLevel); digitalWrite (btnLedArray [gameStepBtn], HOOG); // licht nieuw knoplampje op } if ((currentMillisGameStep - previousMillisGameStep>
=gameStepLength) || (amountOfButtonPresses> 1) || (amountOfButtonPresses ==1) &&!btnPressed[gameStepBtn]) {//Game over... playSound( fx2Trigger); wackAMoleState =gameOver; vorigeMillisGameStep =0; for (int teller =0; teller <5; teller++) {analogeWrite(btnLedArray[teller], 255); } for (int helderheid =255; helderheid> 0; helderheid--) { analogWrite(btnLedArray[btnLed1], helderheid); analogWrite(btnLedArray[btnLed2], helderheid); analogWrite(btnLedArray[btnLed3], helderheid); analogWrite(btnLedArray[btnLed4], helderheid); analogWrite(btnLedArray[btnLed5], helderheid); vertraging(10); } analogWrite(btnLedArray[btnLed1], 0); analogWrite(btnLedArray[btnLed2], 0); analogWrite(btnLedArray[btnLed3], 0); analogWrite(btnLedArray[btnLed4], 0); analogWrite(btnLedArray[btnLed5], 0); Serial.println("Game OVER"); if (currentScore> highScore) { while (!eeprom_is_ready()); // Wacht tot EEPROM gereed is cli(); eeprom_write_word((uint16_t*)(gameLevel * 2), currentScore); // Laten we onze waarde initialiseren in EEPROM sei(); } int-teller =0; doe { vertraging(1); checkButtonInputs(); teller++; } while ((teller <1000) &&!btnPressed[btn1] &&!btnPressed[btn2 &&!btnPressed[btn3] &&!btnPressed[btn4] &&!btnPressed[btn5]]);//wacht op de release van de knoppenmatrix1 .print(0); matrix1.writeDisplay(); wackAMoleState =waitForStart; } else if (btnPressed[gameStepBtn] &&(amountOfButtonPresses ==1)) {digitalWrite(btnLedArray[gameStepBtn], LOW); // schakel led vorige knop uit int teller =0; doe { vertraging(1); checkButtonInputs(); teller++; } while ((teller <1000) &&btnPressed[gameStepBtn]);//wacht op het loslaten van de knop previousMillisGameStep =currentMillisGameStep; int tempStepBtn =0; doen { tempStepBtn =willekeurig (0, 5); gameStepLength =willekeurig (3000 / gameLevel, 5000 / gameLevel); } while (gameStepBtn ==tempStepBtn); gameStepBtn =tempStepBtn; digitalWrite (btnLedArray [gameStepBtn], HOOG); // licht op nieuwe knop licht currentScore ++; matrix1.print(huidigeScore); matrix1.writeDisplay(); if (currentScore> highScore) { matrix2.print(currentScore); matrix2.writeDisplay(); } }}void ledBlinkStart() //blink a led zonder vertraging{ unsigned long currentMillisLedBlink =millis(); if (currentMillisLedBlink - previousMillisLedBlink>=intervalLedBlink) { previousMillisLedBlink =currentMillisLedBlink; if (ledState[0] ==LAAG) { ledState[0] =HOOG; } else { ledState[0] =LAAG; } digitalWrite(btnLedArray[btnLed4], ledState[0]); //groene led/knop }}void startGame() //start sequentie van het spel zelf{ unsigned long currentMillisGameStarting =millis(); digitalWrite(btnLedArray[btnLed4], 0); // zet groene led/knop uit currentScore =0; if (gameStartCountDown ==0) { playSound (fx3Trigger); previousMillisGameStarting =millis(); gameStartCountDown =4; vertraging (300); matrix1.print(gameStartCountDown, DEC); matrix1.writeDisplay(); } if (currentMillisGameStarting - previousMillisGameStarting>=intervalCountDown) { previousMillisGameStarting =currentMillisGameStarting; if (gameStartCountDown> 0) { gameStartCountDown--; matrix1.print(gameStartCountDown, DEC); matrix1.writeDisplay(); if (gameStartCountDown ==0) { wackAMoleState =actief; } } }}void initializeSystem(){ //voeg hier de init-code toe... digitalWrite(btnLedArray[btnLed1], HIGH); vertraging (75); digitalWrite(btnLedArray[btnLed2], HOOG); vertraging (75); digitalWrite(btnLedArray[btnLed3], HOOG); vertraging (75); digitalWrite(btnLedArray[btnLed4], HOOG); vertraging (75); digitalWrite(btnLedArray[btnLed5], HOOG); vertraging (1000); digitalWrite(btnLedArray[btnLed5], LAAG); vertraging (75); digitalWrite (btnLedArray [btnLed4], LAAG); vertraging (75); digitalWrite(btnLedArray[btnLed3], LOW); vertraging (75); digitalWrite (btnLedArray [btnLed2], LAAG); vertraging (75); digitalWrite (btnLedArray [btnLed1], LAAG); vertraging (1000); debug =waar; wackAMoleState =waitForStart; initVolume(); if (actualVolume> 0) { enableAmpPower (true); }}void checkButtonInputs() //controleer op knopwijzigingen{ static byte previousstate[5]; statische byte huidige toestand [5]; statisch lang laatste keer; byte-index; // debounce if ((laatste keer + debounceTime)> millis()) { return; } laatste keer =millis(); // for (index =0; index <5; index ++) {currentstate [index] =digitalRead (btnArray [index]); // lees de knop if (currentstate[index]!=btnPressed[index]) { if ((btnPressed[index] ==HIGH) &&(currentstate[index] ==LOW)) { if (debug) { Serial.print ("knop losgelaten:"); Serial.println(index + 1); } btnPressed[index] =0; } if ((btnPressed[index] ==LAAG) &&(currentstate[index] ==HOOG)) { if (debug) { Serial.print ("knop ingedrukt:"); Serial.println(index + 1); } btnPressed[index] =1; } } }}void initVolume(){ valPotmeterVolume =(analogRead(potmeterVolume) / 30); if (actualVolume> valPotmeterVolume) {do {digitalWrite(fxVolumeArray[fxVolDn], LOW); actueel Volume--; vertraging(20); digitalWrite(fxVolumeArray[fxVolDn], HOOG); vertraging(20); } while (actualVolume> valPotmeterVolume); } else if (actualVolume valPotmeterVolume) {digitalWrite(fxVolumeArray[fxVolDn], LOW); actueel Volume--; vertraging (40); digitalWrite(fxVolumeArray[fxVolDn], HOOG); if (actualVolume ==0) { enableAmpPower (false); } } else if (actualVolume -1) { matrix2.print (hoge score); } else { matrix2.print(0); } matrix2.writeDisplay();}void playSound(int sound){ if (currentPlayingSound !=sound) { for (int counter =0; counter <11; counter++) {digitalWrite(fxTriggerArray[counter], HIGH); } digitalWrite(fxTriggerArray[geluid], LAAG); currentPlayingSound =geluid; }}void enableAmpPower(bool state){ digitalWrite(ampPower, state);}
Aangepaste onderdelen en behuizingen
Lasergesneden MDF onderdelen 6mm OC9CvHjuTzsYL9POZCJt.dxfLasercut MDF onderdelen 9mm 1irkeqvO4ABzhKqhmyG7.dxfLasercut plexiglas onderdelen 3mm j4Tnmni6dQ0KXJtiHcy1.dxfCustom Arduino Mega Shield 5yiRX1RdQuPX0gNXjYkm.zip3D geprinte versterkerbevestiging, print 2x3D geprinte arduino mega mount3D geprinte achteraansluitpaneel montage3D geprinte achteraansluitpaneel3D geprinte kabelclip, print zoveel als u wilt3D geprinte led display mount, print 2x3D geprinte led display mount slot, print 4x3D geprinte led display bovenframe, print 2x3D geprinte bovenkap montage achterkant3D geprinte bovenkap montage voorzijde, print 2x3D geprinte bovenkap montage kant, print 2x Schema's