//Libaries----------------------------------------------------------------------
//Display
#include <Wire.h> // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h>
//Pre-Definitions---------------------------------------------------------------
LiquidCrystal_I2C lcd(0x27, 16, 2); //Hier wird festgelegt um was für einen Display es sich handelt. In diesem Fall eines mit 16 Zeichen in 2 Zeilen und der HEX-Adresse 0x27. Für ein vierzeiliges I2C-LCD verwendet man den Code "LiquidCrystal_I2C lcd(0x27, 20, 4)"
//Ultraschallsensor
#define PIN_TRIGGER 7//Ultraschall Sender Pin
#define PIN_ECHO 6//Ultraschall Empfänger Pin
//Potentiometer
#define PIN_POTENTIOMETER A7
//Noten-Definition8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_E6 1319
#define NOTE_G6 1568
#define REST 0
//Variablen Songs
int pink_panther_melody[] = {
REST, REST, REST, NOTE_DS4,
NOTE_E4, REST, NOTE_FS4, NOTE_G4, REST, NOTE_DS4,
NOTE_E4, NOTE_FS4, NOTE_G4, NOTE_C5, NOTE_B4, NOTE_E4, NOTE_G4, NOTE_B4,
NOTE_AS4, NOTE_A4, NOTE_G4, NOTE_E4, NOTE_D4,
NOTE_E4, REST, REST, NOTE_DS4,
NOTE_E4, REST, NOTE_FS4, NOTE_G4, REST, NOTE_DS4,
NOTE_E4, NOTE_FS4, NOTE_G4, NOTE_C5, NOTE_B4, NOTE_G4, NOTE_B4, NOTE_E5,
NOTE_DS5,
NOTE_D5, REST, REST, NOTE_DS4,
NOTE_E4, REST, NOTE_FS4, NOTE_G4, REST, NOTE_DS4,
NOTE_E4, NOTE_FS4, NOTE_G4, NOTE_C5, NOTE_B4, NOTE_E4, NOTE_G4, NOTE_B4,
NOTE_AS4, NOTE_A4, NOTE_G4, NOTE_E4, NOTE_D4,
NOTE_E4, REST,
REST, NOTE_E5, NOTE_D5, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_E4,
NOTE_AS4, NOTE_A4, NOTE_AS4, NOTE_A4, NOTE_AS4, NOTE_A4, NOTE_AS4, NOTE_A4,
NOTE_G4, NOTE_E4, NOTE_D4, NOTE_E4, NOTE_E4, NOTE_E4
};
int pink_panther_durations[] = {
2, 4, 8, 8,
4, 8, 8, 4, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
2, 16, 16, 16, 16,
2, 4, 8, 4,
4, 8, 8, 4, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
1,
2, 4, 8, 8,
4, 8, 8, 4, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
2, 16, 16, 16, 16,
4, 4,
4, 8, 8, 8, 8, 8, 8,
16, 8, 16, 8, 16, 8, 16, 8,
16, 16, 16, 16, 16, 2
};
int tetris_melody[] = {
NOTE_E5, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_C5, NOTE_B4,
NOTE_A4, NOTE_A4, NOTE_C5, NOTE_E5, NOTE_D5, NOTE_C5,
NOTE_B4, NOTE_C5, NOTE_D5, NOTE_E5,
NOTE_C5, NOTE_A4, NOTE_A4, NOTE_A4, NOTE_B4, NOTE_C5,
NOTE_D5, NOTE_F5, NOTE_A5, NOTE_G5, NOTE_F5,
NOTE_E5, NOTE_C5, NOTE_E5, NOTE_D5, NOTE_C5,
NOTE_B4, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_E5,
NOTE_C5, NOTE_A4, NOTE_A4, REST,
NOTE_E5, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_C5, NOTE_B4,
NOTE_A4, NOTE_A4, NOTE_C5, NOTE_E5, NOTE_D5, NOTE_C5,
NOTE_B4, NOTE_C5, NOTE_D5, NOTE_E5,
NOTE_C5, NOTE_A4, NOTE_A4, NOTE_A4, NOTE_B4, NOTE_C5,
NOTE_D5, NOTE_F5, NOTE_A5, NOTE_G5, NOTE_F5,
NOTE_E5, NOTE_C5, NOTE_E5, NOTE_D5, NOTE_C5,
NOTE_B4, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_E5,
NOTE_C5, NOTE_A4, NOTE_A4, REST,
NOTE_E5, NOTE_C5,
NOTE_D5, NOTE_B4,
NOTE_C5, NOTE_A4,
NOTE_GS4, NOTE_B4, REST,
NOTE_E5, NOTE_C5,
NOTE_D5, NOTE_B4,
NOTE_C5, NOTE_E5, NOTE_A5,
NOTE_GS5
};
int tetris_durations[] = {
4, 8, 8, 4, 8, 8,
4, 8, 8, 4, 8, 8,
4, 8, 4, 4,
4, 4, 8, 4, 8, 8,
4, 8, 4, 8, 8,
4, 8, 4, 8, 8,
4, 8, 8, 4, 4,
4, 4, 4, 4,
4, 8, 8, 4, 8, 8,
4, 8, 8, 4, 8, 8,
4, 8, 4, 4,
4, 4, 8, 4, 8, 8,
4, 8, 4, 8, 8,
4, 8, 4, 8, 8,
4, 8, 8, 4, 4,
4, 4, 4, 4,
2, 2,
2, 2,
2, 2,
2, 4, 8,
2, 2,
2, 2,
4, 4, 2,
2
};
int pacman_melody[] = {
NOTE_B4, NOTE_B5, NOTE_FS5, NOTE_DS5,
NOTE_B5, NOTE_FS5, NOTE_DS5, NOTE_C5,
NOTE_C6, NOTE_G6, NOTE_E6, NOTE_C6, NOTE_G6, NOTE_E6,
NOTE_B4, NOTE_B5, NOTE_FS5, NOTE_DS5, NOTE_B5,
NOTE_FS5, NOTE_DS5, NOTE_DS5, NOTE_E5, NOTE_F5,
NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_B5
};
int pacman_durations[] = {
16, 16, 16, 16,
32, 16, 8, 16,
16, 16, 16, 32, 16, 8,
16, 16, 16, 16, 32,
16, 8, 32, 32, 32,
32, 32, 32, 32, 32, 16, 8
};
String songNames[] = {"Pink Panther", "Tetris", "Pacman"};
int pickedSong = 0;
int mode = 0;
int i = 0;
//8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
//Variablen----------------------------------------------------------------------
String safe_password = "1";//tatsächliches Passwort des 1-digit Schlosses
String choosen_number;//ausgesuchte Eingabe Zahl/Passwort
long number_failures = 0;//Fehleingaben
unsigned long duration;//Ultraschall
unsigned int distance;//abstand ultraschall
long enabledDisplay = 0;//Display Status durch Ultraschall/Entfernung
const int SENSOR_TRIGGER_RANGE = 100;//100cm Abstand
long unlocked = 0;
void setup() {
Serial.begin(9600);
pinMode(10, OUTPUT);//Led 1
pinMode(11, OUTPUT);//Led 2
pinMode(12, OUTPUT);//Led 3
pinMode(2, INPUT);//Button Confirm
digitalWrite(2, LOW);
pinMode(PIN_TRIGGER, OUTPUT);//Ultraschall Sender
pinMode(PIN_ECHO, INPUT);//Ultraschall Empfänger
lcd.init(); //Im Setup wird der LCD gestartet
lcd.backlight();
}
void loop() {
if (unlocked == 0){
s_MainMenu();
}
else{
j_loop();
}
}
//Voids------------------------------------------------------------------------------------------
void s_MainMenu(){
if (enabledDisplay == 0){
lcd.noDisplay();
lcd.noBacklight();
checkEnvironment();
}
else{
lcd.display();
lcd.backlight();
lcd.setCursor(0, 0); //Hier wird die Position des ersten Zeichens festgelegt. In diesem Fall bedeutet (0,0) das erste Zeichen in der ersten Zeile.
lcd.print("Password: ");
if (digitalRead(2) == LOW){
lcd.setCursor(0, 1); // In diesem Fall bedeutet (0,1) das erste Zeichen in der zweiten Zeile.
lcd.print(chooseNumber());
}
else{
checkForPassword();
delay(100);
}
}
}
//8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
void j_loop() {
if (mode == 0) {
j_MainMenu();
if (digitalRead(2) == HIGH) {
mode = 1;
i=0;
delay(500);
}
} else if (mode == 1) {
if (digitalRead(2) == HIGH) {
i=0;
mode=0;
delay(500);
lcd.clear();
return;
}
if (pickedSong == 0) j_play_pink_panther();
else if (pickedSong == 1) j_play_tetris();
else if (pickedSong == 2) j_play_pacman();
}
}
void j_MainMenu() {
lcd.setCursor(0, 0);
lcd.print("Main Menu");
lcd.setCursor(0, 1);
lcd.print(songNames[pickedSong]);
int messwert = analogRead(7);
if (messwert < 300 && messwert >= 0 && pickedSong != 0) {
lcd.clear();
pickedSong = 0;
} else if (messwert < 660 && messwert > 330 && pickedSong != 1) {
lcd.clear();
pickedSong = 1;
} else if (messwert < 1050 && messwert > 700 && pickedSong != 2) {
lcd.clear();
pickedSong = 2;
}
}
void j_play_pink_panther() {
int size = sizeof(pink_panther_durations) / sizeof(int);
if (i == size) { mode=0; lcd.clear(); return; }
if (i == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pink Panther");
}
lcd.setCursor(15-String(i).length()-String(size).length(), 1);
lcd.print(i);
lcd.print("/");
lcd.print(sizeof(pink_panther_melody) / sizeof(int));
int duration = 1000 / pink_panther_durations[i];
tone(4, pink_panther_melody[i], duration);
delay(duration*1.3);
noTone(4);
i+=1;
}
void j_play_tetris() {
int size = sizeof(tetris_durations) / sizeof(int);
if (i == size) { mode=0; lcd.clear(); return; }
if (i == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tetris");
}
lcd.setCursor(15-String(i).length()-String(size).length(), 1);
lcd.print(i);
lcd.print("/");
lcd.print(sizeof(tetris_melody) / sizeof(int));
int duration = 1000 / tetris_durations[i];
tone(4, tetris_melody[i], duration);
delay(duration*1.3);
noTone(4);
i+=1;
}
void j_play_pacman() {
int size = sizeof(pacman_durations) / sizeof(int);
if (i == size) { mode=0; lcd.clear(); return; }
if (i == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pacman");
}
lcd.setCursor(15-String(i).length()-String(size).length(), 1);
lcd.print(i);
lcd.print("/");
lcd.print(sizeof(pacman_melody) / sizeof(int));
int duration = 1000 / pacman_durations[i];
tone(4, pacman_melody[i], duration);
delay(duration*2);
noTone(4);
i+=1;
}
//8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
//Functions---------------------------------------------------------------------------------------
String checkEnvironment(){//Display automatisches An/Auschalten - Stromsparen
digitalWrite(PIN_TRIGGER, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIGGER, HIGH);
delayMicroseconds(10);
duration = pulseIn(PIN_ECHO, HIGH);
distance = duration/58;
if (distance > SENSOR_TRIGGER_RANGE || distance <= 0){
Serial.print("Keiner da!");
}
else {
enabledDisplay = 1;//lcd geht an
}
delay(500);
return;
}
String chooseNumber(){//Potentiometer Zahl für 1-digit Schloss aussuchen
int treshold = 0;
treshold = analogRead(A7);
switch(treshold){
case 0 ... 98:
choosen_number = "0";
break;
case 100 ... 198:
choosen_number = "1";
break;
case 200 ... 298:
choosen_number = "2";
break;
case 300 ... 398:
choosen_number = "3";
break;
case 400 ... 498:
choosen_number = "4";
break;
case 500 ... 598:
choosen_number = "5";
break;
case 600 ... 698:
choosen_number = "6";
break;
case 700 ... 798:
choosen_number = "7";
break;
case 800 ... 898:
choosen_number = "8";
break;
case 900 ... 1000:
choosen_number = "9";
break;
}
return choosen_number;
}
String checkForPassword(){//Überprüfung auf Passwortübereinstimmung
if (choosen_number == safe_password){
//Spiele Musik
Serial.println("Geöffnet");
unlocked = 1;
}
else{
switch(number_failures){
case 2 ... 3:
number_failures = 3;
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
Serial.println("Gesperrt, Verständigen sie den Direktor");
break;
case 1:
number_failures = 2;
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
Serial.println("2mal falsch");
break;
case 0:
number_failures = 1;
digitalWrite(10, HIGH);
Serial.println("1mal falsch");
break;
}
}
return;
}
/*
9 Zahlen 999
0 0 , 90, 100
1 100, 190, 222
2 200, 322, 333
3 300, 433,
4 400, 544
5 500, 655
6 600, 766
7 700, 877
8 800, 890
9 900, 1000
*/