#include <LiquidCrystal.h>
#include <Keypad.h>
#include <Wire.h>
#include <RTClib.h> // Библиотека для работы с RTC
// Настройка LCD
LiquidCrystal lcd(0, 1, 2, 3, 4, 5);
LiquidCrystal time_lcd(40, 41, 42, 43, 44, 45);
// Константы для клавиатуры
const byte ROWS = 4;
const byte COLS = 4;
const int maxLength = 19; // Максимальная длина ввода
const char firstChar = '>'; // Первый символ, который будет оставаться на экране
float second = 0;
// Определение клавиш
char hexaKeys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Пины для строк и столбцов клавиатуры
byte rowPins[ROWS] = {30, 31, 32, 33};
byte colPins[COLS] = {34, 35, 36, 37};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
String bash = "";
String bash_his = "";
const String clearStr = String(" "); // строка для очистки
// Инициализация RTC
RTC_DS3231 rtc;
// Определение кастомных символов
const byte customChars[10][8] = {
{ 0b00000,
0b01110,
0b10001,
0b10001,
0b01110,
0b00000,
0b00000,
0b00000
}, // 0
{ 0b00000,
0b00100,
0b01100,
0b00100,
0b01110,
0b00000,
0b00000,
0b00000
}, // 1
{ 0b00000,
0b01110,
0b00001,
0b01110,
0b10000,
0b11111,
0b00000,
0b00000
}, // 2
{ 0b00000,
0b01110,
0b00001,
0b01110,
0b00001,
0b01110,
0b00000,
0b00000
}, // 3
{ 0b00000,
0b10001,
0b10001,
0b11111,
0b00001,
0b00001,
0b00000,
0b00000
}, // 4
{ 0b00000,
0b11111,
0b10000,
0b11110,
0b00001,
0b01110,
0b00000,
0b00000
}, // 5
{ 0b00000,
0b01110,
0b10000,
0b11110,
0b10001,
0b01110,
0b00000,
0b00000
}, // 6
{ 0b00000,
0b11111,
0b00001,
0b00010,
0b00100,
0b00000,
0b00000,
0b00000
}, // 7
{ 0b00000,
0b01110,
0b10001,
0b01110,
0b10001,
0b01110,
0b00000,
0b00000
}, // 8
{ 0b00000,
0b01110,
0b10001,
0b01111,
0b00001,
0b01110,
0b00000,
0b00000
} // 9
};
void setup() {
pinMode(A0, INPUT);
pinMode(20, OUTPUT);
pinMode(50, OUTPUT);
lcd.begin(20, 4);
time_lcd.begin(16, 2); // Инициализация второго LCD
// Загрузка кастомных символов в память LCD
for (int i = 0; i < 10; i++) {
lcd.createChar(i, customChars[i]);
}
waitForInput();
lcd.setCursor(0, 0);
lcd.print("PC from @AKAKIY 2025");
lcd.setCursor(0, 2);
lcd.print("Result:");
lcd.setCursor(0, 1);
lcd.print(firstChar);
digitalWrite(20, HIGH);
digitalWrite(50, HIGH);
Wire.begin();
rtc.begin();
rtc.adjust(DateTime(2023, 10, 1, 12, 0, 0));
}
void loop() {
// Обновление времени
displayTime();
char key = customKeypad.getKey();
if (key) {
processKey(key);
}
}
void waitForInput() {
while (analogRead(A0) != 1023) {
// Ждем, пока не будет подан сигнал
}
}
void processKey(char key) {
if (key == '*') {
clearInput();
} else if (key == '#') {
executeCommand();
} else {
appendInput(key);
}
}
void clearInput() {
bash = "";
updateDisplay();
}
void appendInput(char key) {
if (bash.length() < maxLength) {
bash += key;
}
updateDisplay();
}
void updateDisplay() {
lcd.setCursor(0, 1);
lcd.print(clearStr); // Очистка строки
lcd.setCursor(0, 1);
lcd.print(firstChar);
lcd.print(bash); // отображаем введенные данные
}
void executeCommand() {
bash_his = bash;
clearInput();
lcd.setCursor(0, 3);
lcd.print(clearStr); // Очистка строки
// Выполнение команды
lcd.setCursor(0, 3);
if (bash_his.startsWith("D")) {
// Команда D: выводим все символы после D
if (bash_his.length() > 1) {
lcd.print("=>" + bash_his.substring(1)); // Выводим все после D
} else {
lcd.print("Sys=>Error"); // Ошибка нет данных
}
} else if (bash_his.startsWith("A")) {
// Команда A: выводим кастомный символ
if (bash_his.length() == 2) {
// Убедимся, что второй символ является цифрой
char indexChar = bash_his.charAt(1);
if (isDigit(indexChar)) {
int index = indexChar - '0'; // Преобразуем символ в индекс
if (index >= 0 && index < 10) {
lcd.print("Char=>");
lcd.write(index); // Выводим кастомный символ
} else {
lcd.print("Sys=>Error"); // Ошибка если индекс вне диапазона
}
} else {
lcd.print("Sys=>Error"); // Ошибка если второй символ не цифра
}
} else {
lcd.print("Sys=>Error"); // Ошибка если не один символ
}
} else if (bash_his.startsWith("B")) {
// Команда B: проверяем, что после B только один символ '0' или '1'
if (bash_his.length() == 2) {
char state = bash_his.charAt(1);
if (state == '1') {
digitalWrite(20, HIGH);
digitalWrite(50, HIGH);
lcd.print("Sys=>ON");
} else if (state == '0') {
digitalWrite(20, LOW);
digitalWrite(50, LOW);
lcd.print("Sys=>OFF");
} else {
lcd.print("Sys=>Error"); // Ошибка если не '0' или '1'
}
} else {
lcd.print("Sys=>Error"); // Ошибка если не один символ
}
} else if (bash_his.startsWith("C")) {
// // Команда C: суммируем все числа после C
int sum = 0;
for (int i = 1; i < bash_his.length(); i++) {
char c = bash_his.charAt(i);
if (isDigit(c)) {
sum += c - '0'; // Преобразуем символ в число
} else {
lcd.print("Sys=>Error"); // Ошибка если буквы
return;
}
}
lcd.print("Sum=>" + String(sum));
} else {
lcd.print("Sys=>Error command");
}
}
void displayTime() {
DateTime now = rtc.now(); // Получаем текущее время из RTC
// Форматируем строки времени и даты
String timeString = String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second());
String dateString = String(now.year()) + "-" + String(now.month()) + "-" + String(now.day()); // Месяцы и дни начинаются с 1
// Обновляем дисплей времени
time_lcd.setCursor(0, 0);
time_lcd.print("Time: " + timeString);
time_lcd.setCursor(0, 1);
time_lcd.print("Date: " + dateString);
}