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


// Определение цифровых пинов
const int pinBtnPlus = 2;   // Кнопка ++ (увеличение)
const int pinBtnMinus = 3;  // Кнопка -- (уменьшение)
const int pinLedPlus = 9;   // Светодиод для кнопки ++ (ШИМ пин)
const int pinLedMinus = 10; // Светодиод для кнопки -- (ШИМ пин)

// Переменные для логики задания
int counter = 0;       // Общий счетчик в мониторе порта
int clicksPlus = 0;    // Личный счетчик нажатий кнопки Плюс
int clicksMinus = 0;   // Личный счетчик нажатий кнопки Минус

// Переменные текущей яркости для ШИМ (значения от 0 до 255)
int maxBrightnessPlus = 55;  
int maxBrightnessMinus = 55; 

// Переменные для программного антидребезга (Debounce)
unsigned long lastDebounceTimePlus = 0;
unsigned long lastDebounceTimeMinus = 0;
const unsigned long debounceDelay = 50; // Задержка фильтрации — 50 мс

// Переменные физического состояния (для отслеживания дребезга)
int lastSteadyStatePlus = HIGH; 
int lastSteadyStateMinus = HIGH;
int lastFlickerStatePlus = HIGH;
int lastFlickerStateMinus = HIGH;

void setup() {
  Serial.begin(9600); // Инициализация монитора порта
  
  // Включаем внутреннюю подтяжку INPUT_PULLUP
  pinMode(pinBtnPlus, INPUT_PULLUP);
  pinMode(pinBtnMinus, INPUT_PULLUP);
  
  pinMode(pinLedPlus, OUTPUT);
  pinMode(pinLedMinus, OUTPUT);
}

void loop() {
  // Считываем текущее физическое состояние пинов
  int readingPlus = digitalRead(pinBtnPlus);
  int readingMinus = digitalRead(pinBtnMinus);

  // ================= ОБРАБОТКА КНОПКИ ПЛЮС =================
  // Если физический сигнал изменился (из-за нажатия или дребезга)
  if (readingPlus != lastFlickerStatePlus) {
    lastDebounceTimePlus = millis(); // Сбрасываем таймер
    lastFlickerStatePlus = readingPlus;
  }
  
  // Если сигнал стабилен дольше заданной задержки
  if ((millis() - lastDebounceTimePlus) > debounceDelay) {
    // Проверяем, изменилось ли подтвержденное состояние
    if (lastSteadyStatePlus == HIGH && readingPlus == LOW) { 
      // Кнопка была НАЖАТА
      counter++;
      clicksPlus++;
      
      maxBrightnessPlus += 50;
      if (maxBrightnessPlus > 255) {
        maxBrightnessPlus = 55; 
      }
      
      printSerial(); 
    }
    // Запоминаем стабильное состояние
    lastSteadyStatePlus = readingPlus;
  }
  
  // Управление светодиодом на основе стабильного состояния
  if (lastSteadyStatePlus == LOW) {
    analogWrite(pinLedPlus, maxBrightnessPlus);
  } else {
    analogWrite(pinLedPlus, 0); 
  }


  // ================= ОБРАБОТКА КНОПКИ МИНУС =================
  if (readingMinus != lastFlickerStateMinus) {
    lastDebounceTimeMinus = millis();
    lastFlickerStateMinus = readingMinus;
  }
  
  if ((millis() - lastDebounceTimeMinus) > debounceDelay) {
    if (lastSteadyStateMinus == HIGH && readingMinus == LOW) {
      // Кнопка была НАЖАТА
      counter--;
      clicksMinus++;
      
      maxBrightnessMinus += 50;
      if (maxBrightnessMinus > 255) {
        maxBrightnessMinus = 55;
      }
      
      printSerial();
    }
    lastSteadyStateMinus = readingMinus;
  }
  
  if (lastSteadyStateMinus == LOW) {
    analogWrite(pinLedMinus, maxBrightnessMinus);
  } else {
    analogWrite(pinLedMinus, 0);
  }
}

// Функция форматированного вывода в строку
void printSerial() {
  Serial.print(counter);
  Serial.print("\t");
  Serial.print(clicksPlus);
  Serial.print("\t");
  Serial.println(clicksMinus);
}