#include <Keypad.h>
#include <TM1637TinyDisplay.h>
// Przyciski klawiatury
const byte rows = 4;
const byte cols = 3;
const char keys[rows][cols] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
// Mapowanie przycisków na piny
byte rowPins[rows] = {12, 8, 7, 6};
byte colPins[cols] = {5, 4, 3};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);
// Piny wyświetlacza
#define CLK 13
#define DIO 2
TM1637TinyDisplay display(CLK, DIO);
// Piny odpowiedzialne za świecenie
const int RED_PIN = 9;
const int GREEN_PIN = 10;
const int BLUE_PIN = 11;
// Buzzer
const int buzzerPin = A0;
// Zmienne
bool isCodeCorrect = false;
bool isBlocked = false;
byte attemptCounter = 0;
byte code[4] = {1, 2, 3, 5};
byte inputCode[4] = {};
void setup() {
Serial.begin(9600); // Inicjalizacja komunikacji szeregowej
display.setBrightness(0x0f); // Maksymalna jasność wyświetlacza
display.begin();
pinMode(buzzerPin, OUTPUT); // Ustawienie pinów w tryb wyjścia
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
Serial.println("* - start entering code");
Serial.println("# - additional options (available after unlocking)\n");
}
// Funkcja do koloru ustawiania świecenia
void setColor(int r, int g, int b) {
analogWrite(RED_PIN, r);
analogWrite(GREEN_PIN, g);
analogWrite(BLUE_PIN, b);
}
// Mruganie
void RGBLightWarning(int r, int g, int b, bool alert) {
if (alert) {
tone(buzzerPin, 2000); // uruchomienie buzzera
setColor(r, g, b); // włączenie świecenia
delay(300); // po 300 ms
noTone(buzzerPin); // wyłączenie buzzera
setColor(0, 0, 0); // wyłączenie świecenia
delay(300); // po 300 ms
tone(buzzerPin, 2000); // powtórzenie cyklu
setColor(r, g, b);
delay(300);
noTone(buzzerPin);
setColor(0, 0, 0);
delay(300);
tone(buzzerPin, 2000);
setColor(r, g, b);
delay(300);
noTone(buzzerPin);
setColor(0, 0, 0);
delay(300);
}
else {
tone(buzzerPin, 500);
delay(300);
noTone(buzzerPin);
setColor(r, g, b);
delay(300);
setColor(0, 0, 0);
delay(300);
setColor(r, g, b);
delay(300);
setColor(0, 0, 0);
delay(300);
setColor(r, g, b);
delay(300);
setColor(0, 0, 0);
delay(300);
}
}
void loop() {
char beginInputKey = keypad.getKey(); // Oczekiwanie na wciśnięcie przycisku
if (beginInputKey != NO_KEY) {
Serial.println(beginInputKey);
}
// * -- start wpisywania
if (beginInputKey == '*' && !isBlocked && !isCodeCorrect) {
Serial.println("INSERT CODE:\n");
while (attemptCounter < 3) {
attemptCounter++; // numer próby
// Wpisywanie 4 cyfr
for (byte i = 0; i < 4; i++) {
// Oczekiwanie na wciśnięcie przycisku z cyfrą
char singleDigitInput = keypad.getKey();
while (singleDigitInput < '0' || singleDigitInput > '9') {
singleDigitInput = keypad.getKey();
}
inputCode[i] = singleDigitInput - '0';
display.showNumber(inputCode[i], false, 1, i); // wyświetlenie liczby na wyświetlaczu
setColor(255, 0, 255); // świecenie jako potwierdzenie podania liczby
delay(300);
setColor(0, 0, 0);
}
isCodeCorrect = true; // założenie, że wprowadzono poprawne dane
for (byte i = 0; i < 4; i++) {
if (code[i] != inputCode[i] && attemptCounter < 3) {
isCodeCorrect = false; // weryfikacja
Serial.println("Code invalid! Attempts left:");
Serial.println(3 - attemptCounter);
Serial.println("\n");
display.clear();
tone(buzzerPin, 1000); // dźwięk ostrzeżenia
setColor(255, 125, 0); // chwilowo żółte światło
delay(300);
noTone(buzzerPin);
setColor(0, 0, 0);
break;
}
else if (code[i] != inputCode[i] && attemptCounter >= 3) {
isCodeCorrect = false; // trzecie błędne wpisanie bez ostrzeżena
}
}
if (!(isCodeCorrect) && attemptCounter >= 3) {
isBlocked = true;
}
// Jeśli wpisano poprawny kod - mruganie na zielono 3 razy
if (isCodeCorrect) {
Serial.println("CODE IS CORRECT!\n");
display.clear();
RGBLightWarning(0, 255, 0, false);
attemptCounter = 0;
isBlocked = false;
memset(inputCode, 0, sizeof(inputCode)); // czyszczenie
break;
}
// Jeśli nie wpisano poprawnego kodu 3-krotnie - mruganie na czerwono
else if (isBlocked) {
Serial.println("BLOCKED!\n");
display.clear();
RGBLightWarning(255, 0, 0, true);
attemptCounter = 0;
memset(inputCode, 0, sizeof(inputCode));
break;
}
}
}
// Na odblokowanym urządzeniu
else if (isCodeCorrect && beginInputKey == '#' && !isBlocked) {
Serial.println("* - more options");
Serial.println("# - undo\n");
while (true) {
char menuKey = keypad.getKey();
if (menuKey == '*') { // operacja
Serial.println("0 - reset");
Serial.println("1 - new code");
Serial.println("# - undo\n");
char subKey = keypad.getKey();
while (subKey != '0' && subKey != '1' && subKey != '#') {
subKey = keypad.getKey();
}
if (subKey == '0') { // reset -- powrót do początku
Serial.println("RESET!\n");
tone(buzzerPin, 500);
delay(300);
noTone(buzzerPin);
isCodeCorrect = false;
RGBLightWarning(255, 125, 0, false);
memset(inputCode, 0, sizeof(inputCode));
break;
}
else if (subKey == '1') { // zmiana kodu
Serial.println("ENTER NEW CODE:\n");
for (int i = 0; i < 4; i++) {
char digit = keypad.getKey();
while (digit < '0' || digit > '9') {
digit = keypad.getKey();
}
code[i] = digit - '0';
display.showNumber(code[i], false, 1, i);
setColor(255, 0, 255); // świecenie jako potwierdzenie podania liczby
delay(300);
setColor(0, 0, 0);
}
Serial.println("CODE CHANGED :)\n");
display.clear();
tone(buzzerPin, 500);
delay(300);
noTone(buzzerPin);
break;
}
else if (subKey == '#') { // cofnij
setColor(50, 255, 50);
delay(300);
setColor(0, 0, 0);
break;
}
}
else if (menuKey == '#') { // cofnij
setColor(50, 255, 100);
delay(300);
setColor(0, 0, 0);
break;
}
}
}
// Chęć wykonania operacji na zablokowanym urządzeniu
else if ((beginInputKey == '*' || beginInputKey == '#') && isBlocked) {
Serial.println("BLOCKEDD!\n");
RGBLightWarning(255, 0, 0, true);
}
}