// Определение цифровых пинов
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);
}