Это старая версия документа!
В предыдущем эксперименте мы столкнулись с явлением которое характерно для всех кнопок и выключателей - дребезг контактов. Это паразитное явление, которое вносит проблемы преимущественно в электронных схемах.
Дребезг контактов возникает при нажатии на кнопку и переключатель, он возникает из-за реальных вибраций контактной пластины при её перемещении. Любой переключатель устроен так, что у него есть подвижный и неподвижный контакт. Как видно из названия, подвижным называется тот, что соединен с толкателем или рычагом, на который уже нажимает человек или механизм при работе устройства.
Так как кнопки имеют механическое устройство, то от их качества зависит то, как точно они отрабатывают нажатия. При этом в любом случае полностью устранить явление дребезга нельзя. К чему он приводит?
Если клавиша управляет каким-то электронным устройством с цифровым входом, например, микроконтроллера, логического элемента и пр., то его вход распознает столько нажатий, сколько было импульсов послано в результате возникновения дребезга.
Пример осциллограммы дребезга контактов изображен на рисунке ниже:
Чтобы устранить эффект дребезга контактов есть два способа программный и аппаратный.
, параллельно кнопке включают конденсатор, сглаживающий скачки напряжения и делающий процесс переключения более плавным. Обычно номинал конденсатора делают не слишком большим, порядка 0.1 мкФ (микрофарад), иначе он будет заряжаться слишком долго и время
переключения кнопки станет заметно больше.
Сглаживающий конденсатор заряжается до уровня HIGH почти мгновенно, а во время дребезга контактов разряжается, повышая уровень напряжения в цепи. Таким образом скачки напряжения значительно уменьшаются.
Теперь кнопка будет работать правильно, но схема все еще нуждается в доработке. Предположим, что во время написания программы, мы ошиблись и случайно определили вывод контроллера не как INPUT, а как OUTPUT. В этом случае через ножку контроллера потечет ток короткого замыкания, превышающий предельно допустимый и контроллер выйдет из строя.
Чтобы защитить контроллер, последовательно с кнопкой добавим токоограничительный резистор 1 кОм.
Рисунок 1. Электрическая принципиальная схема эксперимента
// инициализация констант #define LED 2 //определение константы LED с номером пина 2 #define BUTTON 12 //определение константы BUTTON с номером пина 12 // инициализация переменных int switchState = 0; // актуальный статус кнопки int oldSwitchState = 0; // статус последней проверки кнопки boolean lightsOn = false; // статус светодиода on = true или off = false void setup() { pinMode(BUTTON, INPUT); pinMode(LED, OUTPUT); } void loop() { switchState = digitalRead(BUTTON); if (switchState != oldSwitchState) { oldSwitchState = switchState; if (switchState == HIGH) { lightsOn = !lightsOn; } } if(lightsOn) { digitalWrite(LED, HIGH); // зажигаем светодиод } else { digitalWrite(LED, LOW); // гасим светодиод } }
В соответствие инструкции дополним схему конденсатором С1 и резистором R3.
Программный код оставим без изменений.
Запустим программу на выполнение, и на этот раз все работает как и задумано.