#include <LiquidCrystal.h>
LiquidCrystal lcd ( 1,2,4,5,6,7);
int menu = 0; // für start Menu
char* Display_line1[]={ ">1.Memory", "1.Memory", ">3.Binarno","3.Binarno"};
char* Display_line2[]={ "2.KnockKnock", ">2.Knock-Knock", "4.leer",">4.leer"};
char* Display_action[]={ "MEMORY", "KnockKnock", "Binary->Decimal","nicht vorhanden"};
//vorhandene Spiel
int Binarno = 1;
int Memory = 0;
int KnockKnock = 1;
#define LED_RED 23
#define LED_GRUN 22
int Button[3]= {43,40,41};
int Leds[8]={37, 36, 35, 34, 33, 32,31,30};
int Button8[8]={ 44, 45, 46, 47, 48,49, 50, 51};
const int Relay=A3;
int randNumber=0;
int MemoryON = 0;
int KnockON = 0;
int BinarnoON = 0;
void setup() {
//Display
lcd.begin(16,2);
//Buttons
for (int i = 0; i < 3; i++){
pinMode(Button[i], INPUT_PULLUP); // Buttons UP, DOWN, ENTER
}
updateMenu();
for (int i = 0; i < 8; i++){
pinMode(Leds[i], OUTPUT);
pinMode(Button8[i],INPUT_PULLUP);
}
pinMode(LED_GRUN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(Relay,OUTPUT);
digitalWrite(Relay,LOW);
randomSeed(analogRead(0));
generateRandomSequence();
randNumber= random(1, 16);
}
void loop() {
digitalWrite(LED_RED,HIGH);
if (!digitalRead(Button[0]) && menu <3 ) { menu++; updateMenu(); }
else if(!digitalRead(Button[1]) && menu >0 ) { menu--; updateMenu(); }
else if (!digitalRead(Button[2]) ) { menuAction(); updateMenu(); }
while(!digitalRead(Button[0]) || !digitalRead(Button[1])|| !digitalRead(Button[2]));
BinarnoSpiel();
MemorySpiel();
KnockSpiel();
}
void Display(char* Zeile1, char* Zeile2, int Anzeigge_delay)
{
lcd.clear();
lcd.print(Zeile1);
lcd.setCursor(0, 1);
lcd.print(Zeile2);
delay(Anzeigge_delay);
}
void updateMenu(){
Display(Display_line1[menu],Display_line2[menu],100);
}
void nicht_vorhanden(){
Display("nicht vorhanden","",100);
}
void menuAction(){
Display (Display_action[menu],"",0);
switch (menu) {
case 0: MemoryON = Memory; if (Memory==0) nicht_vorhanden(); break;
case 1: KnockON = KnockKnock; if (KnockKnock==0) nicht_vorhanden(); break;
case 2: BinarnoON = Binarno; if (Binarno==0) nicht_vorhanden(); break;
case 3: break;
}delay(1500);
}
void digitalLedsWrite(int value, int max_count, int LEDdelay){
for (int i=0; i<max_count;i++){
digitalWrite(Leds[i],value);
delay(LEDdelay);
}
}
void showWinner(){
digitalWrite(LED_RED,LOW);
digitalWrite(LED_GRUN,HIGH);
digitalWrite(Relay,HIGH); //Box wird geoffnet
Display(" WINNER!!","",0);
digitalLedsWrite(0,8,0);//falls Leds von eine Spiel eingeschaltet geblieben sind
digitalLedsWrite(1,8,200);
digitalLedsWrite(0,8,200);
software_Reset();
}
void waitForButtonRelease() {
while (digitalRead(Button8[0]) == LOW || digitalRead(Button8[1]) == LOW || digitalRead(Button8[2]) == LOW ||
digitalRead(Button8[3]) == LOW || digitalRead(Button8[4]) == LOW || digitalRead(Button8[5]) == LOW || digitalRead(Button8[6]) == LOW || digitalRead(Button8[7]) == LOW) {
delay(100);
}
}
void software_Reset(){
//asm volatile (" jmp 0");
MemoryON = 0;
KnockON = 0;
BinarnoON = 0;
digitalWrite(LED_RED,LOW);
digitalWrite(LED_GRUN,LOW);
digitalWrite(Relay,LOW);
updateMenu();
}
unsigned int playerInput = 0;
void BinarnoSpiel(){
while(BinarnoON>=1){
BinarnoLCD();
LEDSbinarno(randNumber);
if (!digitalRead(Button[0])) { playerInput--; delay(100);}
if (!digitalRead(Button[1])) { playerInput++; delay(100);}
if (!digitalRead(Button[2]) && (playerInput == randNumber)) { showWinner(); delay(100); }
if (!digitalRead(Button[2]) && (playerInput != randNumber)) { BinarnoAGAIN(); delay(100); }
while(!digitalRead(Button[0]) || !digitalRead(Button[1])|| !digitalRead(Button[2]));
}
}
void LEDSbinarno(int randNumber) {
int binarno[4];
for(int i = 0; i < 4; i++) {
binarno[i] = randNumber % 2;
randNumber /= 2;
}
for(int i = 0; i < 4; i++) {
digitalWrite(Leds[i], binarno[i]);
}
}
void BinarnoAGAIN(){
Display("Das war falsch!!", "",2000 );
randNumber = random(1, 16);
LEDSbinarno(randNumber);
}
void BinarnoLCD(){
char PlayerInputChar[10];
itoa(playerInput, PlayerInputChar, 10);
Display("Binary->Decimal",PlayerInputChar,100);
}
const int knockSensor = A4;
const int zuVergleichen = 8; // empfindlichkeit
int knockSensorValue = 0;
int zaehler = 0;
long myTimer = 0;
long myTimeout = 250;
unsigned long previousMillis = 0;
int ledState = 0;
int blinkCount = 0;
unsigned long interval = 200; // wie schnell blinkt
unsigned long offInterval = 2000;
void KnockSpiel() {
while (KnockON >=1){
KnockLEDs();
knockSensorValue = analogRead(knockSensor);
digitalWrite(Leds[7], HIGH);
//wenn der vom Sensor erfasste Wert größer als die eingestellte Empfindlichkeit ist, startet er
if (knockSensorValue >= zuVergleichen) {
if (millis() - myTimer <= myTimeout) {
zaehler++;
} else {
zaehler = 0; //falls pause grosse als myTimeout wird wieder resetierr
}
myTimer = millis(); // Es merkt sich die Zeit wieder
digitalWrite(Leds[7], LOW);
delay(150);
if (zaehler == 3) {
showWinner();
}
}
}
}
void KnockLEDs() { //LEDs blinken um zu zeigen/helfen wie schnell ist es zum "knock-knock"
if (blinkCount < 4) {
if (millis() - previousMillis >= interval) {
previousMillis = millis();
ledState = ~ ledState;
if (ledState == 0) {
blinkCount++;
}
digitalLedsWrite(ledState,4,0);
}
} else{
if (millis() - previousMillis >= offInterval) {
previousMillis = millis();
blinkCount = 0; //
}
digitalLedsWrite(ledState,4,0);
}
}
int MemoryPunkte = 0; //wie viel Punke, je Level richtig = +2 boda
int sequence[10]; //speicher zufählige Schritte
int sequenceLength = 0; // Wie viele LEDs sind zum merken
void MemorySpiel(){
while (MemoryON >= 1){
MemoryLCD();
MemoryLEDs();
if (MemoryCheck()) {
sequenceLength++;
generateRandomStep();
delay(1000);
} else { MemoryAGAIN(); }
MemoryEND(); // falls memoryPunkte>=6
}
}
void MemoryLCD(){
char MPunkte [10];
itoa(MemoryPunkte, MPunkte, 10);
Display("PUNKTE:",MPunkte,0);
}
void MemoryEND(){
if ( MemoryPunkte >= 6){
MemoryON = 0;
showWinner();
}
}
void generateRandomSequence() {
for (int i = 0; i <10; i++) {
sequence[i] = random(1, 9); // ledovi+1
}
}
void generateRandomStep() {
sequence[sequenceLength] = random(1, 9);
sequenceLength++;
}
void MemoryLEDs() { // zeigt welche LED ist zum merken
for (int i = 0; i < sequenceLength; i++) {
int currentLED = sequence[i];
digitalWrite(currentLED + 29, HIGH); //29 = PIN wo erste LED angeschlossen ist + "-1"
delay(500);
digitalWrite(currentLED + 29, LOW);
delay(250);
}
}
bool MemoryCheck() {
MemoryPunkte = 0; // Punkte zurücksetzen
while (MemoryPunkte < sequenceLength) {
for (int i=0;i<8;i++){
if (digitalRead(Button8[i]) == LOW) {
waitForButtonRelease();
if (sequence[MemoryPunkte] == i+1) {
MemoryPunkte++;
} else {return false;}
}
}
}
return true; // spieler wiederholt Reihe rictig
}
void MemoryAGAIN(){
// Leds blinken zu zeigen das man verloler hat, fang von vorne an mit neu random sequence
for (int i = 0; i < 3; i++) {
digitalLedsWrite(1,8,0);
delay(400);
digitalLedsWrite(0,8,0);
delay(400);
}
sequenceLength = 0;
MemoryPunkte = 0;
generateRandomSequence();
delay(1000);
}