LED Whack-a-Mole spel met Arduino Uno – Interactief LED- en joystickproject
Onderdelen en benodigdheden
| Arduino UNO | × | 1 |
| LEDs | × | 7 |
| Weerstand 221 ohm | × | 7 |
| Analoge joystick (Generiek) | × | 1 |
| Draadbruggen (generiek) | × | 8 |
| Male/Female draadbruggen | × | 4 |
Over dit project
Dit was mijn eerste Arduino-project, gebaseerd op wat ik leerde uit de beginnertutorials over LED's en basisbesturing.
Deze "Whack-a-mole" game gebruikt 7 LED's en een joystick. Er zijn 4 "molletjes", vertegenwoordigd door de 2e, 3e, 4e en 5e licht van links op mijn bord. Eén van de vier lichten gaat willekeurig branden en geeft een vaste reactietijd om de overeenkomstige richting op de joystick in te drukken. Ik heb mijn lichten zo gerangschikt dat, van links naar rechts, de selecties op de joystick zijn: links, boven, onder, rechts. Dit is mijn gekozen conventie, voel je vrij om andere te bedenken!
De twee lichten links zijn rood en groen, die een foute of juiste keuze aangeven. Het gele licht helemaal rechts knippert de telling voor de huidige highscore, en toont de score elke keer dat een run voorbij is (wanneer een foute keuze wordt gemaakt). Natuurlijk vervangt een nieuwe highscore de oude.
Misschien het meest ingewikkelde deel van dit project is de analoge joystick. Voor beide richtingen van de joystick zijn er maximumwaarden van 0 en 1024 (bij mij 1023, dus als je de selecties niet correct krijgt, probeer dan 1023). Ik geloof dat deze waarden gemeten kunnen worden via het seriële venster. Ik vereenvoudigde deze invoerwaarden met switch-statements voor zowel de x- als y-invoer. Ik weet niet of dit de beste manier is, maar omdat ik alleen de maximumwaarden van elke richting nodig had (dus 4 opties, 4 LED-molletjes), heb ik gehele waarden toegewezen aan elke mogelijkheid: 1, 2, 3, 4 overeenkomend met Links, Rechts, Boven, Onder.

De moeilijkheidsgraden die ik in mijn code als constanten heb geschreven, zijn de tijd in milliseconden die de speler heeft om een selectie te maken. Je kunt met deze tijden experimenteren om de moeilijkheid aan te passen aan je voorkeur. Ik dacht erover om een keuze via knoppen of misschien de joystick aan het begin van een beurt te integreren, maar het was de moeite niet waard omdat het vrij ingewikkeld zou zijn en niet echt gebruiksvriendelijk.
Laat gerust weten welke aanpassingen en verbeteringen er gemaakt kunnen worden! :)
Code
WhackALED
// Whack a LED
// Joystick variabelen
int sX = A0; // joystick x-as, analoge ingang
int sY = A1; // joystick y-as, analoge ingang
int sSX; // staat van x, lezen van sX
int sSY; // staat van y, lezen van sY
int sS; // geconverteerde staat (misschien niet meest efficiënt)
// Spel variabelen
int rNum; // willekeurig getal dat kiest welk licht aan gaat
int wins = 0; // opeenvolgende wins tellen
int highScore = 0; // hoogste score opeenvolgende wins bewaren
// Moeilijkheidsconstanten, reactietijd
const int easy = 1000;
const int medium = 500;
const int hard = 325;
const int stupid = 250;
int ledPins[] = {5, 2, 4, 3, 6, 7, 8}; // LED pinnen initialiseren
int pinCount = 7; // aantal LED pinnen
void setup() {
Serial.begin(9600);
pinMode(sX, INPUT);
pinMode(sY, INPUT);
for (int thisPin = 0; thisPin < pinCount; thisPin++) {
// alle pinnen als output instellen in een for-lus
pinMode(ledPins[thisPin], OUTPUT);
}
}
void loop() {
rNum = random(4); // willekeurige keuze genereren
delay(1000);
digitalWrite(ledPins[rNum], HIGH); // willekeurig gekozen lampje aan
delay(stupid); // moeilijkheidsgraad
// Joystick uitlezen
sSX = analogRead(sX); // x-as invoer lezen
delay(100);
sSY = analogRead(sY); // y-as invoer lezen
// y en x invoer converteren naar 4 mogelijkheden. 0 en 1023 zijn de maximumwaarden op elke as van de joystick, zoals gemeten.
sS = 0;
switch (sSX) {
case 0: sS = 1; // Links
break;
case 1023: sS = 2; // Rechts
break;
}
switch (sSY) {
case 0: sS = 3; // Boven
break;
case 1023: sS = 4; // Onder
break;
}
digitalWrite(ledPins[rNum], LOW); // willekeurig geselecteerde lampje uit na joystick keuze
if (sS - 1 == rNum) { // controleren of gebruiker correcte richting van brandende lamp invoerde
wins++;
for (int k = 0; k <= 3; k++) {
// groen licht laten knipperen voor juiste keuze
digitalWrite(ledPins[4], HIGH);
delay(50);
digitalWrite(ledPins[4], LOW);
delay(50);
}
} else {
if (wins > highScore) {
// als opeenvolgende wins meer dan vorige highscore, nieuwe highscore instellen
highScore = wins;
wins = 0;
}
for (int i = 0; i <= 3; i++) {
// rood licht laten knipperen voor foute keuze
digitalWrite(ledPins[5], HIGH);
delay(50);
digitalWrite(ledPins[5], LOW);
delay(50);
}
for (int w = 0; w < highScore; w++) {
// highscore weergeven via tellen en knipperen op gele lamp
digitalWrite(ledPins[6], HIGH);
delay(200);
digitalWrite(ledPins[6], LOW);
delay(200);
}
}
}
Schema
Alles moet overeenkomen met de echte foto van het project, behalve de joystick. Mijn joystick heeft 5 pinnen, waarvan ik 4 gebruik: van boven naar beneden genaamd "GND", "+5V", "VRx" en "VRy". "GND" en "+5V" zijn verbonden met GND en 5V op de Arduino, "VRx" en "VRy" zijn verbonden met A0 en A1.


Productieproces
- Gaslampen: Evolutie, Ontwerp en Moderne Productie
- Laser Pointer: Ontwerp, Productie en Veiligheidsoverzicht
- Zaklamp: van ontstaan tot moderne innovatie
- De Kaleidoscoop: Van Brewsters Wetenschap tot Modern Ontwerp
- Semiconductor Lasers: Precieze Lichtgeneratie voor Moderne Technologie
- De kunst en wetenschap van fotografische processen: Van daguerreotypen tot moderne film
- Verkeerslichten: Techniek, Geschiedenis en Toekomstige Innovaties
- Light-Emitting Diodes: Van Ontstaan tot 100-Jarige Levensduur
- Uw autodashboard ontcijferd: lampjes, indicatoren en hun betekenis
- LED Strip Accessoires Meesteren: Verbinden, Besturen en Uw Verlichting Aanpassen
- Binnenkijken in een Sengled Slimme LED-lamp: Technische Ontbinding en Zigbee Connectiviteit Review