В предыдущем уроке: «Урок 7. Подключаем тактовую кнопку к Arduino и управляем светодиодом» мы научились подключать кнопку к Arduino и зажигать светодиод, когда нажата кнопка. Если отпустить кнопку, светодиод гаснет. Возникает логически обоснованный вопрос, как сделать так, чтобы светодиод загорался при однократном нажатии на тактовую кнопку, и гас при повторном нажатии?
Схема подключения кнопки к Arduino.
Схему подключения тактовой кнопки и светодиода к Arduino UNO возьмем из предыдущего урока.
Установим на макетную плату тактовую кнопку, и подключим одну ножку к +5v, вторую ножку, с помощью подтягивающего резистора, подключим к GND. Для чего это нужно читайте в предыдущем уроке.
Немного доработаем скетч и сделаем так, чтобы при нажатии кнопки у нас включался или выключался светодиод. Знаний у нас для этого уже достаточно. Если есть вопросы по коду, задавайте в комментариях и смотрите предыдущие уроки.
После загрузки кода и проверки можно заметить, что у нас работает как-то неправильно. Мы неправильно написали код или другая причина? Дело в том, что при нажатии на кнопку устойчивое состояние наступает не сразу. Происходит так называемый дребезг кнопки. Еще его называют дребезгом контактов. Вот что написано в Википедии.
Дре́безг конта́ктов — явление, происходящее в электромеханических коммутационных устройствах и аппаратах (кнопках, реле, герконах, переключателях, контакторах, магнитных пускателях и др.), длящееся некоторое время после замыкания электрических контактов. После замыкания происходят многократные неконтролируемые замыкания и размыкания контактов за счет упругости материалов и деталей контактной системы — некоторое время контакты отскакивают друг от друга при соударениях, размыкая и замыкая электрическую цепь.
В зависимости от размеров, массы, материала и конструкции контактной системы время дребезга (время от первого соприкосновения контактов до затухания механических колебаний и установления стабильного контактирования) составляет 0,5—2 мс. у миниатюрных герконов и до сотен миллисекунд у мощных контакторов.
Как устранить ложные срабатывания при нажатии кнопки?
Дребезг кнопки можно устранить 2 способами:
Аппаратное устранение дребезга кнопки.
Программное устранение дребезга кнопки.
Аппаратное устранение дребезга кнопки.
Аппаратное устранение дребезга кнопки представляет собой изменение схемы подключения путем установки элементов, которые способны устранить дребезг. Самым простым решением является установка сглаживающего конденсатора. Вот так будет выглядеть схема подключения.
Также существуют и другие аппаратные способы устранения дребезга контактов.Но для ознакомления с аппаратным устранением дребезга достаточно данного примера.
Программное устранение дребезга кнопки.
Для того, чтобы понять как устранить дребезг кнопки посмотрим рисунок, на котором изображен дребезг кнопки. Как видим, дребезг длится недолго, и если сделать небольшую задержку после нажатия на кнопку и считать значение еще раз, то считаное значение будет уже в установившемся состоянии.
Так как кнопки используются в большом количествеArduino проектов, для упрощения написания кода существует несколько библиотек, которые позволяют устранить дребезг кнопки. Одна из библиотек Bounce. Используя её не нужно задумываться, как устроен дребезг кнопки, и что нужно делать, чтобы с ним бороться. Но мы в уроке напишем небольшую функцию, которая поможет устранить ложные срабатывания программным способом.
Для этого нам нужно добавить вспомогательные переменные.
Функция boolean debvance достаточно простая. Получаем прошлое состояние кнопки.
if (last != current) // Если текущее состояние отличается от предыдущего
Ждем 5 миллисекунд и присваиваем текущее состояние кнопки
current = digitalRead(button_pin); // Присваиваем текущее состояние кнопки
И возвращаем значение current.
Затем напишем небольшую функцию.
boolean debvence (boolean last)
{
boolean current = digitalRead(button_pin);
if ( last != current)
{
delay(5);
current = digitalRead(button_pin);
return current;
}
}
Осталось в скетче прописать небольшие изменения.
Для работы с функцией устранения дребезга достаточно прописать всего одну строчку кода.
currentBt = debvence(lastBt); // Передаем функции дребезга значение по умолчанию LOW
Также нужно проверить отпустили кнопку или нет.
if (lastBt == LOW && currentBt == HIGH)
После условия нужно обязательно сделать переприсваивание предыдущего состояния кнопки, для дальнейшего определения нажатия кнопки.
lastBt = currentBt; // Переприсваиваем прошлое состояние кнопки
Дальше пишем код, который должен выполняться при нажатии кнопки. В нашем Arduino уроке необходимо включить светодиод без ложных срабатываний.
int led_pin = 2;
int button_pin = 3;
boolean lastBt = false;
boolean currentBt = false;
boolean ledOn = LOW;
boolean debvence (boolean last)
{
boolean current = digitalRead(button_pin);
if ( last != current)
{
delay(5);
current = digitalRead(button_pin);
return current;
}
}
void setup()
{
pinMode(led_pin, OUTPUT);
pinMode(button_pin, INPUT);
}
void loop()
{
// Получаем состояние кнопки
currentBt = debvence(lastBt);
// Если кнопка не нажата
if (lastBt == LOW && currentBt == HIGH)
ledOn = !ledOn;
digitalWrite(led_pin, ledOn);
lastBt = currentBt;
}
Светодиод включается и выключается при нажатии на кнопку, и нет ни каких ложных срабатываний. Поставленная цель достигнута.
Загружаем код в Arduino UNO.
Данный код можно использовать не только в симуляторе, но и при программировании реальной Arduino UNO. Если у вас есть такая возможность, подключите её к компьютеру, выберите нужный Порт и плату Arduino UNO, как показано на картинке ниже.
Нажмите на кнопку «Загрузить», после удачной компиляции и загрузки кода в плату, вы увидите надпись «Загрузка завершена».
Если у вас возникли сложности с загрузкой кода, посмотрите эту статью:
Мы рады объявить о нашем присутствии на Boosty! Arduino-Tex приглашает всех наших друзей и последователей поддержать нас на этой замечательной платформе. Здесь вы найдете эксклюзивный контент, уникальные проекты и возможность стать частью нашей творческой команды. Присоединяйтесь к нам на Boosty и вместе мы сделаем мир Arduino еще удивительнее!
Понравился Урок 8. Arduino: Дребезг — программное устранение. Нажатие кнопки без ложных срабатываний? Не забудь поделиться с друзьями в соц. сетях.
Мне жти переменные то же не понятны. Но если судить о том что ответа нет с 2021...
Гость: Геннадий (30 сентября, 2021 в 13:24)
Это было не совсем понятно. 1) Откуда взяли новый код "Немного доработаем скетч и сделаем так, чтобы при нажатии кнопки у нас включался или выключался светодиод." 2) Как работает функция debvence, и почему она до setup?
Комментарии