Подключение кнопки к arduino. Как побороть дребезг контактов?

Подключение кнопки к arduino. Как побороть дребезг?

Несколько раз я начинал и бросал эту статью, так как тема подключения кнопки очень простая, не хотелось о ней даже писать. Но каждый раз, сталкиваясь с дребезгом контактов кнопок, идея дописать статью возвращалась. И вот в очередной раз, вернувшись к тексту и до конца оформив публикацию, статья появилась на свет.

Подключение кнопки к arduino

Подключение кнопки к arduino – это один из первых шагов, которые совершаются при знакомстве с ардуино. Описывать тут особо нечего, поэтому перейду сразу к сути. Для подключения достаточно всего трех ножек кнопки. Одна соединяется с пином ардуино, на котором и будет считываться положение кнопки, вторая нога соединяется с плюсом, а третья, через резистор подтянута к земле. Сопротивление резистора должно быть от 10 до 100 кОм.
Схема подключения:

Схема подключения кнопки к ардуино

Как исключить дребезг контактов кнопки

Чтобы избежать дребезга контактов есть несколько способов: воспользоваться готовой библиотекой Bounce.h, гасить дребезги аппаратно или самостоятельно описать в коде проверку.
Аппаратно – это слишком усложнит схему. Использовать библиотеку – слишком просто, не интересно и придется потратить какое-то место в памяти микроконтроллера под библиотеку. А вот реализовать самостоятельную проверку, это, на мой взгляд, идеальное решение.
Для отсекания дребезг контактов кнопки достаточно небольшой задержки в 5-7 миллисекунд, поскольку дребезг происходит на очень коротком промежутке времени. Алгоритм следующий: запоминаем старое состояние кнопки, и при каждом опросе состояния кнопки, сверяем текущее и новое значения. Если они отличаются, то ждем 5 миллисекунд и проверяем положение кнопки еще раз.
Ниже приведен код с подробными комментариями:

// пин светодиода
int ledPin = 4; 
boolean ledOn = false; // состояние светодиода

// пин кнопки
int btn_1 = 2; 
boolean lastBtn_1 = false; // предыдущее состояние кнопки
boolean currentBtn_1 = false; // текущее состояние кнопки

void setup() {  
	// режимы работы пинов
	pinMode (btn_1, INPUT);
	pinMode (ledPin, OUTPUT);
}

void loop() {
	// получение состояния кнопки
	currentBtn_1 = isBtnStatus(lastBtn_1);
	// если кнопка была нажата 5 миллисекунд и более
	if (lastBtn_1 == false && currentBtn_1 == true) { 
		// меняем состояние светодиода
		ledOn = !ledOn; 
	}
	// сохраняем состояние кнопки
	lastBtn_1 = currentBtn_1;
	// включаем или выключаем светодиод
	digitalWrite (ledPin, ledOn); 
}

// функция для определения состояния кнопки
boolean isBtnStatus(boolean last) { 
	// считываем состояние кнопки
	boolean current = digitalRead(btn_1);
	// сравниваем текущее состояние кнопки со старым
	if (last != current) { 
		// ждем 5 миллисекунд
		delay(5);
		// считываем состояние кнопки еще раз
		current = digitalRead(btn_1);
	}
	// возвращаем состояние кнопки
	return current; 
}
 

Послесловие

Метод, использованный в статье, действенный – дребезг кнопки исчезает, только он останавливает выполнение скетча на 5 миллисекунд. Если в устройстве не больше 10-20 кнопок, то все будет работать идеально. А если их количество возрастет до 100, то общее время задержки, необходимое на экранирование дребезга, будет составлять уже пол секунды и это очень много. В таком случае вместо delay, можно использовать функцию millis, которая позволяет замерять время в миллисекундах от старта программы. С помощью millis можно, не прибегая к остановкам скетча, реализовать туже самую проверку.


Рассказать друзьям:


Оценить:
(Пока оценок нет)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code