Skip to content

Instantly share code, notes, and snippets.

@serega6531
Last active January 23, 2018 23:44
Show Gist options
  • Save serega6531/5eb98f66f4951abef88d40a88500f7c4 to your computer and use it in GitHub Desktop.
Save serega6531/5eb98f66f4951abef88d40a88500f7c4 to your computer and use it in GitHub Desktop.
Библиотека для управления кнопками в Arduino
#include <Arduino.h>
#include "Button.h"
Button::Button(uint8_t buttonPin, ButtonMode buttonMode/* = PRESSED_ON_LOW*/) {
pin = buttonPin;
mode = buttonMode;
pinMode(pin, buttonMode == PRESSED_ON_LOW ? INPUT_PULLUP : INPUT);
}
void Button::tick() {
if (pressJustEnded) {
pressJustEnded = false;
}
unsigned long time = millis();
if(time < nextPressCheck){
return;
}
if (buttonPressed() && !pressed) {
if(nextPressCheck == 0) {
nextPressCheck = time + 10;
} else {
nextPressCheck = 0;
pressed = true;
pressStart = time;
}
} else if (!buttonPressed() && pressed) {
pressed = false;
pressEnd = time;
pressJustEnded = true;
}
}
boolean Button::isPressed() {
return pressed;
}
boolean Button::justPressed() {
return pressJustEnded;
}
unsigned long Button::getHoldTime() {
return pressed ? millis() - pressStart : pressEnd - pressStart;
}
boolean Button::heldFor(int time) {
return static_cast<boolean>(getHoldTime() >= time);
}
boolean Button::buttonPressed() {
return static_cast<boolean>(digitalRead(pin) == (int) mode);
}
#ifndef BUTTON_H
#define BUTTON_H
#include <inttypes.h>
#include <Arduino.h>
enum ButtonMode {
PRESSED_ON_HIGH = 0x1,
PRESSED_ON_LOW = 0x0
};
class Button {
public:
explicit Button(uint8_t buttonPin, ButtonMode buttonMode = PRESSED_ON_LOW);
void tick();
boolean isPressed();
boolean justPressed();
unsigned long getHoldTime();
boolean heldFor(int time);
private:
uint8_t pin;
ButtonMode mode;
boolean pressed = false;
boolean pressJustEnded = false;
unsigned long pressStart = 0;
unsigned long pressEnd = 0;
unsigned long nextPressCheck = 0;
boolean buttonPressed();
};
#endif //BUTTON_H
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment