Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
First draft of packaging library for github
- Loading branch information
0 parents
commit f2588c9
Showing
8 changed files
with
357 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
/* | ||
Switch | ||
Copyright (C) 2012 Albert van Dalen http://www.avdweb.nl | ||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License | ||
as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. | ||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty | ||
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License at http://www.gnu.org/licenses . | ||
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
# Switch library | ||
|
||
Copyright (C) 2012 Albert van Dalen <http://www.avdweb.nl> | ||
|
||
For more information see: <http://www.avdweb.nl/arduino/hardware-interfacing/simple-switch-debouncer.html> | ||
|
||
### Arduino library for debouncing switches and buttons | ||
|
||
Switches and push buttons need debouncing. It is straightforward to do this with software, using a library. The advantages of the Switch library are: | ||
|
||
- External pull-up resistors are not required. | ||
- Supports also long press and double clicks. | ||
- Performs not just de-bouncing, but also de-glitching against EMC pulses. | ||
|
||
#### New: software deglitch | ||
|
||
Normally, just debouncing is used. But debouncing doesn't make the software insensitive to noise pulses, which could lead to dangerous situations: if there is a poll() at the moment of a noise pulse, the software can detect an activated switch. To prevent this, a deglitch function is added now: during a "deglitchPeriod", all input values have to be equal. | ||
|
||
#### Connecting switches to the Arduino | ||
|
||
There is nothing needed beyond the switches, just connect the switches between the ground and a digital pin: | ||
|
||
#### Switch between GND and digital pin | ||
|
||
This is technically speaking the best solution and is taken by the library as default. An external pull-up resistor is not needed but allowed. | ||
|
||
#### Switch between 5V and digital pin | ||
|
||
For switches connected to the Arduino power supply, the settings are: polarity = HIGH and pinmode = INPUT, which disables the internal pull-up resistor. Note that we need external pull-down resistors of about 10k here. | ||
|
||
#### Using the Switch library | ||
|
||
All switched have to be polled individually to update the status. Each switch-status has its own get function: | ||
|
||
#### pushed() | ||
|
||
Use only for push buttons. It returns "true" if a button was pushed after the poll() instruction was executed. Note that this is in fact "single-click". | ||
|
||
#### released() | ||
|
||
It returns "true" if a push button was released, this will however rarely be used. | ||
|
||
#### on() | ||
|
||
Use only for toggle switches. It returns "true" as long as the switch is in the "on" position. The polarity of the switch in the "on" position has to be filled in correctly. There is no off() function, this is simply !on(). | ||
|
||
#### longPress() | ||
|
||
It returns "true" if a push button is pressed longer than 300ms. The note at doubleClick() applies also here. | ||
|
||
#### doubleClick() | ||
|
||
It returns "true" if a push button is double clicked within 250ms. Note that a doubleClick() always will be preceded by pushed() from the first push. This can't be avoided, because then the pushed() function would have to wait on a possible second click, which would introduce an annoying delay. So, the action on doubleClick() has to undone the previous action on pushed(). | ||
|
||
### Notes | ||
|
||
The poll instruction must be called at least 50 times per second, it takes about 20us. | ||
|
||
The button states are saved till the next poll. Then all previous button states will be cleared, so the buttons must be read every poll interval. | ||
|
||
Reading a button several times within a poll interval gives the same value, so reading doesn't clear the button state. | ||
How to use successive button events | ||
|
||
With the Switch library, you can use all button events at the same time with the same button. For example pushed(), released(), doubleClick() and longPress(). To see how several button events can be used together, run Windows Explorer: a single click selects a file and a double click opens it. | ||
|
||
#### Button pushed event followed by a longPress event | ||
|
||
A long-press generates first a pushed event and after 300ms the longPress event. This is not a shortcoming but a logical consequence. We can, of course, not always wait 300ms to see if a push might be a long push. | ||
|
||
#### Button pushed event followed by a doubleClick event | ||
|
||
The same happens with doubleClick, which also generates two pushed() events. When doubleClick is used, ignore the second pushed() result or don't call pushed(). When doubleClick is not needed, simply don't call doubleClick(). | ||
|
||
#### Software debounce, how does it work | ||
|
||
The software debounce algorithm is based on the following assumptions; the 50ms is the so-called debounce delay: | ||
|
||
The switch bounce time is less than 50ms. | ||
The time between successive keystrokes is larger than 50ms. | ||
A reaction time of 50ms is acceptable. | ||
If the above assumptions are met, the software debounce algorithm can be quite simple: a switch event is only accepted when the elapsed time since the last switch event is larger than the debounce delay. | ||
|
||
A debounce delay of 50ms is a safe value; it doesn't hurt the reaction time, and will handle even bad switches. | ||
|
||
``` | ||
if((newlevel != level) & (millis() - _switchedTime >= debounceDelay)) | ||
``` | ||
Using an interrupt service routine for polling the buttons | ||
|
||
Polling buttons has a high priority, slow functions such as Serial.print() may disrupt the timing. See here how to use an ISR for polling the buttons: | ||
|
||
``` | ||
#include <Arduino.h> | ||
#include "Switch.h" | ||
#include <FrequencyTimer2.h> | ||
Switch speedUpBtn(1); | ||
Switch speedDownBtn(2); | ||
Switch buttonLeft(3); | ||
Switch buttonRight(4); | ||
void setup(void) | ||
{ Serial.begin(9600); | ||
FrequencyTimer2::setPeriod(1000); | ||
FrequencyTimer2::setOnOverflow(timer2ISR); | ||
} | ||
void loop(void) | ||
{ printAll(); // run slow functions in loop() | ||
} | ||
void timer2ISR() | ||
{ pollAll(); // polling buttons has priority | ||
buttonActions(); | ||
} | ||
``` | ||
|
||
See also: [A Guide To Debouncing](http://www.eng.utah.edu/~cs5780/debouncing.pdf) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
/* | ||
Switch | ||
Copyright (C) 2012 Albert van Dalen http://www.avdweb.nl | ||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License | ||
as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. | ||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty | ||
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License at http://www.gnu.org/licenses . | ||
Version 20-4-2013 | ||
_debounceDelay=50 | ||
Version 22-5-2013 | ||
Added longPress, doubleClick | ||
_______________________ _false | ||
| | || | | ||
input | || ||| | | ||
_____| ||_||| ||____________ | ||
poll ^ ^ ^ ^ | ||
switchedTime ^ ^ | ||
<---------100ms--------><---> | ||
debounceDelay <----50ms----> <----50ms----> | ||
switched 1 1 0 0 | ||
newlevel 1 0 1 0 | ||
________________________ | ||
level _____| |___________________ | ||
....................................................................... | ||
_______________________ _______ | ||
| | | | ||
input | | | | ||
________| |___________| | ||
longPressDelay <-----------> | ||
doubleClickDelay <--------------------------------------> | ||
_________ | ||
longPressLatch ______________________| |_________________ | ||
_ | ||
_longPress ______________________| |__________________________ | ||
_ | ||
_doubleClick ____________________________________________| |____ | ||
*/ | ||
|
||
#if ARDUINO >= 100 | ||
#include "Arduino.h" | ||
#else | ||
#include "WProgram.h" | ||
#endif | ||
#include "Switch.h" | ||
|
||
// level(0) | ||
Switch::Switch(byte _pin, byte PinMode, bool polarity, int debounceDelay, int longPressDelay, int doubleClickDelay): | ||
pin(_pin), polarity(polarity), debounceDelay(debounceDelay), longPressDelay(longPressDelay), doubleClickDelay(doubleClickDelay) | ||
{ pinMode(pin, PinMode); | ||
_switchedTime = millis(); | ||
level = digitalRead(pin); | ||
} | ||
|
||
bool Switch::poll() | ||
{ _longPress = _doubleClick = false; | ||
bool newlevel = digitalRead(pin); | ||
|
||
if(!longPressLatch) | ||
{ _longPress = on() && ((long)(millis() - pushedTime) > longPressDelay); // true just one time between polls | ||
longPressLatch = _longPress; // will be reset at next switch | ||
} | ||
|
||
if((newlevel != level) & (millis() - _switchedTime >= debounceDelay)) | ||
{ _switchedTime = millis(); | ||
level = newlevel; | ||
_switched = 1; | ||
longPressLatch = false; | ||
|
||
if(pushed()) | ||
{ _doubleClick = (long)(millis() - pushedTime) < doubleClickDelay; | ||
pushedTime = millis(); | ||
} | ||
return _switched; | ||
} | ||
return _switched = 0; | ||
} | ||
|
||
bool Switch::switched() | ||
{ return _switched; | ||
} | ||
|
||
bool Switch::on() | ||
{ return !(level^polarity); | ||
} | ||
|
||
bool Switch::pushed() | ||
{ return _switched && !(level^polarity); | ||
} | ||
|
||
bool Switch::released() | ||
{ return _switched && (level^polarity); | ||
} | ||
|
||
bool Switch::longPress() | ||
{ return _longPress; | ||
} | ||
|
||
bool Switch::doubleClick() | ||
{ return _doubleClick; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
/* | ||
Switch | ||
Copyright (C) 2012 Albert van Dalen http://www.avdweb.nl | ||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License | ||
as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. | ||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty | ||
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License at http://www.gnu.org/licenses . | ||
*/ | ||
|
||
#ifndef SWITCH_H | ||
#define SWITCH_H | ||
|
||
class Switch | ||
{ | ||
public: | ||
Switch(byte _pin, byte PinMode=INPUT_PULLUP, bool polarity=LOW, int debounceDelay=50, int longPressDelay=400, int doubleClickDelay=250); | ||
bool poll(); // Returns 1 if switched | ||
bool switched(); // will be refreshed by poll() | ||
bool on(); | ||
bool pushed(); // will be refreshed by poll() | ||
bool released(); // will be refreshed by poll() | ||
bool longPress(); // will be refreshed by poll() | ||
bool doubleClick(); // will be refreshed by poll() | ||
|
||
unsigned long _switchedTime, pushedTime; | ||
|
||
protected: | ||
const byte pin; | ||
const int debounceDelay, longPressDelay, doubleClickDelay; | ||
const bool polarity; | ||
bool level, _switched, _longPress, longPressLatch, _doubleClick; | ||
}; | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
#if ARDUINO >= 100 | ||
#include "Arduino.h" | ||
#else | ||
#include "WProgram.h" | ||
#endif | ||
|
||
#include <Streaming.h> | ||
#include "Switch.h" | ||
|
||
const byte toggleSwitchpin = 3; // (right button) | ||
const byte buttonGNDpin = 4; // (left button) | ||
const byte ButtonVCCpin = 6; | ||
const byte Button10mspin = 8; | ||
int i; | ||
|
||
Switch buttonGND = Switch(buttonGNDpin); // button to GND, use internal 20K pullup resistor | ||
Switch toggleSwitch = Switch(toggleSwitchpin); | ||
Switch buttonVCC = Switch(ButtonVCCpin, INPUT, HIGH); // button to VCC, 10k pull-down resistor, no internal pull-up resistor, HIGH polarity | ||
Switch button10ms = Switch(Button10mspin, INPUT_PULLUP, LOW, 1); // debounceTime 1ms | ||
|
||
void setup() | ||
{ Serial.begin(9600); | ||
} | ||
|
||
void loop() | ||
{ buttonGND.poll(); | ||
if(buttonGND.switched()) Serial << "switched "; | ||
if(buttonGND.pushed()) Serial << "pushed " << ++i << " "; | ||
if(buttonGND.released()) Serial << "released\n"; | ||
|
||
if(toggleSwitch.poll()) Serial << toggleSwitch.on() << endl; | ||
if(toggleSwitch.longPress()) Serial << "longPress1 "; | ||
if(toggleSwitch.longPress()) Serial << "longPress2\n"; | ||
if(toggleSwitch.doubleClick()) Serial << "doubleClick1 "; | ||
if(toggleSwitch.doubleClick()) Serial << "doubleClick2\n"; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
####################################### | ||
# Syntax Coloring Map For Switch | ||
####################################### | ||
|
||
####################################### | ||
# Datatypes (KEYWORD1) | ||
####################################### | ||
Switch KEYWORD1 | ||
####################################### | ||
# Methods and Functions (KEYWORD2) | ||
####################################### | ||
poll KEYWORD2 | ||
switched KEYWORD2 | ||
on KEYWORD2 | ||
pushed KEYWORD2 | ||
released KEYWORD2 | ||
longPress KEYWORD2 | ||
doubleClick KEYWORD2 | ||
####################################### | ||
# Instances (KEYWORD2) | ||
####################################### | ||
|
||
####################################### | ||
# Constants (LITERAL1) | ||
####################################### |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
{ | ||
"name": "Switch", | ||
"frameworks": "Arduino", | ||
"keywords": "Button, Debounce, Switch", | ||
"description": "Arduino library for debouncing switches and buttons", | ||
"url": "https://github.com/blackketter/Switch", | ||
"authors": | ||
[ | ||
{ | ||
"name": "Albert van Dalen" | ||
}, | ||
], | ||
"repository": | ||
{ | ||
"type": "git", | ||
"url": "https://github.com/blackketter/Switch" | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
name=Switch | ||
version=22 | ||
author=Albert van Dalen | ||
maintainer=Dean Blackketter | ||
sentence=Arduino library for debouncing switches and buttons | ||
paragraph=Arduino library for debouncing switches and buttons | ||
category=Input | ||
url=https://github.com/blackketter/Switch | ||
architectures=* | ||
|