Дребезг
Когда мы нажимаем на кнопку, мы ожидаем от нее, что она нам что-то включит, и это будет радостно работать. То есть сигнал будет вести себя так:
Но все далеко не так радужно. Из-за дребезга при нажатии кнопки сигнал ведет себя вот так:
Согласитесь, неприятно. Дребезг длится несколько микросекунд, и если вы, например, кнопкой включаете лампочку, то лампочка включится и выключится несколько раз, пока вы держите палец, а когда вы отпустите кнопку, она может снова не гореть.
Дребезг можно подавлять как хардверно, так и софтверно. Распространены два программных алгоритма подавления дребезга.
Тупой алгоритм заключается в простой задержке срабатывая на несколько сот микросекунд после нажатия кнопки. Этот алгоритм тормозной и не исключает случайного нажатия.
Продвинутый алгоритм считает время нахождения кнопки в положении "нажато". Если это время больше некоторого значения, то кнопка считается действительно нажатой. Как только кнопка меняет свое состояние, счетчик обнуляется.
С Arduino нам можно не размышлять об этом, а использовать библиотеку Bounce.
Библиотека Bounce
Библиотека Bounce предназначена для подавления дребезга. Она предоставляет нам в пользование замечательный класс Bounce, в котором мы можем создавать объекты.
Сам объект выглядит так:
Bounce (byte pin, unsugned long debounce_interval),
где pin - это номер пина Arduino, на котором сидит кнопка, а debounce_interval - время дребезга.
Полезные функции в этом классе:
int update() - проверка смены состояния, возвращает 1, если состояние пина изменилось;
void interval(unsigned long interval) - изменяет время дребезга (в мс);
int read() - читает состояние пина;
void write(int state) - устанавливает значение пина;
void rebounce(unsignet long interval) - заставляет пин менять состояние через промежуток времени, указанный в interval, даже если на самом деле оно не меняется;
unsigned long duration(void) - возвращает время в мс, в которое пин был в текущем состоянии;
bool risingEdge() - возвращает 1 во время первого чтения, если состояние пина сменилось с 0 на 1;
bool fallingEdge() - возвращает 1 во время первого чтения, если состояние пина сменилось с 1 на 0.
Библиотечку качаем отсюда. Распаковываем это безобразие в Папку_Arduino/libraries.
Собираем схему
Кнопка при нажатии соединяет две ее левые ноги с двумя правыми. Левую ее ногу посадим на +5V, а правую подключим к пину 2. Пин 2 также должен быть притянут к земле через резистор. Светодиод подключаем к пину 8 (мне просто так захотелось) через ограничивающий резистор.
Пишем скетч
Все очень просто:
//подключаем библиотеку Bounce
#include Bounce
//дефайним значения пинов с кнопкой и со светодиодом
#define BUTTON 2
#define LED 8
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer = Bounce(BUTTON,5);
//задаем начальное состояние светодиода "выключен"
//задаем начальное состояние светодиода "выключен"
int ledValue = LOW;
void setup()
{ //определяем режимы работы пинов
{ //определяем режимы работы пинов
pinMode(BUTTON,INPUT);
pinMode(LED,OUTPUT);}
void loop()
{ //если сменилось состояние кнопки
{ //если сменилось состояние кнопки
if ( bouncer.update() )
{
{
//если считано значение 1
if ( bouncer.read() == HIGH)
{
{
//если свет был выключен, будем его включать
if ( ledValue == LOW )
{ ledValue = HIGH;
{ ledValue = HIGH;
//если свет был включен, будем выключать
}
else { ledValue = LOW; } //записываем значение вкл/выкл на пин со светодиодом
digitalWrite(LED,ledValue);
}
}
}
else { ledValue = LOW; } //записываем значение вкл/выкл на пин со светодиодом
digitalWrite(LED,ledValue);
}
}
}
Комментариев нет:
Отправить комментарий
Создайте свой комментарий.