#include <Wire.h> // библиотека для управления устройствами по I2C
#include <LiquidCrystal_I2C.h> // подключаем библиотеку для QAPASS 1602
#include <EEPROM.h>
LiquidCrystal_I2C LCD(0x27,20,4); // присваиваем имя LCD для дисплея
const int redLedPin = 5; // Пін червоного світлодіода
const int greenLedPin = 9; // Пін зеленого світлодіода
const char writePassword = 'W'; // Пароль для запису
const char readPassword = 'R'; // Пароль для зчитування
String password = "";
int i = 0;
const int btnPin = 2;
void setup() {
pinMode(btnPin, INPUT_PULLUP);
LCD.init(); // инициализация LCD дисплея
LCD.backlight(); // включение подсветки дисплея
Serial.begin(9600);
Serial.println("Start");
pinMode(redLedPin, OUTPUT);
pinMode(greenLedPin, OUTPUT);
digitalWrite(redLedPin, HIGH); // Увімкнення червоного світлодіода
}
int state = 0;
int lastBtnState = HIGH;
int last = 0;
void loop() {
if (millis() - last >= 5000 && state % 2 != 0) {
LCD.clear();
state = 0;
last = millis();
}
int btnState = digitalRead(btnPin);
if (btnState != lastBtnState) {
if (btnState == LOW) {
handleBtnClick();
}
}
lastBtnState = btnState;
if (state == 0) {
showMenu();
}
else if (state % 2 == 0) {
showAdd();
}
else {
showList();
}
LCD.setCursor(0, 0);
if (Serial.available() > 0) {
String input = Serial.readStringUntil('?'); // Читаємо дані з послідовного порту до символу '?'
// Розбиваємо вхідний рядок на частини: пароль, команда, значення байта
int dividerPos = input.indexOf('/');
if (dividerPos == -1) {
dividerPos = input.indexOf('\\');
}
if (dividerPos != -1 && input.length() > dividerPos + 1) {
char password = input.charAt(0);
String commandAndData = input.substring(1, dividerPos);
int byteValue = input.substring(dividerPos + 1).toInt();
if (password == writePassword && state == 2) {
// Перевірка пароля для запису
handleWrite(byteValue);
}
else if (password == readPassword) {
// Перевірка пароля для зчитування
handleRead();
}
else {
// Невірний пароль
handleInvalidPassword();
}
}
}
}
void handleWrite(int byteValue) {
LCD.clear();
digitalWrite(redLedPin, LOW); // Вимкнення червоного світлодіода
digitalWrite(greenLedPin, HIGH); // Увімкнення зеленого світлодіода
EEPROM.write(0, byteValue); // Запис значення байта в EEPROM
password = String(byteValue);
i++;
LCD.setCursor(0, 0);
LCD.println("Password writed");
delay(3000); // Затримка для індикації роботи
digitalWrite(greenLedPin, LOW); // Вимкнення зеленого світлодіода
}
void handleRead() {
digitalWrite(redLedPin, LOW); // Вимкнення червоного світлодіода
digitalWrite(greenLedPin, HIGH); // Увімкнення зеленого світлодіода
int byteValue = EEPROM.read(0); // Зчитування значення байта з EEPROM
delay(1000); // Затримка для індикації роботи
digitalWrite(greenLedPin, LOW); // Вимкнення зеленого світлодіода
// Передача зчитаного значення назад до комп'ютера
Serial.println(byteValue);
}
void handleInvalidPassword() {
// Інформація про неправильний пароль
Serial.println("Invalid password.");
for (int i = 0; i < 5; i++) {
// Чергове блимання червоного світлодіода
digitalWrite(redLedPin, LOW);
delay(500);
digitalWrite(redLedPin, HIGH);
delay(500);
}
}
void showList() {
Serial.println("Show list");
//LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Password: ");
LCD.println(password);
}
void showAdd() {
Serial.println("Show add");
//LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Enter the password");
}
void handleBtnClick() {
state++;
last = millis();
Serial.println(state);
LCD.clear();
}
void showMenu() {
Serial.println("Menu");
LCD.setCursor(0, 0);
LCD.println("Menu");
LCD.println("click the button to change option");
}