#include <EEPROM.h> // Бібліотека для роботи з EEPROM
#include <LiquidCrystal_I2C.h> // Бібліотека для роботи з LCD через I2C
#include <Encoder.h> // Бібліотека для роботи з роторним енкодером
// Ініціалізація LCD дисплея з I2C
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); // Адреса I2C, 16x2 символів
// Піни роторного енкодера
#define pinCLK 2
#define pinDT 3
#define pinSW 4
Encoder rotary(pinCLK, pinDT); // Ініціалізація роторного енкодера
// Адреса EEPROM, куди зберігається пароль
const int eepromAddress = 0;
const int maxPasswordLength = 8; // Максимальна довжина пароля
// Змінна для відстеження останнього значення роторного енкодера
static long lastCounter = 0;
// Змінна для відстеження поточного режиму меню
int mode = 0; // Режими: 0 - Головне меню, 1 - Додавання пароля, 2 - Перегляд пароля
void setup() {
// Налаштування кнопки роторного енкодера
pinMode(pinSW, INPUT_PULLUP);
// Ініціалізація LCD дисплея
lcd.init();
lcd.backlight(); // Увімкнення підсвічування LCD
// Відображення початкового меню
lcd.setCursor(0, 0);
lcd.print("Menu ->");
// Ініціалізація монітора порту
Serial.begin(9600);
}
void loop() {
// Отримання поточного значення роторного енкодера
int currentCounter = rotary.read() >> 2;
int chec = abs(currentCounter % 2); // Обчислення змінної для вибору пункту меню
// Якщо значення роторного енкодера змінилося, оновлюємо меню
if (lastCounter != currentCounter) {
displayMenu(chec); // Відображаємо меню
lastCounter = currentCounter; // Оновлюємо останнє значення
}
// Перевірка натискання кнопки роторного енкодера
if (digitalRead(pinSW) == LOW) {
switch (chec) {
case 0: // Додавання пароля
mode = 1; // Встановлюємо режим додавання пароля
lcd.clear();
lcd.print("Enter password:"); // Запитуємо пароль
Serial.println("Enter password: "); // Виводимо інструкцію в монітор порту
delay(500); // Затримка для стабільності
break;
case 1: // Перегляд пароля
mode = 2; // Встановлюємо режим перегляду пароля
lcd.clear();
lcd.print("Last password:"); // Відображаємо минулий пароль
lcd.setCursor(0, 1);
lcd.print(readPassword()); // Зчитування та відображення з EEPROM
delay(3000); // Затримка перед поверненням у головне меню
mode = 0; // Встановлюємо режим головного меню
displayMenu(chec); // Оновлюємо меню
break;
}
}
// Якщо режим додавання пароля і є дані у моніторі порту
if (mode == 1 && Serial.available() > 0) {
String password = Serial.readStringUntil('\n'); // Зчитування вводу
Serial.print("Введений пароль: ");
Serial.println(password);
if (password.length() > maxPasswordLength) {
password = password.substring(0, maxPasswordLength); // Обрізка до 8 символів
}
storePassword(password); // Зберігання в EEPROM
lcd.clear();
lcd.print("Password saved!"); // Підтвердження збереження пароля
delay(2000); // Затримка перед поверненням у головне меню
mode = 0; // Повернення у головне меню
displayMenu(chec); // Оновлюємо меню
}
}
// Функція збереження пароля в EEPROM
void storePassword(String password) {
int len = password.length();
for (int i = 0; i < len; i++) {
EEPROM.write(eepromAddress + i, password[i]);
}
EEPROM.write(eepromAddress + len, '\0'); // Кінець рядка
}
// Функція зчитування пароля з EEPROM
String readPassword() {
String password = "";
int i = 0;
while ((char)EEPROM.read(eepromAddress + i) != '\0') {
password += (char)EEPROM.read(eepromAddress + i);
i++;
}
Serial.print("Зчитаний пароль: ");
Serial.println(password);
return password;
}
// Функція для відображення головного меню
void displayMenu(int chec) {
lcd.clear(); // Очищаємо дисплей
lcd.setCursor(0, 0); // Встановлюємо курсор
lcd.print("Menu ->");
lcd.setCursor(0, 1);
switch (chec) {
case 0:
lcd.print("+Add password"); // Опція додавання пароля
break;
case 1:
lcd.print("^View password"); // Опція перегляду пароля
break;
}
}