#include<ST7032_asukiaaa.h>
ST7032_asukiaaa lcd;
// Флаги для кнопок (volatile обязательно для переменных в прерываниях)
volatile bool flag_S1 = 0; // возрастание
volatile bool flag_S2 = 0; // убывание
volatile bool flag_S3 = 0; // стоп
// Текущее полученное число
int currentNumber = 0;
bool hasNewData = false;
// Обработчики прерываний для кнопок
void IRAM_ATTR BUTTON_S1() {
flag_S1 = 1;
}
void IRAM_ATTR BUTTON_S2() {
flag_S2 = 1;
}
void IRAM_ATTR BUTTON_S3() {
flag_S3 = 1;
}
void setup() {
Serial.begin(115200); // для отладки
Serial2.begin(9600); // для связи с другой ESP32
lcd.begin(16, 2);
lcd.setContrast(60);
lcd.clear();
// Настройка кнопок (предполагаем подтяжку к GND)
pinMode(5, INPUT_PULLUP); // S1 - возрастание
pinMode(18, INPUT_PULLUP); // S2 - убывание
pinMode(19, INPUT_PULLUP); // S3 - стоп
// Назначение прерываний по спадающему фронту (нажатие кнопки)
attachInterrupt(digitalPinToInterrupt(5), BUTTON_S1, FALLING);
attachInterrupt(digitalPinToInterrupt(18), BUTTON_S2, FALLING);
attachInterrupt(digitalPinToInterrupt(19), BUTTON_S3, FALLING);
lcd.setCursor(0, 0);
lcd.print("Ready...");
delay(1000);
lcd.clear();
}
void loop() {
// 1. Обработка команд с кнопок
if (flag_S1 == 1) {
Serial2.print("UP\n"); // команда на увеличение
flag_S1 = 0;
lcd.setCursor(0, 1);
lcd.print("Mode: UP ");
}
if (flag_S2 == 1) {
Serial2.print("DOWN\n"); // команда на уменьшение
flag_S2 = 0;
lcd.setCursor(0, 1);
lcd.print("Mode: DOWN ");
}
if (flag_S3 == 1) {
Serial2.print("STOP\n"); // команда на остановку
flag_S3 = 0;
lcd.setCursor(0, 1);
lcd.print("Mode: STOP ");
}
// 2. Прием данных от второй ESP32
if (Serial2.available() > 0) {
String received = Serial2.readStringUntil('\n'); // читаем до перевода строки
received.trim(); // убираем пробелы и символы перевода строк
// Пытаемся преобразовать в число
int number = received.toInt();
// Проверяем, что число в диапазоне 0-100
if (number >= 0 && number <= 100) {
currentNumber = number;
hasNewData = true;
}
// Для отладки
Serial.print("Received: ");
Serial.println(received);
}
// 3. Обновление дисплея при получении новых данных
if (hasNewData) {
lcd.setCursor(0, 0);
lcd.print("Value: ");
lcd.setCursor(7, 0);
lcd.print(currentNumber);
// Дополнительно выводим графическую шкалу
lcd.setCursor(0, 1);
int barLength = map(currentNumber, 0, 100, 0, 16);
for (int i = 0; i < 16; i++) {
if (i < barLength) {
lcd.print(byte(255)); // полный блок
} else {
lcd.print(' ');
}
}
hasNewData = false;
}
delay(10); // небольшая задержка для стабильности
}