В
предыдущем уроке:
Урок1 - Подключение кнопки и светодиода к плате Arduino, я
рассказал
как подключить кнопку к
Arduino
. При нажатии на
тактовую кнопку
светодиод загорается.
Если отпускаем он гаснет. Такое исполнение
очень редко используется
в
проектах на Arduino.
Самое
распространенное это смена состояния
при нажатии на кнопку.
Вроде
бы что тут сложного! Определил, что
кнопка нажата и сменил состояния.
Например включил светодиод. Но не так
все проста при нажатии кнопки происходит
так называемы
дребезг. Состояние
несколько раз меняет с высокого на
низкое пока не примет устойчивое.
Как
видно на картинке.
Дребезг есть не только
при нажатие на кнопку но и когда мы ее
отпускаем.
Как
же бороться с дребезгом кнопки?
Существует
несколько вариантов:
1.
Аппаратное.
Поставит дополнительные
компоненты в электрическую схему. Самый
простой, поставить конденсатор, который
будет сглаживать импульсы. Но конденсатор
не всегда справляется со своей задачей
и поэтому используют более сложные
схемы подключения.
2.
Программный.
Дребезг длиться не очень
долго. И если сделать задержку между
считыванием значения с кнопки, можно
полностью устранить ложные срабатывание.
Но тут есть тоже сложность и варианты
решения.
Можно
использовать
библиотеку Bounce
или
написать свою небольшую функцию.
Написать
функцию, на мой взгляд, понятнее и
я сам использую данный вариант. Если
будет предложения или
просьбы
по объяснению
использования
библиотеки,
напишу дополнительный урок. Так что
пишите в комментарии или
в группу в ВК.
Для урока нам понадобиться:
Подключение
не чем не отличается от предыдущего
урока
Урок1 - Подключение кнопки и светодиода к плате Arduino.
Электрическая
принципиальная схема.
Функция
boolean debvance достаточно простая. Получаем
прошлое состояние кнопки.
if (last != current) // Если текущее состояние отличается от предыдущего
Ждем
5 миллисекунд. И
current = digitalRead (buttonPin); // Присваеваем текущее состояние кнопки
И
возвращаем значение current.
Вот
и вся функция.
boolean debvance (boolean last) //убираем дребизг
{
boolean current = digitalRead (buttonPin); // считываем данные с кнопки
if (last != current) // Если текущее состояние отличететься от предыдущего
{
delay (5); // Ждем 5 милисек.
current = digitalRead (buttonPin); // Присваеваем текущее состояние кнопки
return current;
}
}
Осталось
в скетче прописать небольшие изменения.
Всего
одна строчка для работы с функцией
currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW
Также
нужно проверить
if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет
После
условия нужно обязательно сделать
переприсваивание
lastButten = currentButten; // Переприсваиваем прошлое состояние кнопки
Остальной
код пишется под ваши задачи. В данном
случае включаем светодиод.
const int buttonPin = 2; // номер входа, подключенный к кнопке
const int ledPin = 3; // номер выхода светодиода
/* переменные */
boolean lastButten = LOW; // предыдущее состояние кнопки
boolean currentButten = LOW; // текущее состояние кнопки
boolean ledOn = false; // текущее состояние свтодиода
void setup() // Функция setup()
{
// инициализируем пин, подключенный к светодиоду, как выход
pinMode(ledPin, OUTPUT);
// инициализируем пин, подключенный к кнопке, как вход
pinMode(buttonPin, INPUT);
}
boolean debvance (boolean last) //убираем дребизг
{
boolean current = digitalRead (buttonPin); // считываем данные с кнопки
if (last != current) // Если текущее состояние отличететься от предыдущего
{
delay (5); // Ждем 5 милисек.
current = digitalRead (buttonPin); // Присваеваем текущее состояние кнопки
return current;
}
}
void loop() // Функция loop
{
currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW
if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет
{
ledOn = !ledOn; // инвертируем значение
}
lastButten = currentButten; // Переприсваеваем прошлое состояние кнопки
digitalWrite(ledPin, ledOn); // Включаем или выключаем светодиот (смотря что пришло после инверсии)
delay (2); // Ждем 2 милисек.
}
Не
очень много кода и не надо дополнительных
элементов при сборке схемы.
В
моих
проектах на Ардуино вы можете найти
использование данного кода.
Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.
Спасибо за внимание!
Понравилась статья? Поделитесь ею с друзьями:
Комментарии
Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.