/*
HACK THE CODE / MASTERMIND-PRINZIP
--OWNER--
Bei Programmstart >3x drücken
Ownermodus im Display
Owner-Code eingabe
Code = 7218
--LED--
GRÜN PIN 5,6,7,8
ROT PIN 9,10,11,12
--ENCODER--
CLK = 2
DT = 3
SW = 4
--SERVO--
servo_pin = A0
--DISPLAY--
SDA = A4
SCL = A5
*/
// Display 16x2 IC2
#include <LiquidCrystal_I2C.h>
int totalColumns = 16;
int totalRows = 2;
int scroll_time=150;
LiquidCrystal_I2C lcd(0x27, totalColumns, totalRows);
//
// Servo PIN A0
#include <Servo.h>
Servo servo;
byte servo_pin=A0;
byte servo_open=55;
byte servo_close=75;
//
// Encoder
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define ENCODER_SW 4
int lastClk = HIGH;
//
//
// LED / CODE /
byte code_eingabe[4]={0,0,0,0};
byte code[4]={0,0,0,0};
String code_owner="7218";
byte LED_G[4]={5,6,7,8};
byte LED_R[4]={9,10,11,12};
byte owner_count=0;
byte pin;
int pos=0;
byte code_pos=6;
bool pressed=false;
bool blink=false;
bool check=false;
bool code_richtig=false;
bool restart=false;
bool open=false;
bool anzeige=false;
bool start_=false;
long akt_millis;
long blinken=300;
long anzeige_millis;
int counter = 0;
// static Values
const static int PLAY = 1;
const static int CHECK = 2;
const static int WIN = 3;
const static int RESET = 4;
const static int START = 5;
const static int OPEN = 6;
const static int ENDE = 7;
const static int LOST = 8;
const static int OWNER = 9;
const static int LEER_3 = 10;
int state;
//Texte
String Start_txt_1 = "HALLO ZU walkaholic's LET's PLAY #6 GCXXXXX";
String Start_txt_2= "DAS SPIELPRINZIP FOLGT DEM VON MASTERMIND! STELLT DEN CODE DURCH DREHEN EIN. DURCH DRUECKEN BESTAETIGT IHR DIE EINGABE! DIE LED ZEIGT EUCH DEN STATUS DES CODES AN!";
//"LED-GRUEN = ZIFFER RICHIG! / LED-ROT = ZIFFER FALSCH! / LED-ROT-GRUEN = ZIFFER RICHTIG, ABER AN FALSCHER STELLE!";
void setup()
{
Serial.begin(115200);
//Serial.println(Start_txt_1.length());
//Serial.println(Start_txt_2.length());
// Initialize LCD
lcd.init();
lcd.backlight();
//randomSeed(A6);
// PINS
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
// LED
for (byte i=0; i<=3; i++)
{
pinMode(LED_G[i], OUTPUT);
pinMode(LED_R[i], OUTPUT);
}
programm_startet();
}
void check_owner()
{
if(digitalRead(ENCODER_SW)==LOW && pressed==false)
{
owner_count++;
pressed=true;
}
if(digitalRead(ENCODER_SW)==HIGH && pressed==true)
{
pressed=false;
}
}
void start()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" GCXXXXX ");
lcd.setCursor(0,1);
lcd.print(" HACK THE CODE ");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" a cache by ");
lcd.setCursor(0,1);
lcd.print(" walkaholic ");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" HACK THE CODE ");
lcd.setCursor(0,1);
lcd.print(" PRESS TO START ");
while (state==START) {
if(digitalRead(ENCODER_SW)==LOW) {
randomSeed(millis());
/* for (byte i=0; i<=3; i++)
{
//code[i]=random(0,10);
//Serial.print(code[i]);Serial.print(",");
}
*/
code[0]=2;code[1]=3;code[2]=6;code[3]=3;
/*
while(code[3]==0) {
int zahl=random(0,10);
for(byte i=0; i<=3; i++) {
if(code[i]==zahl) {
break;
}
if(code[i]==0) {
code[i]=zahl;
//Fragen_Nummer=zahl;
Serial.print(code[i]);
if(code[3]!=0) {
Serial.println();
}
break;
}
}
}
*/
state=PLAY;
lcd.setCursor(0,1);
lcd.print(" ---- ");
delay(500);
}
}
}
void ende()
{
blink_win();
anzeige_win();
}
void reset()
{
if (digitalRead(ENCODER_SW)==LOW && pressed==false)
{
lcd.clear();
restart=false;
check=false;
code_richtig=false;
code_pos=6;
counter=0;
pos=0;
for(byte i=0; i<=3; i++)
{
digitalWrite(LED_G[i], LOW);
digitalWrite(LED_R[i], LOW);
}
delay(200);
lcd.setCursor(1,0);
lcd.print("HACK THE CODE");
lcd.setCursor(6,1);
lcd.print("----");
state=PLAY;
}
}
void oeffnen(byte pin)
{
servo.attach(pin);
servo.write(servo_open);
delay(1000);
servo.write(servo_close);
delay(1000);
servo.detach();
}
void win()
{
lcd.clear();
lcd.setCursor(2,0);
lcd.print("CODE CORRECT");
lcd.setCursor(0,1);
lcd.print("DRESOR OPEN NOW");
delay(2000);
for(byte i=0; i<=3; i++)
{
digitalWrite(LED_G[i], LOW);
digitalWrite(LED_R[i], LOW);
}
oeffnen(servo_pin);
delay(2000);
state=ENDE;
}
void lost()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("CODE IST FALSCH");
lcd.setCursor(1,1);
lcd.print("PRESS TO START");
state=RESET;
}
void loop()
{
if(digitalRead(ENCODER_SW)==HIGH && pressed==true)
{
pressed=false;
}
switch (state)
{
case START: start(); break;
case PLAY: play(); break;
case WIN: win(); break;
case LOST: lost(); break;
case RESET: reset(); break;
case ENDE: ende(); break;
case OWNER: owner(); break;
}
}