// выводим кастомные символы
#include <LiquidCrystal_I2C.h>
#include <Arduino.h>
#include <EncButton.h>
EncButton eb(2, 3, 4);
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte bell[] = {0x4, 0xe, 0xe, 0xe, 0x1f, 0x0, 0x4};
byte note[] = {0x2, 0x3, 0x2, 0xe, 0x1e, 0xc, 0x0};
byte clock[] = {0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0};
byte heart[] = {0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0};
byte duck[] = {0x0, 0xc, 0x1d, 0xf, 0xf, 0x6, 0x0};
byte check[] = {0x0, 0x1, 0x3, 0x16, 0x1c, 0x8, 0x0};
byte cross[] = {0x0, 0x1b, 0xe, 0x4, 0xe, 0x1b, 0x0};
short cursorX = 0;
short cursorY = 0;
/* переменная совпадения введенного пароля, как-то только введеный символ
не будет соответсвовать паролю мы поменяем значение на 0, если все символы
будут верны то значение останется неизменным и будет равно 1*/
bool password_is_correct = 1;
int i = 0;
// количество введенных символов
short symbols_input = 0;
char password[5] = "1234"; // переменная содержащая пароль
bool password_entered = 0; // 1 - пароль был введен успешно, 0 - пароль не был введен(или не был введен успешно)
// Настраиваем мембранную клавиатуру
// размеры клавиатуры
#define KP_ROWS 4
#define KP_COLS 4
// пины подключения (по порядку штекера)
byte colPins[KP_COLS] = {8, 7, 6, 5};
byte rowPins[KP_ROWS] = {12, 11, 10, 9};
// массив имён кнопок
char keys[KP_ROWS][KP_COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// подключаем либу
#include <SimpleKeypad.h>
// создаём клавиатуру
SimpleKeypad pad((char*)keys, rowPins, colPins, KP_ROWS, KP_COLS);
void setup() {
Serial.begin(115200);
// Encoder
EncButton eb(2, 3, 4, INPUT, INPUT_PULLUP);
// показаны значения по умолчанию
eb.setBtnLevel(LOW);
eb.setClickTimeout(500);
eb.setDebTimeout(50);
eb.setHoldTimeout(600);
eb.setStepTimeout(200);
eb.setEncReverse(0);
eb.setEncType(EB_STEP4_LOW);
eb.setFastTimeout(30);
// сбросить счётчик энкодера
eb.counter = 0;
// LCD - display
lcd.init(); // инициализация
lcd.backlight(); // включить подсветку
lcd.cursor();
lcd.createChar(7, cross);
lcd.setCursor(0, 0);
lcd.print("Enter password:");
lcd.setCursor(0, 1);
}
void loop() {
// получаем текущий сигнал с кнопки и энкодера
eb.tick();
// получить текущую нажатую клавишу
// вернёт 0 символ если ничего не нажато
char key = pad.getKey();
// если пароль не введён
if (!password_entered){
if (key){
lcd.print(key);
symbols_input++;
/* если какой-то из введенных символов не
соответсвует паролю - то пароль не верен и
меняем логическую переменную соответсвия введенного пароля на 0*/
if (password[i] != key){
password_is_correct = 0;
}
i++;
// если выходим за пределы второй строки, то возвращаем курсор обратно
cursorX++;
if (cursorX > 15){
cursorX = 0;
lcd.setCursor(cursorX, 1);
}
if (symbols_input == 4 && password_is_correct){
password_entered = 1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("correct!");
delay(300);
clear_lcd();
} else if(symbols_input == 4) {
symbols_input = 0;
// возвращаем переменной начальное значение
password_is_correct = 1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("uncorrect!");
delay(500);
lcd.setCursor(0, 0);
lcd.print("Enter password:");
lcd.setCursor(0, 1);
}
/* присваиваем переменной key значение 0, чтобы избежать двойного вывода
последнего символа пароля в условии if(password_entered)
после успешного ввода пароля*/
key = 0;
}
// если энкодер повернут
if (eb.turn()) {
// if encoder diection is negative
if (eb.dir() == -1){
cursorX++;
if (cursorX > 15){
cursorX = 0;
}
} else{
cursorX--;
if (cursorX < 0){
cursorX = 15;
}
}
lcd.setCursor(cursorX, 1);
}
}
if (password_entered){
// если энкодер повернут
if (eb.turn()) {
// if encoder diection is negative
if (eb.dir() == -1){
cursorX++;
if (cursorX > 15){
cursorY++;
cursorX = 0;
}
if (cursorY > 1){
cursorY = 0;
cursorX = 0;
}
} else{
cursorX--;
if (cursorX < 0){
cursorY++;
cursorX = 15;
}
if (cursorY > 1){
cursorY = 0;
cursorX = 15;
}
}
lcd.setCursor(cursorX, cursorY);
}
if (eb.press()){
lcd.write(7);
cursorX++;
if (cursorX > 15){
cursorY++;
cursorX = 0;
lcd.setCursor(cursorX, cursorY);
}
if (cursorY > 1){
cursorY = 0;
cursorX = 0;
lcd.setCursor(cursorX, cursorY);
}
}
// если кнопка нажата (не 0 символ)
if (key) {
cursorX++;
if (cursorX > 15){
cursorY++;
cursorX = 0;
lcd.setCursor(cursorX, cursorY);
}
if (cursorY > 1){
cursorY = 0;
cursorX = 0;
lcd.setCursor(cursorX, cursorY);
}
lcd.print(key);
}
if (eb.hold()){
clear_lcd();
}
}
}
void clear_lcd(){
lcd.clear();
lcd.setCursor(0,0);
cursorX = 0;
cursorY = 0;
}