Загрузка данных


#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);  // небольшая задержка для стабильности
}