Инициировать событие при отпускании кнопки
Я использую библиотеку EasyButton для обнаружения нажатий кнопок на Arduino.
Я хочу выполнить функцию, когда пользователь
- Нажимает кнопку
- Нажимает и удерживает кнопку
- Отпускает кнопку
Определять, когда пользователь нажимает кнопку или удерживает ее, очень просто
#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
Что я пробовал
- Проверка состояния внутри события
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
@spuder, 👍0
Обсуждение3 ответа
Просто проверьте состояние easyButton в коде цикла и запустите нужные функции. В библиотеке уже есть нужные вам события, нет смысла создавать свои собственные. Лучше просто установить переменную или флаг в коде события, чтобы оно возвращалось быстро, а затем обрабатывать результаты в основном цикле. Библиотека easyButton сделала большую часть этой работы за вас.
Событие 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();
}
}
Первоначально я начал с библиотеки 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");
}
}
}
- Как переключить светодиод при нажатии кнопки?
- Определение того, была ли нажата и отпущена кнопка
- Нажать клавишу Windows, используя «keyboard.press();»
- Устранение дребезга кнопки с помощью прерывания
- Хорошая кнопка debouncing/Библиотека StateChange
- Напряжение меняется, но цифровой поток всегда HIGH
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
У меня есть 3 состояния, в которых я хочу выполнять разные действия. 1: Нажмите 2: Нажмите и удерживайте 3: Отпустите. Действие удержания и освобождения - проблема, которую я не смог решить., @spuder