Устранение дребезга контактов, вкл. выкл. светодиода кнопкой.

Christopher
Offline
Зарегистрирован: 04.03.2020

Приветствую! Изучаю ардуино по урокам ютуба (https://www.youtube.com/watch?v=yvdV5dNzRHQ&t=282s). 

Делая проект (см.тему), убрал часть кода, а именно: delay(5) и все равно все работает. 

Исходный код:

 

const int led = 9;
const int button=2;

boolean lastButton = false;
boolean currentButton = false;
boolean ledOn = false;

void setup(){
   pinMode(led,OUTPUT);
   pinMode(button,INPUT);
   
}

boolean debounce (boolean last)
{
  boolean current = digitalRead(button);
 if (last != current)
  {
    delay(5);
    return current;
    }
}


void loop()
{
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
 
  ledOn = !ledOn;
 
 lastButton = currentButton;
 digitalWrite(led, ledOn);
  
}

Правленый код:



const int led = 9;
const int button=2;
 
boolean lastButton = false;
boolean currentButton = false;
boolean ledOn = false;
 
void setup(){
   pinMode(led,OUTPUT);
   pinMode(button,INPUT);
   
}
 
boolean debounce (boolean last)
{
  boolean current = digitalRead(button);
 
    return current;
}
 
 
void loop()
{
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
 
  ledOn = !ledOn;
 
 lastButton = currentButton;
 digitalWrite(led, ledOn);  
}

Прошу пояснить зачем delay(5)? Парень с ютуба перемудрил?





 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Во-первых, Вы можете и всю функцию debounce убрать, а в скетче написать сurrentButton = digitalRead(button); оно тоже будет работать. Если кнопка хорошая, то можно и не заметить этот самый дребезг, который автор ролика пытается устранить.

А во-вторых, его функция написана с ошибкой. В случае last = current возвращаемое функцией значение неопределено. Так что хорошего она всё равно ничего не делает.

Если интересует подавление дребезга, то в стандартной поставке arduino ide есть пример Debounce. Смотрите его.

Green
Offline
Зарегистрирован: 01.10.2015

Мне заказчик буквально вчера пишет типа, что бы устранить дребезг контактов кнопки, сделайте задержку в 1 сек. после нажатия.) Это в ТЗ!

sadman41
Offline
Зарегистрирован: 19.10.2016

А что такого? Может он никуда не торопится или задержка должна быть неблокирующей.

Green
Offline
Зарегистрирован: 01.10.2015

Нет, абсолютно ничего такого. Это я как один из вариантов подавления дребезга. Бюджетненький.)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Green пишет:

Мне заказчик буквально вчера пишет типа, что бы устранить дребезг контактов кнопки, сделайте задержку в 1 сек. после нажатия.) Это в ТЗ!

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

Green
Offline
Зарегистрирован: 01.10.2015

Та не, это понятно. Уже всё принято.) Просто заказчик сам программировал 35 лет тому назад.)))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Мне заказчик буквально вчера пишет типа, что бы устранить дребезг контактов кнопки, сделайте задержку в 1 сек. после нажатия.) Это в ТЗ!

на Прибалтику работаете??? )))

sadman41
Offline
Зарегистрирован: 19.10.2016

Заменят разбитый экран на чугунный. Нашел проблему тоже.

Green
Offline
Зарегистрирован: 01.10.2015

ua6em пишет:

на Прибалтику работаете??? )))

 Эстонию в смысле?) Та без разницы, главное строго по ТЗ.)