Хорошая кнопка debouncing/Библиотека StateChange
Мне нужно debouncing/StateChange для конфигурации кнопки. Есть ли хорошая библиотека для отмены/изменения состояния кнопок в Arduino (без задержки)?
@RYN, 👍8
Обсуждение7 ответов
Я могу порекомендовать следующую библиотеку:
http://log.liminastudio.com/itp/physical-computing/arduino-a-new-improved-button-library-with-some-handy-features https://github.com/virgildisgr4ce/Button
На сайте вы найдете несколько примеров того, как его использовать. Я уже реализовал эту библиотеку в нескольких скетчах, и она работает очень надежно.
Я думаю,что вам нужно обнаружение кнопки на основе прерываний. Таким образом, ваш Arduino может делать то, что ему нужно, не останавливаясь из-за функции задержки.
// Пример использования кода
int pin = 13; // Светодиод на плате
int interrupt0pin = 2; // pin прикреплен к int0, если вы используете Uno
int buttonState;
void setup()
{
pinMode(pin, OUTPUT);
pinMode(interrupt0pin, INPUT);
attachInterrupt(0, buttonUpdate, CHANGE); // вызывает buttonUpdate() при изменении ввода кнопки (вы также можете использовать high-to-low или low-to-high).
}
void loop()
{
if (buttonState)
digitalWrite(pin, HIGH);
else
digitalWrite(pin, LOW);
}
void buttonUpdate()
{
buttonState = digitalRead(interrupt0pin);
delay(50); // 50 мс работает для большинства переключателей - регулируется
}
Узнайте больше здесь: http://arduino.cc/en/Reference/AttachInterrupt
Удачи вам!
Вы можете поставить конденсатор параллельно переключателю - 100nf должен сделать свое дело. Некоторые конденсаторы имеют минус на упаковке, рядом с одним из выводов - если это так, убедитесь, что эта сторона отрицательна (земля).
Библиотека кнопок в Arduino playground работает отлично.
Эта библиотека великолепна! BUTTTT dosn не работает с ESP8266, потому что между тем Arduino имеет внутренний подтягивающий резистор, которого нет у ESP (во всех контактах)!!!, @k.Cyborg
Эта ссылка теперь разорвана, @m3z
На днях я собрал это для одного парня. Это не библиотека, но она позволяет читать и отключать все ваши кнопки и работает очень хорошо, может быть, это поможет вам
const byte numbuttons = 15; // ОПРЕДЕЛИТЬ, КАК МОГУТ КОНТРОЛИРОВАТЬСЯ ЦИФРОВЫЕ ВХОДЫ(КОЛИЧЕСТВО ИСПОЛЬЗУЕМЫХ НИЖЕ КОНТАКТОВ)
const byte digitalpin[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16 }; // ОБЪЯВИТЕ ВСЕ ЦИФРОВЫЕ ВХОДНЫЕ КОНТАКТЫ, КОТОРЫЕ МОГУТ БЫТЬ ИСПОЛЬЗОВАНЫ В ТОМ ПОРЯДКЕ, В КОТОРОМ ОНИ БУДУТ ФИЗИЧЕСКИ ИСПОЛЬЗОВАТЬСЯ(НЕ ВКЛЮЧАЮТ ЛЮБЫЕ КОНТАКТЫ, ИСПОЛЬЗУЕМЫЕ ДЛЯ ДРУГИХ ВЕЩЕЙ
const byte debouncetime = 50; // THIS VALUE IS THE TIME TO WAIT BEFORE RECHECKING (FOR DEBOUNCE
byte readstate[numbuttons]; // READ ARRAY
byte laststate[numbuttons]; // HOLDS THE BUTTON LAST STATE FOR STATE CHANGE DETECTION
byte NumBut; // ЭТО ПЕРЕМЕННАЯ ДЛЯ ЦИФРОВОГО СЧЕТЧИКА FORLOOP
unsigned long checktime; // ЗАПИСЫВАЕТ ВРЕМЯ (В МИЛЛИСАХ) ПЕРЕПРОВЕРКИ СОСТОЯНИЯ ДЛЯ КАЖДОЙ КНОПКИ. ДЛЯ ДЕБЮТА
byte CURRENT_SETTING;
void setup() {
// УСТАНОВКА НАЧАЛЬНЫХ СОСТОЯНИЙ ДЛЯ ЦИФРОВЫХ СИГНАЛОВ
for (NumBut = 0; NumBut < numbuttons; NumBut++) {
pinMode(digitalpin[NumBut], INPUT_PULLUP);
laststate[NumBut] = digitalRead (digitalpin[NumBut]);
checktime = 0;
}
}
void loop() {
//вызовите метод кнопки чтения
READBUTTONS();
PROGRAM_OUTPUT();
}
void READBUTTONS() {
for (NumBut = 0; NumBut < numbuttons; NumBut++) {
readstate[NumBut] = (digitalRead (digitalpin[NumBut])); // СЧИТЫВАНИЕ ЦИФРОВЫХ ВХОДОВ В МАССИВ
if (readstate[NumBut] != laststate[NumBut] && millis() >= checktime ) {
if (readstate[NumBut] == 0 && laststate[NumBut] == 1) {
checktime = millis() + debouncetime;
CURRENT_SETTING = NumBut;
}
laststate[NumBut] = readstate[NumBut];
}
}
}
void PROGRAM_OUTPUT(){
switch ( CURRENT_SETTING ) {
case 0: //сделайте что-нибудь, чтобы отключить разрыв вывода;
case 1: //сделайте что-нибудь с установкой 1 break;
case 2: //сделайте что-нибудь с установкой 2 break;
case 3: //сделайте что-нибудь с установкой 3 break;
default: break;
}
}
Вы можете воспользоваться моей библиотекой
https://github.com/anlgncr/Buttons
Эта библиотека позволяет использовать столько кнопок, сколько вы хотите, только с одним экземпляром класса.
Вы также можете вызвать функцию при нажатии или отпускании кнопки.
Я занимаюсь этой темой прямо сейчас и воспользуюсь этим, чтобы отметить свои выводы.
Я нашел много библиотек по этому вопросу, и вот мой список желаний:
- поддержка многих кнопок
- поддержка переключателей или переключателей
- поддержка деблокирования и, возможно,устранения сбоев
- неблокирующие функции
- поддержка длительного нажатия, двойного щелчка
Кандидаты:
- Switch from avandalen: tutorial - github - lib ref@arduino - @platformio
- EasyButton от Evert Arias: tutorial - github - lib ref@arduino - @platformio
- JCButton от JChristensen: github - lib ref@arduino - @platformio
- ezButton от ArduinoGetStarted: учебник - github - lib ref@arduino - @platformio
Вот мои выводы для каждой библиотеки:
Переключатель
- он действительно прост в использовании
- вы можете использовать его как переключатель или кнопку, один и тот же класс обрабатывает и то, и другое
- поддержка обратных вызовов
- поддерживает множество кнопок
- поддерживает деблокировку и устранение сбоев
- поддержка двойного щелчка и длительного нажатия
- большинство конфигураций имеют значения по умолчанию, и вы определяете их с помощью кнопки setup
- поскольку я использую PlatformIO, некоторые предупреждения из этой библиотеки отображаются при компиляции моего проекта
EasyButton
- он действительно прост в использовании
- очень хорошие документы
- поддержка обратных вызовов
- поддерживает множество кнопок
- не поддерживает переключатели/переключатели, хотя вы можете смоделировать его, проверив свойства
wasPressed
иwasReleased
- поддерживает дебоунсинг
- поддерживает двойной клик, тройной клик или заданное количество кликов.
- у вас может быть другое действие для одинарного, двойного или тройного щелчка по одной и той же кнопке
- поддерживает многократное длительное нажатие, если это необходимо
- большинство конфигураций имеют значения по умолчанию, и вы определяете их с помощью кнопки setup
Кнопка JC
- простота в использовании, не так проста, как переключатель и EasyButton.
- вы можете использовать его как
кнопку
или переключатель (ToggleButton
), разный класс для каждого - поддерживает множество кнопок
- не поддерживает обратные вызовы
- поддерживает дебоунсинг
- поддерживает многократное длительное нажатие, если это необходимо
- большинство конфигураций имеют значения по умолчанию, и вы можете определить их при настройке кнопки, но длительное время нажатия-это то, что вы определяете при запросе его статуса, а не определяете его один раз при настройке кнопки
эзБаттон
- простота в использовании, не так проста, как переключатель и EasyButton.
- поддерживает множество кнопок
- не поддерживает переключатели/переключатели, хотя вы можете смоделировать его, проверив
события IsPressed
иisReleased
- не поддерживает длительное нажатие
- не поддерживает обратные вызовы
- поддерживает дебоунсинг, по умолчанию не дебоунсирует (при настройке необходимо вызвать
setDebounceTime
). - поддерживает простой способ подсчета нажатий кнопок
Вередикт
Я выбрал avdweb/Switch. Причины:
- с точки зрения деблокирования И устранения сбоев, согласно моим тестам, он работал лучше
- Мне нужно решение для кнопок и переключателей, и оно предоставляет их в одном классе
- Кнопка переключения переключает между операторами обращения с разблокированием кнопки
- Программное обеспечение, устраняющее дребезг кнопки при отпускании
- Устранение дребезга кнопки с помощью прерывания
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Нужен ли подтягивающий/понижающий резистор для цепи светодиода кнопки?
- Как прервать функцию цикла и перезапустить ее?
Обычно я проверяю состояние кнопки каждые несколько миллисекунд и сохраняю его в массиве. Затем я проверяю, все ли сохраненные значения ВЫСОКИЕ или низкие., @Gerben
"Лучший", особенно без каких-либо (или достаточных) критериев, вызвал бы совершенно субъективные ответы и поэтому не подходит для stackexchange.com. Если вы сможете перефразировать свой вопрос, сделать его более объективным, он получит более полезные результаты (не говоря уже о том, что он останется открытым!)., @JRobert
Нет такой вещи, как разоблачение без промедления. Некоторая небольшая задержка по определению должна быть введена для того, чтобы система ввода была уверена, что событие не является ложноположительным., @Reinderien