Снова о кнопке.
- Войдите на сайт для отправки комментариев
Сб, 20/10/2018 - 10:04
Вынесу идею по чтению состояния кнопки на форум.
Состояние кнопки содержится в переменной stateButt.
БИТ_0 - настоящее состояние
БИТ_1 - предыдущее состояние
биты 2-7 - история состояний
Скетч
word carrMillis, prevMillis, intervalMs = 40; const byte pinButt = 7; #define NOT_PRESSED B11 #define CLICK_DOWN B10 #define RETENTION 0 #define CLICK_UP B01 byte stateButt = NOT_PRESSED; void setup() { Serial.begin(9600); pinMode(pinButt, INPUT_PULLUP); } void loop() { carrMillis = millis(); if(carrMillis - prevMillis >= intervalMs){ prevMillis = carrMillis; stateButt <<= 1; if(digitalRead(pinButt)) stateButt |= 1; switch (stateButt & B11){ case NOT_PRESSED: Serial.println(1); break; case CLICK_DOWN: Serial.println("CLICK_DOWN"); break; case RETENTION: Serial.println(0); break; case CLICK_UP: Serial.println("CLICK_UP"); break; } } }
У меня два вопроса:
1. Зачем это может понадобиться?
2. Что делать, если у меня в проекте 40 кнопок?
2. Что делать, если у меня в проекте 40 кнопок?
Призвать Квона заклинанием "class Cl_but"
та шо его призывать, он сам придёть.
У меня два вопроса:
1. Зачем это может понадобиться?
2. Что делать, если у меня в проекте 40 кнопок?
1. Вот купит новичок Ардуино, кнопку и захочет прикрутить ее к плате. Зайдет на ардуино.ру а тут готовый пример. Он обрадуется и на радостях кинет мне в кошелек пару баксов. Вот я и разбогатею))
2. Застрелицца)) Я больше пяти не подключал...
А если серьезно, это всего лишь один из вариантов работы с кнопкой.
Так что я не против, вы богатейте по маленьку. дурень думкою багатие
А вот ещё время помнить. И повтор при нажатой иметь.
А вот ещё время помнить. И повтор при нажатой иметь.
Повтор при удержании примерно так.
А время клика помнить не обязательно. История состояния за 0.3 сек содержится в stateButt
1. Вот купит новичок Ардуино, кнопку и захочет прикрутить ее к плате. Зайдет на ардуино.ру а тут готовый пример. Он обрадуется и на радостях кинет мне в кошелек пару баксов. Вот я и разбогатею))
А опросить - достаточно одной строки buttonState = digitalRead(buttonPin);
Зачем больше?
А если серьезно, это всего лишь один из вариантов работы с кнопкой.
И чем этот вариант лучше других? (чем хуже - понятно: длиннее)
andriano, троллите что-ли?
Вот пример как можно отслеживать одиночное нажатие, двойное и удержание кнопки.
А чего в первом примере значение intervalMs 40, а в этом уже 50? А если stateButt , prevMillis и др будут не в одном экземпляре, то можна 40 кнопок подключить?
Для 40 кнопок достаточно stateButt размножить. А вот с дребезгом и двойным нажатием всёж не всё ясно.
А чего в первом примере значение intervalMs 40, а в этом уже 50? А если stateButt , prevMillis и др будут не в одном экземпляре, то можна 40 кнопок подключить?
При интервале опроса 40 мс сложнее двойной клик отловить. Нужно быстро кликать. Или stateButt объявлять в два байта.
Про 40 кнопок не думал. Наверное проще в матрицу объединить 5х8 и задействовать два порта.
Для 40 кнопок достаточно stateButt размножить. А вот с дребезгом и двойным нажатием всёж не всё ясно.
Массив в 40 байт? Не думаю, что это оптимальный вариант.
За 40-50 мс дребезг "устаканивается".
Двойной клик хорошо отлавливается. Или у Вас не работает?
Можно даже отловить короткий клик и длинный. Если вдруг кому потребуется.
andriano, троллите что-ли?
Это я троллю?
То есть размещение без всяких комментариев сомнительного кода - это не троллинг, а попытка выяснить, что же хотел сказать автор этого кода - троллинг?
Вот пример как можно отслеживать одиночное нажатие, двойное и удержание кнопки.
И чем этот способ лучше традиционных?
Если бы код сразу без "пример как можно отслеживать" содержал признаки одиночного, двойного нажатия и удержания - тогда хотя бы понятно. Можно по крайней мере сравнивакть с творением Клапауция (которое, кстати, тоже вызывает множество вопросов), а так - вообще нет предмета для разговора.
Так зачем был размещен данный код?
Что в нем есть такого, чего не было хотя бы в том же примере Клапауция?
Чем предложенная реализация лучше имеющихся?
Меня всегда удивлял двойной клик на микропроцессорных игрушках. С одной стороны надо иметь быструю реакцию на кнопку, с другой стороны надо различить одинарный и двойной, значит надо ждать какое то время после первого нажатия, иначе начнёшь реагировать на одинарное, а тут двойное. В этом ключе мне кажется более логичным короткое, длинное и множественный повтор короткого при постоянном удержании кнопки. Покрайней мере этого достаточно ходить по меню и менять цифровые константы. Для этого нужно время нажатия помнить. У вас только 300 мс можно запомнить. Этого мало для длинного клика.
Чем предложенная реализация лучше имеющихся?
Тем, что это моя реализация. Не нравится, проходим мимо. Есть замечания по коду - велкам.
Коментарии типа "это битовый сдвиг" считаю неуместными.
Кто не понял как подключается кнопка. Только вместо D2 у меня D7. R1 не обязателен. Если длинные провода до кнопки или сильные помехи, тогда между D7 и +питания резистор 1-10 кОм.
Меня всегда удивлял двойной клик на микропроцессорных игрушках. С одной стороны надо иметь быструю реакцию на кнопку, с другой стороны надо различить одинарный и двойной, значит надо ждать какое то время после первого нажатия, иначе начнёшь реагировать на одинарное, а тут двойное. В этом ключе мне кажется более логичным короткое, длинное и множественный повтор короткого при постоянном удержании кнопки. Покрайней мере этого достаточно ходить по меню и менять цифровые константы. Для этого нужно время нажатия помнить. У вас только 300 мс можно запомнить. Этого мало для длинного клика.
Все Ваши хотелки, плюс отлавливается двойной и тройной клик при быстрой реакции.
Меня всегда удивлял двойной клик на микропроцессорных игрушках. С одной стороны надо иметь быструю реакцию на кнопку, с другой стороны надо различить одинарный и двойной, значит надо ждать какое то время после первого нажатия, иначе начнёшь реагировать на одинарное, а тут двойное.
Вопрос на самом деле гораздо глубже.
Любой проект должен сначала проходить через стадию проектирования. И именно на этой стадии должна быть принята непротиворечивая система сигналов. В частности, действия, "повешенные" на одинарный и двойной щелчок должны не противоречить, а, наоборот - дополнять друг друга. Т.е. при двойном щелчке одновременно выполняется и одиночный, и реакция на него должна быть такой, чтобы это не разрушало логику отклика системы на воздействие.
Вот, например, при работе с меню при помощи энкодера требуется еще минимум две кнопки, но у энкодера, как правило, есть только одна кнопка. Иногда пытаются повесить обе функции на эту кнопку, например, короткое и длинное нажатие. Но это ошибка проектирования интерфейса, она существенно замедляет работу пользователя с меню, действует на нервы и приводит к многочисленным ошибкам.
Тем, что это моя реализация. Не нравится, проходим мимо. Есть замечания по коду - велкам.
Понятно. Вопросов больше нет.
Теперь замечания по коду:
1. Код бесполезен. По крайней мере, автор не сумел привести никаких аргументов его полезности (а то, что это его код, полезности ему никак не добавляет).
2. Код практически недокументирован. Неясно, что, почему и зачем.
3. Код немасштабируем. В случае двух кнопок его нужно будет переписывать практически заново. Коль уж язык позволяет, следует использовать хоть какие-то элементы ООП (хотя бы даже как у Квона или Клапауция).
4. Код невозможно использовать без переписывания. Например, если у меня кнопка не простая, а в матрице, то представленный код не подходит, вместо него надо писать другой. Никаких механизмов адаптации кода под конкретную задачу (то же самое ООП) в коде не предусмотрено.
А чего в первом примере значение intervalMs 40, а в этом уже 50? А если stateButt , prevMillis и др будут не в одном экземпляре, то можна 40 кнопок подключить?
При интервале опроса 40 мс сложнее двойной клик отловить. Нужно быстро кликать. Или stateButt объявлять в два байта.
Про 40 кнопок не думал. Наверное проще в матрицу объединить 5х8 и задействовать два порта.
Разумеется в матрицу. И возможно даже сигналы с матрицы не напрямую получать, через расширение портов. Но это на данном уровне софта вобще не важно. Просто у матоицы номер нажатой/отпущеной кнопки немного по другому формируется, как кортеж строба и возврата, а без матрицы - привязка к пину. Вобщем не важно. Хуже другое. Кнопка одна и её номер вобще не предусмотрен. Из-за этого и сложности с масштабированием.