Инициировать событие при отпускании кнопки

Я использую библиотеку EasyButton для обнаружения нажатий кнопок на Arduino.

Я хочу выполнить функцию, когда пользователь

  1. Нажимает кнопку
  2. Нажимает и удерживает кнопку
  3. Отпускает кнопку

Определять, когда пользователь нажимает кнопку или удерживает ее, очень просто

#include <Arduino.h>
#include <EasyButton.h>
# define BUTTON_PIN 2;
EasyButton button(BUTTON_PIN);

void onPressedCallback() {
  Serial.println("Button was pressed and released");
}

void onHoldCallback() {
  Serial.println("Button was pressed and held");
}

void setup() {
  button.begin();
  button.onPressed(onPressedCallback);
  button.onPressedFor(buttonHoldDuration, onHoldCallback);
}

Библиотека easyButton содержит следующие события

  • при нажатии
  • онпресседфор
  • последовательность

Есть следующие состояния

  • нажато
  • выпущено
  • было нажато
  • был выпущен
  • нажатоДля
  • выпущено для

Как бы вы инициировали событие, когда кнопка "отпущена"?

Полная документация

https://easybtn.earias.me/docs/on-single-press-api

Что я пробовал

  1. Проверка состояния внутри события
void onHoldCallback() {
  while (button.isPressed() {
     Serial.println("you are still holding the button");
  }
  Serial.println("Button was released");
}

К сожалению, это создает бесконечный цикл, поскольку состояние кнопки никогда не обновляется (button.begin();)

Дополнительные ресурсы

  • https://github.com/evert-arias/EasyButton/tree/main/examples
  • Исходный код системного прерывания https://github.com /evert-arias/EasyButton/blob/4e818410252e9518564fc55f8d4a976fac70a9b2/src/EasyButton.cpp#L55-L82

, 👍0

Обсуждение

У меня есть 3 состояния, в которых я хочу выполнять разные действия. 1: Нажмите 2: Нажмите и удерживайте 3: Отпустите. Действие удержания и освобождения - проблема, которую я не смог решить., @spuder


3 ответа


0

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

,

1

Событие onPressed() запускает функцию обратного вызова, когда кнопка был нажат и отпущен.

Вот тестовый скетч, чтобы показать, что я имею в виду. Я также добавил функцию, которую можно использовать для определения момента первого нажатия кнопки.

#include <EasyButton.h>

// EasyButton(вывод uint8_t,
// uint32_t debounce_time = 35,
// bool pullup_enable = true,
// логическое значение active_low = true)
EasyButton button(2);

void onReleased(){
  Serial.println("Button Releast");
}

void firstPressed(){
  Serial.println("First Pressed");
}

void setup(){

  // Тестовый вывод на последовательный монитор.
  Serial.begin(9600);

  // Инициализировать кнопку.
  button.begin();

  // Добавляем callback-функцию для вызова
  // когда кнопка нажата, то отпускаем.
  // ПРИМЕЧАНИЕ. Эта функция вызывается только ПОСЛЕ
  // кнопка отпущена.
  button.onPressed(onReleased);

}

void loop(){

  // Постоянно читаем статус кнопки.
  button.read();

  // Вызов функции в момент нажатия кнопки.
  if(button.wasPressed()){
    firstPressed();
  }

}
,

-1

Первоначально я начал с библиотеки EasyButton, но когда я не смог заставить ее работать, я переключился на библиотеку madleech/Button@^1.0.0 и получил следующую работу.

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

Хотя это и отличается от первоначального вопроса, я считаю, что этим стоит поделиться со всеми, кто хочет получить работающее, но (не идеальное) решение.

#include <Arduino.h>

#include <Button.h>

Button button1(2);

unsigned long buttonCheckMillis;

void setup()
{
  buttonCheckMillis = millis();
  button1.begin();
}

void loop()
{
  if (button1.toggled()) {
    // Пользователь нажал кнопку
    if (button1.read() == Button::PRESSED) {
      Serial.println("Button Pressed");
    }
    // Пользователь отпустил кнопку
    else {
      Serial.println("Button Released");
    }
  }
  // Опрашиваем каждые 100 миллисекунд, чтобы узнать, удерживает ли пользователь кнопку
  if (millis() - buttonCheckMillis > 100) {
    buttonCheckMillis = millis();
    if (button1.read() == Button::PRESSED) {
      Serial.println("Button Held");
    }
  }

}
,