Урок 2. Нажатие кнопки без ложных срабатываний. Устраняем дребезг кнопки

.Урок 2. Нажатие кнопки без ложных срабатываний. Устраняем дребезг кнопки

В предыдущем уроке: Урок1 - Подключение кнопки и светодиода к плате Arduino, я рассказал как подключить кнопку к Arduino . При нажатии на тактовую кнопку светодиод загорается. Если отпускаем он гаснет. Такое исполнение очень редко используется в проектах на Arduino.

Самое распространенное это смена состояния при нажатии на кнопку.

Вроде бы что тут сложного! Определил, что кнопка нажата и сменил состояния. Например включил светодиод. Но не так все проста при нажатии кнопки происходит так называемы дребезг. Состояние несколько раз меняет с высокого на низкое пока не примет устойчивое.

дребезг кнопки

Как видно на картинке. Дребезг есть не только при нажатие на кнопку но и когда мы ее отпускаем.

Как же бороться с дребезгом кнопки?

Существует несколько вариантов:

1. Аппаратное. Поставит дополнительные компоненты в электрическую схему. Самый простой, поставить конденсатор, который будет сглаживать импульсы. Но конденсатор не всегда справляется со своей задачей и поэтому используют более сложные схемы подключения.

2. Программный. Дребезг длиться не очень долго. И если сделать задержку между считыванием значения с кнопки, можно полностью устранить ложные срабатывание. Но тут есть тоже сложность и варианты решения.

Можно использовать библиотеку Bounce или написать свою небольшую функцию.

Написать функцию, на мой взгляд, понятнее и я сам использую данный вариант. Если будет предложения или просьбы по объяснению использования библиотеки, напишу дополнительный урок. Так что пишите в комментарии или в группу в ВК.

Для урока нам понадобиться:

Подключение не чем не отличается от предыдущего урока Урок1 - Подключение кнопки и светодиода к плате Arduino.

Подключение кнопки к 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.

Спасибо за внимание!

Понравилась статья? Поделитесь ею с друзьями:

Вернуться в раздел: Уроки Arduino: Светодиоды, Резисторы, Кнопки, Arduino Дата публикации 5 января , 2018

Комментарии

Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.


Cлучайные товары

Посмотреть товар в Магазине »

Мы в соц сетях

Подпишись на канал Telegram

Portal-PK (Портал ПК) © 2015 - 2024
Разработка проектов
AT Block
DWIN Box