+2 голосов
Допустим, есть переменная t со значением таймера. Кто как отслеживает одиночные, длительные удержания кнопки? А также двойные, тройные... Дребезг контактов опускаем.
(2.7 тыс. баллов) 10 29 55
Дребезг контактов опускаем. То есть предполагается, что проблема дребезга решена аппаратно?
Дребезга нет. Точка.

5 Ответы

+1 голос
Если первое нажатие меньше определённого периода, то считается, что оно не длительное. Далее надо заранее знать время, после которого повторное нажатие кнопки будет считаться, как ещё одно одинарное нажатие. Пока идёт это время относительно первого нажатия, считаем нажатия. Лишь по истечении этого времени можно будет решить сколько нажатий было сделано и обрабатывать события. Лучше конечно на псевдокоде объяснить.
(3.1 тыс. баллов) 14 20 41
+1 голос
Используйте библиотеку GyverButton.

Что она умеет:

Работа с нормально замкнутыми и нормально разомкнутыми кнопками

Работа с подключением PULL_UP и PULL_DOWN Опрос кнопки с программным антидребезгом контактов (настраиваемое время)

Отработка нажатия, удерживания, отпускания, клика по кнопке (+ настройка таймаутов)

Отработка одиночного, двойного и тройного нажатия (вынесено отдельно)

Отработка любого количества нажатий кнопки (функция возвращает количество нажатий)

Функция изменения значения переменной с заданным шагом и заданным интервалом по времени

Возможность работы с “виртуальными” кнопками (все возможности библиотеки используются для матричных и резистивных клавиатур)
(589 баллов) 4 8 19
+1 голос
Функция обработки нажатия кноки вызывается от 10 до 50 раз в секунду , делаем программную защиту от дркебезга. Далее фиксируем переход в нажатое состояние , считаем сколько раз будет вызвана фнкция до отжатия кнопки (считай время нажатия) далее принимаем решение короткое это или длинное нажатие.

Для отлавливания двойных и тройных нажатий нужно по первому нажатию запустить отсчет времени. в течении которого считать двойное и тройное нажатие.
(93 баллов) 1 2 4
0 голосов

Вот псевдокод:
 

int result;

bool stop = 0;
void loop {

bool nopress - digitalRead(Button_pin);

if (!nopress) {

result = 1;

if (!stop) {

for(int time = 0; time < 1000 || stop; time += 10) {

if (!nopress) {

result ++;

stop = 1;

return;

}

delay(10);

}

}

stop = 0;

}


Это скетч на двойное нажатие. Result - это сколько раз нажали.

(8 баллов) 2
исправил
Не понятно, как же отследить короткое и длительное нажатие. Мне кажется, что здесь очень хорошо получится на секвенсоре состояний, но это не точно...
Код надо оформлять как код:
4.5. Оформляйте код через сниппеты
Чтобы порции кода в сообщениях были читабельными, пользуйтесь функцией «Вставить сниппет»
0 голосов

Вот пример кода функции опроса кнопок


unsigned char Key1_Up,Key1_Down;

//****************************************************************************
void ScanKey1Tast(void)
{
static unsigned char Regvx1=0xa5;
static BOOL Key1_Sost=0;
static BOOL Key1_OldSost=0;

	Regvx1= Regvx1 <<1 ;
	if	(BUTTON1_IO) Regvx1=Regvx1 | 0x01; // подавление дребезга
	if	(Regvx1==0x00) Key1_Sost=1; // если все 00 то стабильно нажата
	if	(Regvx1==0xFF) Key1_Sost=0; //  если все FF то стабильно отжата
	if	((Key1_Sost ==1) & (Key1_OldSost ==0)) Key1_Up=1;
	if	((Key1_Sost ==0) & (Key1_OldSost ==1)) Key1_Down=1;
	Key1_OldSost=Key1_Sost;
}
//****************************************************************************
void ScanKeyboard(void) //  обработка событий нажатия и отжатия кнопки
{
		ScanKey1Tast();

	if (Key1_Up)
		{
		Key1_Up=0;
                что то делаем
		}
	if (Key1_Down)
		{
		Key1_Down=0;
                что то делаем
		}
}

//****************************************************************************

(93 баллов) 1 2 4
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.

    За этот месяц ещё никого.

    ...