Хорошая кнопка debouncing/Библиотека StateChange

Мне нужно debouncing/StateChange для конфигурации кнопки. Есть ли хорошая библиотека для отмены/изменения состояния кнопок в Arduino (без задержки)?

, 👍8

Обсуждение

Обычно я проверяю состояние кнопки каждые несколько миллисекунд и сохраняю его в массиве. Затем я проверяю, все ли сохраненные значения ВЫСОКИЕ или низкие., @Gerben

"Лучший", особенно без каких-либо (или достаточных) критериев, вызвал бы совершенно субъективные ответы и поэтому не подходит для stackexchange.com. Если вы сможете перефразировать свой вопрос, сделать его более объективным, он получит более полезные результаты (не говоря уже о том, что он останется открытым!)., @JRobert

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


7 ответов


1

Я могу порекомендовать следующую библиотеку:

http://log.liminastudio.com/itp/physical-computing/arduino-a-new-improved-button-library-with-some-handy-features https://github.com/virgildisgr4ce/Button

На сайте вы найдете несколько примеров того, как его использовать. Я уже реализовал эту библиотеку в нескольких скетчах, и она работает очень надежно.

,

5

Я думаю,что вам нужно обнаружение кнопки на основе прерываний. Таким образом, ваш 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

Удачи вам!

,

1

Вы можете поставить конденсатор параллельно переключателю - 100nf должен сделать свое дело. Некоторые конденсаторы имеют минус на упаковке, рядом с одним из выводов - если это так, убедитесь, что эта сторона отрицательна (земля).

,

7

Библиотека кнопок в Arduino playground работает отлично.

,

Эта библиотека великолепна! BUTTTT dosn не работает с ESP8266, потому что между тем Arduino имеет внутренний подтягивающий резистор, которого нет у ESP (во всех контактах)!!!, @k.Cyborg

Эта ссылка теперь разорвана, @m3z


1

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

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;
}
}
,

2

Вы можете воспользоваться моей библиотекой

https://github.com/anlgncr/Buttons

Эта библиотека позволяет использовать столько кнопок, сколько вы хотите, только с одним экземпляром класса.

Вы также можете вызвать функцию при нажатии или отпускании кнопки.

,

3

Я занимаюсь этой темой прямо сейчас и воспользуюсь этим, чтобы отметить свои выводы.

Я нашел много библиотек по этому вопросу, и вот мой список желаний:

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

Кандидаты:

  • 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. Причины:

  • с точки зрения деблокирования И устранения сбоев, согласно моим тестам, он работал лучше
  • Мне нужно решение для кнопок и переключателей, и оно предоставляет их в одном классе
,