// Reisinger Marco 5HET 21.9.2023
// In diesem Programm wird das Spiel Whack the mole mit einem Arduino nachgebaut
// Verwendete Libraries
#include <Arduino.h>
#include <Wire.h>
//#include <LiquidCrystal_I2C.h>
// Pindeklarationen
// Taster (Moles)
#define PINT1 22 // 44 Pins am schaltplan (zum testen auf anderen aufbau im programm umgeändert)
#define PINT2 23 // 45
#define PINT3 24 // 46
#define PINT4 25 // 47
#define PINT5 26 // 48
#define PINT6 27 // 49
// LEDS (Hammer)
#define PINL1 4 // 2
#define PINL2 5 // 3
#define PINL3 6 // 4
#define PINL4 7 // 5
#define PINL5 8 // 6
#define PINL6 9 // 7
#define STARTSTOP 38 // Taster (Start Stopp Taste)
#define ERSCHEININTERVALL 1000 // Zeit wie schnell Moles erscheinen
enum State // Aktueller zustand des Spiels (Stopp, Während des Spiels, Spiel zu ende)
{
Stop,
Go,
End
};
State Mode = Stop; // Standardmodus
// Status der Taster und LEDs
bool Taster1 = LOW;
bool Taster2 = LOW;
bool Taster3 = LOW;
bool Taster4 = LOW;
bool Taster5 = LOW;
bool Taster6 = LOW;
bool Taster1vorher = LOW;
bool Taster2vorher = LOW;
bool Taster3vorher = LOW;
bool Taster4vorher = LOW;
bool Taster5vorher = LOW;
bool Taster6vorher = LOW;
bool Umschalter = LOW;
bool Umschalterzuvor = LOW;
// Sonstige Variablen
unsigned long Erscheinzeit = 0;
int16_t Punkte = 0;
int16_t Punktevorher = 0;
int Helligkeit = 0;
int8_t Zufallspin = 0;
// Definition des LCD Display (Adresse, Zeichen pro Zeile, Zeilen)
//LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
// Pins funktion zuordnen
pinMode(PINT1, INPUT_PULLUP);
pinMode(PINT2, INPUT_PULLUP);
pinMode(PINT3, INPUT_PULLUP);
pinMode(PINT4, INPUT_PULLUP);
pinMode(PINT5, INPUT_PULLUP);
pinMode(PINT6, INPUT_PULLUP);
pinMode(PINL1, OUTPUT);
pinMode(PINL2, OUTPUT);
pinMode(PINL3, OUTPUT);
pinMode(PINL4, OUTPUT);
pinMode(PINL5, OUTPUT);
pinMode(PINL6, OUTPUT);
pinMode(STARTSTOP, INPUT_PULLUP);
// LCD Display starten und hintergrundbeleuchtung aktivieren
//lcd.init();
//lcd.backlight();
}
// Eigene Funktion zum Überprüfen ob Taster gedrückt wird wenn LED leuchtet (gegebenenfalls punkte erhöhen und )
void Mole()
{
if (Taster1 && !Taster1vorher && Zufallspin == PINL1)
{
Punkte++;
Helligkeit = 0;
}
if (Taster2 && !Taster2vorher && Zufallspin == PINL2)
{
Punkte++;
Helligkeit = 0;
}
if (Taster3 && !Taster3vorher && Zufallspin == PINL3)
{
Punkte++;
Helligkeit = 0;
}
if (Taster4 && !Taster4vorher && Zufallspin == PINL4)
{
Punkte++;
Helligkeit = 0;
}
if (Taster5 && !Taster5vorher && Zufallspin == PINL5)
{
Punkte++;
Helligkeit = 0;
}
if (Taster6 && !Taster6vorher && Zufallspin == PINL6)
{
Punkte++;
Helligkeit = 0;
}
analogWrite(Zufallspin, Helligkeit);
}
void loop()
{
// Zustände der Taster einlesen
Taster1 = !digitalRead(PINT1);
Taster2 = !digitalRead(PINT2);
Taster3 = !digitalRead(PINT3);
Taster4 = !digitalRead(PINT4);
Taster5 = !digitalRead(PINT5);
Taster6 = !digitalRead(PINT6);
Umschalter = !digitalRead(STARTSTOP);
// Modi während des Spiels
switch (Mode)
{
// Modus Stopp
case Stop:
// Alle pins ausschalten
digitalWrite(PINL1, LOW);
digitalWrite(PINL2, LOW);
digitalWrite(PINL3, LOW);
digitalWrite(PINL4, LOW);
digitalWrite(PINL5, LOW);
digitalWrite(PINL6, LOW);
// Punkte zurücksetzen
Punkte = 0;
// Anzeige am LCD Display
//lcd.setCursor(0, 0);
//lcd.print("Starttaste drücken");
// Umschalten in Spielmodus
if (Umschalter && !Umschalterzuvor)
{
Mode = Go;
}
break;
// Modus Go
case Go:
// Nach ablauf des Erscheinintervall mole erscheinen lassen
if ((millis() - Erscheinzeit >= ERSCHEININTERVALL) || Helligkeit == 0)
{
Zufallspin = random(PINL1, PINL6 + 1); // Zufallspin auswählen
Erscheinzeit = millis();
}
// Helligkeit mit vergehender zeit abnehmen
Helligkeit = (255 * (ERSCHEININTERVALL - (millis() - Erscheinzeit))) / ERSCHEININTERVALL;
// wenn Helligkeit unter 0 fallen würde laut oberer Formel Helligkeit auf 0 setzen
if (millis() - Erscheinzeit >= ERSCHEININTERVALL)
{
Helligkeit = 0;
}
// auf Zufallspinn Helligkeit ausgeben
analogWrite(Zufallspin, Helligkeit);
// Funktion aufrufen ob taster des leuchtenden
void Mole();
/*
if (Punkte != Punktevorher)
{
// lcd display clearen
lcd.clear();
// Anzeige auf LCD Display
lcd.setCursor(0, 0);
lcd.print("Punkte:" + Punkte);
}
*/
// Umschalten zum ende Modus
if (Umschalter && !Umschalterzuvor)
{
Mode = End;
}
break;
// Ende des Spiel
case End:
// LEDs alle einschalten
digitalWrite(PINL1, HIGH);
digitalWrite(PINL2, HIGH);
digitalWrite(PINL3, HIGH);
digitalWrite(PINL4, HIGH);
digitalWrite(PINL5, HIGH);
digitalWrite(PINL6, HIGH);
/*// Endresultat auf LCD display
lcd.setCursor(0, 0);
lcd.print("Erreichte Punkte:" + Punkte);
lcd.setCursor(0, 1);
lcd.print("Ende des Spiels, Taste drücken");
*/
// Umschalten zum Stopp Zustand
if (Umschalter && !Umschalterzuvor)
{
Mode = Stop;
}
break;
}
// Flankenerkennung
Umschalterzuvor = Umschalter;
Taster1vorher = Taster1;
Taster2vorher = Taster2;
Taster3vorher = Taster3;
Taster4vorher = Taster4;
Taster5vorher = Taster5;
Taster6vorher = Taster6;
// Punkte merken
Punktevorher = Punkte;
}