ESP8266 Arduino — комбинированное событие двух кнопокC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 ESP8266 Arduino — комбинированное событие двух кнопок

Сообщение Anonymous »

На моем esp8266 я пытаюсь отличить три события:
  • Нажата черная кнопка на контакте D6
  • Нажата красная кнопка на контакте D7.
  • Кнопки кабины нажаты не менее 2 секунд.
Прямо перед комбо -event (3) одно из событий (1/2) уволенный. Этого не должно произойти. Должна быть только регистрация комбо-события.
Я использую библиотеку Bounce2 для лучшего распознавания сигналов. Это прекрасно работает.
Вот мой отдельный класс ButtonController:
ButtonController.h
#include
#include

class ButtonController {
public:
using Callback = std::function;

ButtonController(int pinBlack, int pinRed, int comboDelay = 2000);
void begin();
void update();

// Event-Handler-Setter
void onButtonBlackPressed(Callback callback);
void onButtonRedPressed(Callback callback);
void onCombinationPressed(Callback callback);

private:
int pinBlack;
int pinRed;
int gracePeriodStart = 0;
unsigned long comboDelay;

void resetFlags();

Bounce buttonBlack;
Bounce buttonRed;

// Timestamp for combination recognition
unsigned long comboStartTime = 0;

// callback-functions
Callback blackPressedCallback;
Callback redPressedCallback;
Callback comboPressedCallback;
};

ButtonController.cpp
#include "ButtonController.h"

ButtonController::ButtonController(int pinBlack, int pinRed, int comboDelay)
: pinBlack(pinBlack), pinRed(pinRed), comboDelay(comboDelay) {}

void ButtonController::begin() {
pinMode(pinBlack, INPUT_PULLUP);
pinMode(pinRed, INPUT_PULLUP);

// Initialize Bounce-Objects
buttonBlack.attach(pinBlack);
buttonRed.attach(pinRed);
buttonBlack.interval(50); // Debounce-Zeit in ms
buttonRed.interval(50);
}

void ButtonController::update() {
// Update Bounce-Objects
buttonBlack.update();
buttonRed.update();

bool blackPressed = buttonBlack.read() == LOW;
bool redPressed = buttonRed.read() == LOW;

// When a button is pressed, a “Grace Period” time window starts
if (buttonBlack.fell()) {
gracePeriodStart = millis();
}
if (buttonRed.fell()) {
gracePeriodStart = millis();
}

// Check whether both buttons are pressed within the time window of 200 ms
if (blackPressed && redPressed && (millis() - gracePeriodStart = 5000) {
// If both buttons remain pressed for 5 seconds, trigger combined event
if (comboPressedCallback) {
comboPressedCallback();
}
comboStartTime = 0; // reset timer
gracePeriodStart = 0; // reset Grace Period
}
} else {
// If one of the buttons is released before the combination event is triggered, reset
comboStartTime = 0;

// Trigger individual events only if the combined event is not running
if (buttonBlack.fell() && !redPressed) {
if (blackPressedCallback) {
blackPressedCallback();
}
}

if (buttonRed.fell() && !blackPressed) {
if (redPressedCallback) {
redPressedCallback();
}
}
}
}

void ButtonController::onButtonBlackPressed(Callback callback) {
blackPressedCallback = callback;
}

void ButtonController::onButtonRedPressed(Callback callback) {
redPressedCallback = callback;
}

void ButtonController::onCombinationPressed(Callback callback) {
comboPressedCallback = callback;
}

Вот как я использую этот класс в своем main.cpp
#include "ButtonController.h"

const int PIN_BUTTON_BLACK = D6;
const int PIN_BUTTON_RED = D7;
const int BUTTON_COMBO_DELAY = 2000;

ButtonController buttonController(PIN_BUTTON_BLACK, PIN_BUTTON_RED, BUTTON_COMBO_DELAY);

void handleBlackButtonPress() {
Serial.println("BLACK Button pressed");
}
void handleRedButtonPress() {
Serial.println("RED Button pressed");
}
void handleCombinationPress() {
Serial.println("Combo-Event");
}

void setup() {
Serial.begin(9600);
buttonController.begin();
buttonController.onButtonBlackPressed(handleBlackButtonPress);
buttonController.onButtonRedPressed(handleRedButtonPress);
buttonController.onCombinationPressed(handleCombinationPress);
}

void loop() {
buttonController.update();
}



Подробнее здесь: https://stackoverflow.com/questions/791 ... ombo-event
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Отправка и получение данных с помощью приложения Android, Arduino и модуля Wi-Fi esp8266
    Anonymous » » в форуме Android
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Arduino-esp8266 использовать с C# вместо приложения RemoteXY [закрыто]
    Anonymous » » в форуме C#
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Отправка и получение данных с помощью приложения Android, Arduino и модуля Wi-Fi esp8266
    Anonymous » » в форуме Android
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Отключение веб-сокета Arduino ESP8266 через случайное время
    Anonymous » » в форуме C++
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Отправка и получение данных с использованием Android Application, Arduino и ESP8266 WiFi модуль
    Anonymous » » в форуме Android
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»