-
Notifications
You must be signed in to change notification settings - Fork 0
/
buttons.ino
128 lines (104 loc) · 2.64 KB
/
buttons.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
const int INPUTBTN = 12;
unsigned long debounceDelay = 50;
unsigned long doubleClickDelay = 500;
void setup() {
Serial.begin(9600);
}
void loop() {
if (waitDoubleClick(INPUTBTN)){
Serial.println("double click ...");
}
if (waitHold(INPUTBTN)){
Serial.println("hold ...");
}
if (waitClick(INPUTBTN)){
Serial.println("click ...");
}
}
unsigned long lastDebounceTime = 0;
int stateClick = 0;
int readingClick;
int previousClick = 1;
bool clicked = false;
bool waitClick(int input) {
readingClick = digitalRead(input);
if (readingClick != previousClick) {
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (readingClick != stateClick) {
stateClick = readingClick;
if (stateClick == 1) {
clicked = !clicked;
}
}
}
previousClick = readingClick;
if(clicked && ((millis() - lastDebounceTime) > doubleClickDelay)) {
clicked = !clicked;
return true;
}
return false;
}
unsigned long lastClickTime = 0;
unsigned long firstClick = 0;
int stateDoubleClick = 0;
int readingDoubleClick;
int previousDoubleClick = 1;
bool doubleClicked = false;
int clickNum = 0;
bool waitDoubleClick(int input) {
readingDoubleClick = digitalRead(input);
if (readingDoubleClick != previousDoubleClick) {
// reset the debouncing timer
lastClickTime = millis();
}
if ((millis() - lastClickTime) > debounceDelay) {
if (readingDoubleClick != stateDoubleClick) {
stateDoubleClick = readingDoubleClick;
if (stateDoubleClick == 1) {
doubleClicked = !doubleClicked;
if(clickNum == 0) {
firstClick = millis();
}
clickNum += 1;
}
}
}
previousDoubleClick = readingDoubleClick;
if((millis() - firstClick) > doubleClickDelay && clickNum > 0) {
clickNum = 0;
}
if(clickNum == 2) {
clickNum = 0;
doubleClicked = !doubleClicked;
return true;
}
return false;
}
unsigned long holdDelay = 3000;
unsigned long startHoldDelay = 0;
int stateHold = 0;
int readingHold;
int previousHold = 1;
bool hold = false;
bool waitHold(int input) {
readingHold = digitalRead(input);
if (readingHold != previousHold) {
// reset the debouncing timer
startHoldDelay = millis();
}
if ((millis() - startHoldDelay) >= holdDelay) {
if (readingHold != stateHold) {
hold = true;
}
}
previousHold = readingHold;
if(hold) {
hold = !hold;
startHoldDelay = millis();
return true;
}
return false;
}