-
Notifications
You must be signed in to change notification settings - Fork 235
/
Copy pathBlinkMachine.ino
155 lines (119 loc) · 4.35 KB
/
BlinkMachine.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
BlinkMachine.ino
This is a sample sketch to show how to use the OneButtonLibrary to detect double-click events on a button.
Copyright (c) by Matthias Hertel, http://www.mathertel.de
This work is licensed under a BSD style license. See http://www.mathertel.de/License.aspx
More information on: http://www.mathertel.de/Arduino
The library internals are explained at
http://www.mathertel.de/Arduino/OneButtonLibrary.aspx
Setup a test circuit:
* Connect a pushbutton to pin A1 (Uno) or D3 (ESP8266) and ground.
* The pin 13 (UNO) or D4 (ESP8266) is used for output attach a led and resistor to ground
or see the built-in led on the standard arduino board.
The Sketch shows how to setup the library and bind a "machine" that can blink the LED slow or fast.
A click on the button turns the led on.
A doubleclick on the button changes the blink rate from ON to SLOW to FAST and back.
In the loop function the button.tick function has to be called as often as you like.
State-Diagram
start
| +-------\
V V |
-------- ------ |
| OFF |<--click-+->| ON | |
-------- | ------ |
| | |
| d-click |
| | |
| V |
| ------ |
+- | SLOW | |
| ------ |
| | |
| d-click |
| | |
| V d-click
| ------ |
+--| FAST |---/
------
*/
// 06.10.2012 created by Matthias Hertel
// 26.03.2017 state diagram added, minor changes
#include "OneButton.h"
// The actions I ca do...
typedef enum {
ACTION_OFF, // set LED "OFF".
ACTION_ON, // set LED "ON"
ACTION_SLOW, // blink LED "SLOW"
ACTION_FAST // blink LED "FAST"
}
MyActions;
#if defined(ARDUINO_AVR_UNO) || defined(ARDUINO_AVR_NANO_EVERY)
// Example for Arduino UNO with input button on pin 2 and builtin LED on pin 13
#define PIN_INPUT A1
#define PIN_LED 13
#elif defined(ESP8266)
// Example for NodeMCU with input button using FLASH button on D3 and using the led on -12 module (D4).
// This LED is lighting on output level LOW.
#define PIN_INPUT D3
#define PIN_LED D4
#endif
// Setup a new OneButton on pin A1.
OneButton button(PIN_INPUT, true);
MyActions nextAction = ACTION_OFF; // no action when starting
// setup code here, to run once.
void setup() {
// enable the standard led on pin 13.
pinMode(PIN_LED, OUTPUT); // sets the digital pin as output
// link the myClickFunction function to be called on a click event.
button.attachClick(myClickFunction);
// link the doubleclick function to be called on a doubleclick event.
button.attachDoubleClick(myDoubleClickFunction);
// set 80 msec. debouncing time. Default is 50 msec.
button.setDebounceTicks(80);
} // setup
// main code here, to run repeatedly:
void loop() {
unsigned long now = millis();
// keep watching the push button:
button.tick();
// You can implement other code in here or just wait a while
if (nextAction == ACTION_OFF) {
// do nothing.
digitalWrite(PIN_LED, LOW);
} else if (nextAction == ACTION_ON) {
// turn LED on
digitalWrite(PIN_LED, HIGH);
} else if (nextAction == ACTION_SLOW) {
// do a slow blinking
if (now % 1000 < 500) {
digitalWrite(PIN_LED, LOW);
} else {
digitalWrite(PIN_LED, HIGH);
} // if
} else if (nextAction == ACTION_FAST) {
// do a fast blinking
if (now % 200 < 100) {
digitalWrite(PIN_LED, LOW);
} else {
digitalWrite(PIN_LED, HIGH);
} // if
} // if
} // loop
// this function will be called when the button was pressed 1 time and them some time has passed.
void myClickFunction() {
if (nextAction == ACTION_OFF)
nextAction = ACTION_ON;
else
nextAction = ACTION_OFF;
} // myClickFunction
// this function will be called when the button was pressed 2 times in a short timeframe.
void myDoubleClickFunction() {
if (nextAction == ACTION_ON) {
nextAction = ACTION_SLOW;
} else if (nextAction == ACTION_SLOW) {
nextAction = ACTION_FAST;
} else if (nextAction == ACTION_FAST) {
nextAction = ACTION_ON;
} // if
} // myDoubleClickFunction
// End