int pinIn = A0; int keyValue = 0; // Состояние покоя int leds[4] = {7, 6, 5, 4}; // Выходы для светодиодов void setup() { pinMode(pinIn, INPUT); for (int i = 0; i < 4; i++) { // Устанавливаем режим OUTPUT для выходов светодиодов pinMode(leds[i], OUTPUT); } Serial.begin(9600); } void loop() { int newKeyValue = GetKeyValue(); // Получаем актуальное состояние кнопок с коррекцией дребезга if (keyValue != newKeyValue) { // Если новое значение не совпадает со старым - реагируем на него if (keyValue > 0) { // Если предыдущее значение - нажатая кнопка, digitalWrite(leds[keyValue - 1], LOW); // то гасим предыдущий светодиод } if (newKeyValue > 0) { // Если новое значение - нажатая кнопка, digitalWrite(leds[newKeyValue - 1], HIGH); // то зажигаем новый светодиод } keyValue = newKeyValue; // Актуализируем переменную хранения состояния if (keyValue > 0) { // Если значение больше 0, значит кнопка нажата Serial.println("Key pressed: " + String(keyValue)); } else { // Если 0, то состояние покоя Serial.println("all keys are not pressed"); } } } int GetKeyValue() { // Функция устраняющая дребезг static int count; static int oldKeyValue; // Переменная для хранения предыдущего значения состояния кнопок static int innerKeyValue; int actualKeyValue = analogRead(pinIn); // Получаем актуальное состояние actualKeyValue = ((actualKeyValue - 128) >> 8) + 1; // Для 4 кнопок - битовый сдвиг if (innerKeyValue != actualKeyValue) { // Пришло значение отличное от предыдущего count = 0; // Все обнуляем и начинаем считать заново innerKeyValue = actualKeyValue; // Запоминаем новое значение } else { count += 1; // Увеличиваем счетчик } if ((count >= 10) && (actualKeyValue != oldKeyValue)) { // Счетчик преодолел барьер, можно иницировать смену состояний oldKeyValue = actualKeyValue; // Присваиваем новое значение } return oldKeyValue; }