#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Servo.h>
# define clkPin 2
# define dtPin 3
# define swPin 4
# define buzPin 10
// servo pin = 9
Servo myservo;
int servoPos = 0;
int lastState;
int state;
int counter = 0;
bool debounce = false;
bool pressed = false;
int curZnak = 0;
int LzadavaniKodu = 0;
int zadavaniKodu = 3;
int maxPocetZnaku = 4;
bool textOnScreen = false;
int code[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int pressedButtons[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
pinMode(dtPin, INPUT);
pinMode(swPin, INPUT_PULLUP);
pinMode(buzPin, OUTPUT);
myservo.attach(9);
myservo.write(90);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(0);
Serial.begin (9600);
}
void loop() {
// put your main code here, to run repeatedly:
debounce = digitalRead(swPin);
if (digitalRead(swPin) == 0 && debounce == 1) {
pressed = !pressed;
debounce = 0;
if (textOnScreen == false){
if (zadavaniKodu == 1 && LzadavaniKodu == 1) {
code[curZnak] = counter;
curZnak += 1;
lcd.setCursor(0, 0);
lcd.print("Nastavit kod:");
lcd.setCursor(curZnak, 1);
lcd.print(counter);
if (curZnak + 1 > maxPocetZnaku) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Kod nastaven!");
myservo.write(0);
textOnScreen = true;
curZnak = 0;
zadavaniKodu = 0;
delay(600);
lcd.clear();
//Debug
for (int i = 0; i < 4; i++) {
Serial.println(code[i]);
}
}
}
if (zadavaniKodu == 0 && LzadavaniKodu == 0) {
pressedButtons[curZnak] = counter;
curZnak += 1;
lcd.setCursor(0, 0);
lcd.print("Zadat kod:");
lcd.setCursor(curZnak, 1);
lcd.print(counter);
if (curZnak + 1 > maxPocetZnaku){
lcd.setCursor(0, 0);
int spravne = 0;
for (int i = 0; i < maxPocetZnaku; i++) {
Serial.println(pressedButtons[i]);
if (pressedButtons[i] == code[i]){
spravne += 1;
}
}
//reset
for (int i = 0; i < maxPocetZnaku; i++){
pressedButtons[i] = 0;
}
curZnak = 0;
if (spravne == maxPocetZnaku){
lcd.print("Kod je spravne!");
tone(buzPin, 1000);
delay(800);
noTone(buzPin);
textOnScreen = true;
myservo.write(90);
zadavaniKodu = 2;
}else{
lcd.print("Kod je spatne!");
textOnScreen = true;
myservo.write(0);
delay(1500);
}
curZnak = 0;
}
}
if (zadavaniKodu == 2 && LzadavaniKodu == 2){
lcd.clear();
curZnak = 0;
if (counter == 1){
for (int i = 0; i < 12; i++){
code[i] = 0;
pressedButtons[i] = 0;
}
zadavaniKodu = 3;
lcd.setCursor(0,0);
lcd.print("Digits 4-12");
lcd.setCursor(0,1);
lcd.print(constrain(counter, 4, 12));
}
if (counter == 0){ // zamknout
zadavaniKodu = 0;
myservo.write(0);
}
}
if (zadavaniKodu == 3 && LzadavaniKodu == 3){
lcd.clear();
lcd.print("P znaku nastaven");
textOnScreen = true;
curZnak = 0;
zadavaniKodu = 1;
}
} // Konec textOnScreen
if (textOnScreen == true){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Otoc enkoderem");
}
Serial.println(curZnak);
}
state = digitalRead(dtPin);
if (state != lastState) {
if (digitalRead(clkPin) != state) {
counter -= 1;
}
else {
counter += 1;
}
counter = constrain(counter, 0, 9);
//Serial.println(counter);
if (zadavaniKodu == 1) {
if (curZnak + 1 < maxPocetZnaku) {
lcd.clear();
for (int i = 0; i < curZnak; i++) {
lcd.setCursor(i, 1);
lcd.print(code[i]);
}
lcd.setCursor(0, 0);
lcd.print("Nastavit kod:");
lcd.setCursor(curZnak, 1);
lcd.print(counter);
}
}
if (zadavaniKodu == 0) {
if (curZnak + 1 < maxPocetZnaku) {
lcd.clear();
for (int i = 0; i < curZnak; i++) {
lcd.setCursor(i, 1);
lcd.print(pressedButtons[i]);
}
lcd.setCursor(0, 0);
lcd.print("Zadat kod:");
lcd.setCursor(curZnak, 1);
lcd.print(counter);
}
}
if (zadavaniKodu == 2){
Serial.println("POo");
counter = constrain(counter, 0, 1);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("1 novy kod 0 zamknout");
textOnScreen = true;
lcd.setCursor(0,1);
lcd.print(counter);
}
if (zadavaniKodu == 3){
counter = constrain(counter, 4, 12);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Digits 4-12");
textOnScreen = true;
lcd.setCursor(0,1);
lcd.print(counter);
maxPocetZnaku = counter;
}
Serial.print("Cur znak: ");
Serial.println(curZnak);
Serial.print("Zadavani kodu: ");
Serial.println(zadavaniKodu);
textOnScreen = false;
}
lastState = state;
LzadavaniKodu = zadavaniKodu;
}