Рис. 2.6. Эффект дребезга кнопок
Кнопка была физически нажата в течение 25 мс. Предположение, что состояние кнопки можно определить, считав значение с входа контакта (график слева) неверно. Кнопка фактически возвращается вверх-вниз, пока значение не установится (график справа). Теперь, зная, как ведет себя кнопка, можно написать программу для кнопки с дребезгом, которая фиксирует изменение состояния кнопки, некоторое время ждет и затем снова читает состояние переключателя. Алгоритм работы такой программы можно записать следующим образом:
1. Сохраняем предыдущее и текущее состояния кнопки (при инициализации LOW).
2. Считываем текущее состояние кнопки.
3. Если текущее состояние кнопки отличается от предыдущего, ждем 5 мс, потому что кнопка, возможно, изменит свое состояние.
4. Подождав 5 мс, считываем состояние кнопки и делаем его текущим состоянием кнопки.
5. Если предыдущее состояние кнопки было LOW, а текущее - HIGH, переключаем состояние светодиода.
- 56 -
6. Устанавливаем предыдущее состояние кнопки в качестве текущего.
7. Возвращаемся к шагу 2.
Данный алгоритм - прекрасный пример для изучения функций. Функция - это оператор, который может принимать входные аргументы, выполнять фрагмент кода с их использованием и, возможно, возвращать результат. Не зная этого, вы уже встречали функции в программах. Например, digitalWrite() - это функция, которая принимает в качестве аргументов номер контакта и значение ( HIGH или LOW), и устанавливает это значение на контакте. Чтобы упростить программу, можно определить свои собственные функции для инкапсуляции действий, которые придется повторять неоднократно.
Процесс выполнения программы представляет собой многократное повторение шагов. Напишем функцию для устранения дребезга контактов, которую можно вызывать неоднократно. Наша функция будет принимать предыдущее состояние кнопки в качестве входных данных, выполнять противодребезговую защиту и выводить установившееся состояние кнопки. Основной цикл программы переключает состояние светодиода при каждом нажатии кнопки. Загрузите код листинга 2.5 в плату Arduino и посмотрите, как он работает.
Листинг 2.5. Подавление дребезга кнопки — debounce.ino
const int LED=9; // Контакт 9 для подключения светодиода
const int BUTTON=2; // Контакт 2 для подключения кнопки
boolean lastButton = LOW;// Переменная для сохранения предыдущего
// состояния кнопки
boolean currentButton = LOW;// Переменная для сохранения текущего
// состояния кнопки
boolean ledOn = false;// Текущее состояние светодиода
//(включен/выключен)
void setup()
{
pinMode (LED, OUTPUT);// Сконфигурировать контакт светодиода как выход
pinMode (BUTTON, INPUT);//Сконфигурировать контакт кнопки как вход
}
/*
* Функция сглаживания дребезга
* принимает в качестве аргумента предыдущее состояние кнопки
* и выдает фактическое.
*/
boolean debounce(boolean last)
{
boolean current = digitalRead(BUTTON);// Считать состояние кнопки
if (last != current)// Если изменилось...
{
delay(5);// Ждем 5 мс
current = digitalRead(BUTTON);// Считываем состояние кнопки
return current;// Возвращаем состояние кнопки