В предыдущем уроке: Урок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 милисек.
}
Не очень много кода и не надо дополнительных элементов при сборке схемы.
В моих проектах на Ардуино вы можете найти использование данного кода.
Понравилась статья? Поделитесь ею с друзьями:
Вернуться в раздел: Уроки Arduino: Светодиоды, Резисторы, Кнопки, Arduino Дата публикации 5 января , 2018
Читайте также
Комментарии
Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.