#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Encoder.h> // Подключение библиотеки для работы с энкодером
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int numRows = 4;
const int numCols = 4;
char keys[numRows][numCols] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'F'}
};
int rowPins[numRows] = {32, 33, 25, 26}; // Пины строк клавиатуры
int colPins[numCols] = {27, 14, 12, 13}; // Пины столбцов клавиатуры
uint8_t data_from_pcf8574 = 0;
String input_message = "";
bool read_data_flag = false;
bool send_data_flag = false;
bool clear_screen = false;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
Encoder encoder(4, 5); // Инициализация переменной для работы с энкодером
bool cursor_mode = false; // Флаг режима перемещения курсора
bool select_mode = false; // Флаг режима выбора символа
bool previous_press = false; // Флаг предыдущего нажатия
void setup() {
Wire.begin();
lcd.init();
lcd.backlight();
for (int row = 0; row < numRows; row++) {
pinMode(rowPins[row], OUTPUT);
}
for (int col = 0; col < numCols; col++) {
pinMode(colPins[col], INPUT_PULLUP);
}
}
void readDataFromPCF8574() {
Wire.requestFrom(0x20, 1);
if (Wire.available()) {
data_from_pcf8574 = Wire.read();
}
read_data_flag = false;
}
void sendDataToPCF8574(String text) {
Wire.beginTransmission(0x20);
Wire.print(text);
Wire.endTransmission();
send_data_flag = false;
}
void loop() {
unsigned long currentMillis = millis();
// Обработка нажатий на клавиши и прокрутки энкодера
handleEncoder();
for (int row = 0; row < numRows; row++) {
digitalWrite(rowPins[row], LOW);
for (int col = 0; col < numCols; col++) {
if (digitalRead(colPins[col]) == LOW && (currentMillis - lastDebounceTime) > debounceDelay) {
// Обработка нажатий клавиш в зависимости от режима
handleKeypad(keys[row][col]);
}
}
digitalWrite(rowPins[row], HIGH);
}
if (read_data_flag) {
readDataFromPCF8574();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("*READ*");
lcd.setCursor(0, 1);
lcd.print(data_from_pcf8574, HEX);
delay(500);
}
if (send_data_flag) {
sendDataToPCF8574(input_message);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("*ENTER*");
send_data_flag = false;
delay(500);
}
lcd.setCursor(0, 1);
lcd.print(input_message);
}
void handleKeypad(char key) {
if (key == 'A') {
read_data_flag = true;
} else if (key == 'B') {
send_data_flag = true;
} else if (key == 'C') {
lcd.clear();
input_message = "";
clear_screen = false;
} else if (key != '*' && key != '#') {
input_message += key;
}
}
void handleEncoder() {
int encoderValue = encoder.read(); // Считываем изменения состояния энкодера
if (digitalRead(6) == LOW && !previous_press) { // Проверка на нажатие энкодера
if (!cursor_mode) {
cursor_mode = true;
} else if (select_mode) {
select_mode = false; // Возвращение к режиму перемещения курсора
} else {
cursor_mode = false; // Выход из режима перемещения курсора
}
previous_press = true;
} else {
previous_press = false;
}
if (cursor_mode && !select_mode) {
if (encoderValue > 0) {
lcd.scrollDisplayLeft(); // Прокрутка текста влево при повороте энкодера вверх
} else if (encoderValue < 0) {
lcd.scrollDisplayRight(); // Прокрутка текста вправо при повороте энкодера вниз
}
} else if (cursor_mode && select_mode) {
int character_count = input_message.length();
int selected_index = encoderValue % character_count;
lcd.setCursor(selected_index, 1); // Установка курсора на выбранный символ
}
}