From f347e79d08d30d0d8388b6abed6cd30dcc2e4119 Mon Sep 17 00:00:00 2001 From: thomasfredericks Date: Sat, 21 Dec 2013 23:25:26 -0500 Subject: [PATCH] Moving to version 2 of the library --- Bounce/Bounce.cpp | 84 ++++++++++++++++ Bounce/Bounce.h | 64 ++++++++++++ Bounce/LICENSE | 20 ++++ Bounce/README.md | 93 ++++++++++++++++++ Bounce/examples/bounce/bounce.ino | 39 ++++++++ Bounce/examples/change/change.ino | 44 +++++++++ ...rcuit-bounce-change-duration-retrigger.png | Bin 0 -> 48556 bytes Bounce/examples/duration/duration.ino | 62 ++++++++++++ Bounce/examples/retrigger/retrigger.ino | 72 ++++++++++++++ INSTALL.txt | 1 + 10 files changed, 479 insertions(+) create mode 100644 Bounce/Bounce.cpp create mode 100644 Bounce/Bounce.h create mode 100644 Bounce/LICENSE create mode 100644 Bounce/README.md create mode 100644 Bounce/examples/bounce/bounce.ino create mode 100644 Bounce/examples/change/change.ino create mode 100644 Bounce/examples/circuit-bounce-change-duration-retrigger.png create mode 100644 Bounce/examples/duration/duration.ino create mode 100644 Bounce/examples/retrigger/retrigger.ino create mode 100644 INSTALL.txt diff --git a/Bounce/Bounce.cpp b/Bounce/Bounce.cpp new file mode 100644 index 0000000..2d86647 --- /dev/null +++ b/Bounce/Bounce.cpp @@ -0,0 +1,84 @@ + +// Please read Bounce.h for information about the liscence and authors + +#if defined(ARDUINO) && ARDUINO >= 100 +#include "Arduino.h" +#else +#include "WProgram.h" +#endif +#include "Bounce.h" + + + +Bounce::Bounce() { + this->interval_millis = 10; + +} + +void Bounce::attach(int pin) { + this->pin = pin; + debouncedState = unstableState = digitalRead(pin); + #ifdef BOUNCE_RAPID_FIRE + previous_millis = 0; + #else + previous_millis = millis(); + #endif +} + + + +void Bounce::interval(unsigned long interval_millis) +{ + this->interval_millis = interval_millis; + +} + + +bool Bounce::update() +{ + +#ifdef BOUNCE_RAPID_FIRE + + // Ignore everything if we are locked out + if (millis() - previous_millis >= interval_millis) { + uint8_t currentState = digitalRead(pin); + if (debouncedState != currentState ) { + previous_millis = millis(); + debouncedState = currentState; + return 1; + } + } + return 0; + +#else + // Lire l'etat de l'interrupteur dans une variable temporaire. + uint8_t currentState = digitalRead(pin); + stateChanged = false; + + // Redemarrer le compteur timeStamp tant et aussi longtemps que + // la lecture ne se stabilise pas. + if ( currentState != unstableState ) { + previous_millis = millis(); + } else if ( millis() - previous_millis >= interval_millis ) { + // Rendu ici, la lecture est stable + + // Est-ce que la lecture est différente de l'etat emmagasine de l'interrupteur? + if ( currentState != debouncedState ) { + debouncedState = currentState; + stateChanged = true; + + } + + } + + unstableState = currentState; + return stateChanged; +#endif + +} + +uint8_t Bounce::read() +{ + return debouncedState; +} + diff --git a/Bounce/Bounce.h b/Bounce/Bounce.h new file mode 100644 index 0000000..b53c8da --- /dev/null +++ b/Bounce/Bounce.h @@ -0,0 +1,64 @@ + +/* + * 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 2 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 for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * + Main code by Thomas O Fredericks (tof@t-o-f.info) + Previous contributions by Eric Lowry, Jim Schimpf and Tom Harkaway +* * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Uncomment the following line for "rapid fire" mode +//#define BOUNCE_RAPID_FIRE + + +#ifndef Bounce_h +#define Bounce_h + +#include + +class Bounce +{ + +public: + // Create an instance of the bounce library + Bounce(); + // Attach to a pin (and also sets initial state) + void attach(int pin); + // Sets the debounce interval + void interval(unsigned long interval_millis); + // Updates the pin + // Returns 1 if the state changed + // Returns 0 if the state did not change + bool update(); + // Returns the updated pin state + uint8_t read(); + + +protected: + int debounce(); + unsigned long previous_millis, interval_millis; + uint8_t debouncedState; + uint8_t unstableState; + uint8_t pin; + uint8_t stateChanged; +}; + +#endif + + diff --git a/Bounce/LICENSE b/Bounce/LICENSE new file mode 100644 index 0000000..f945b53 --- /dev/null +++ b/Bounce/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 thomasfredericks + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Bounce/README.md b/Bounce/README.md new file mode 100644 index 0000000..5675ee5 --- /dev/null +++ b/Bounce/README.md @@ -0,0 +1,93 @@ +Bounce-Arduino-Wiring +===================== + +Debouncing library for Arduino or Wiring +by Thomas Ouellet Fredericks +with contributions from: +Eric Lowry +Jim Schimpf +Tom Harkaway + + +Version +==================== + +1.6: Fixed for Arduino 1.0 + +1.5: Added risingEdge and fallingEdge + +1.3: Fixed a bug that was confusing a local variable and an argument + +1.2: Added a duration method + +1.1: Removed a badly formated comment that would halt compiling + +1.0: Initial Release + +Description +==================== + +Bounce is a library for Arduino (arduino.cc). It debounces digital inputs and more (http://en.wikipedia.org/wiki/Debounce#Contact_bounce). + + +License +==================== + +MIT License (MIT) +Copyright (c) 2012 Thomas O Fredericks + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Download, install and import +==================== + +• Put the Bounce folder in your Arduino "libraries". To identify this location open "menu -> File -> Preferences". + + +In the Arduino IDE, select "menubar->Sketch->Import Library->Bounce" to import the library to your sketch. An "#include Bounce.h" line will appear at the top of your Sketch. + +You can also find examples under "menubar->File->Sketchbook->libraries->Bounce" + + +Methods +==================== + +# Bounce(byte pin,unsigned long debounce_interval) + +Instantiates a Debounce object for the specified pin with a debounce time. + +Because Bounce does not use interrupts, you have to "update" the object before reading its value. + +# int update() + +Updates Bounce. Returns true if the pin state changed (HIGH to LOW or LOW to HIGH). False if not. + +# void interval(unsigned long interval) + +Changes the debounce time in milliseconds. + + +# int read() +Reads the updated pin state. + +# void write(int state) +Sets the stored pin state + +# void rebounce(unsigned long interval) +Forces the pin to signal a state change in X milliseconds even if the state does not actually change. +Example: A button that repeats every X milliseconds as long as it is held down + +# unsigned long duration(void) +Returns the number of milliseconds the pin has been in the current state. + +# bool risingEdge() +// The risingEdge method is true for one scan after the de-bounced input goes from off-to-on. + +# bool fallingEdge(); +The fallingEdge method it true for one scan after the de-bounced input goes from on-to-off. + diff --git a/Bounce/examples/bounce/bounce.ino b/Bounce/examples/bounce/bounce.ino new file mode 100644 index 0000000..3e52843 --- /dev/null +++ b/Bounce/examples/bounce/bounce.ino @@ -0,0 +1,39 @@ +#include + +#define BUTTON_PIN 2 +#define LED_PIN 13 + + +// Instantiate a Bounce object +Bounce debouncer = Bounce(); + +void setup() { + // Setup the button + pinMode(BUTTON_PIN,INPUT); + digitalWrite(BUTTON_PIN,HIGH); + + // After setting up the button, setup debouncer + debouncer.attach(BUTTON_PIN); + debouncer.interval(5); + + //Setup the LED + pinMode(LED_PIN,OUTPUT); + +} + +void loop() { + // Update the debouncer + debouncer.update(); + + // Get the update value + int value = debouncer.read(); + + // Turn on or off the LED + if ( value == HIGH) { + digitalWrite(LED_PIN, HIGH ); + } else { + digitalWrite(LED_PIN, LOW ); + } + +} + diff --git a/Bounce/examples/change/change.ino b/Bounce/examples/change/change.ino new file mode 100644 index 0000000..747e17b --- /dev/null +++ b/Bounce/examples/change/change.ino @@ -0,0 +1,44 @@ +#include +#define BUTTON_PIN 2 +#define LED_PIN 13 + +int ledState = LOW; + + +// Instantiate a Bounce object +Bounce debouncer = Bounce(); + +void setup() { + // Setup the button + pinMode(BUTTON_PIN,INPUT); + digitalWrite(BUTTON_PIN,HIGH); + + // After setting up the button, setup Bounce object + debouncer.attach(BUTTON_PIN); + debouncer.interval(500); + + //Setup the LED + pinMode(LED_PIN,OUTPUT); + digitalWrite(LED_PIN,ledState); + +} + +void loop() { + + + boolean stateChanged = debouncer.update(); + int state = debouncer.read(); + + // Detect the raising edge + if ( stateChanged && state == LOW ) { + + if ( ledState == LOW ) { + ledState = HIGH; + } else { + ledState = LOW; + } + digitalWrite(LED_PIN,ledState); + + } +} + diff --git a/Bounce/examples/circuit-bounce-change-duration-retrigger.png b/Bounce/examples/circuit-bounce-change-duration-retrigger.png new file mode 100644 index 0000000000000000000000000000000000000000..2e4114862b7a67742ba534487a215f09bf9855bf GIT binary patch literal 48556 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 + +#define BUTTON_PIN 2 +#define LED_PIN 13 + +// Instantiate a Bounce object +Bounce debouncer = Bounce(); + +int buttonState; +unsigned long buttonPressTimeStamp; + +void setup() { + + Serial.begin(57600); + + // Setup the button + pinMode(BUTTON_PIN,INPUT); + digitalWrite(BUTTON_PIN,HIGH); + + // After setting up the button, setup debouncer + debouncer.attach(BUTTON_PIN); + debouncer.interval(5); + + //Setup the LED + pinMode(LED_PIN,OUTPUT); + +} + +void loop() { + // Update the debouncer and get the changed state + boolean changed = debouncer.update(); + + + + if ( changed ) { + // Get the update value + int value = debouncer.read(); + if ( value == HIGH) { + digitalWrite(LED_PIN, HIGH ); + + buttonState = 0; + Serial.println("Button released (state 0)"); + + } else { + digitalWrite(LED_PIN, LOW ); + buttonState = 1; + Serial.println("Button pressed (state 1)"); + buttonPressTimeStamp = millis(); + + } + } + + if ( buttonState == 1 ) { + if ( millis() - buttonPressTimeStamp >= 2000 ) { + buttonState = 2; + Serial.println("Button held for two seconds (state 2)"); + } + } + + +} + diff --git a/Bounce/examples/retrigger/retrigger.ino b/Bounce/examples/retrigger/retrigger.ino new file mode 100644 index 0000000..124fdee --- /dev/null +++ b/Bounce/examples/retrigger/retrigger.ino @@ -0,0 +1,72 @@ +#include + +#define BUTTON_PIN 2 +#define LED_PIN 13 + +// Instantiate a Bounce object +Bounce debouncer = Bounce(); + +int buttonState; +unsigned long buttonPressTimeStamp; + +int ledState; + +void setup() { + + Serial.begin(57600); + + // Setup the button + pinMode(BUTTON_PIN,INPUT); + digitalWrite(BUTTON_PIN,HIGH); + + // After setting up the button, setup debouncer + debouncer.attach(BUTTON_PIN); + debouncer.interval(5); + + //Setup the LED + pinMode(LED_PIN,OUTPUT); + digitalWrite(LED_PIN,ledState); + +} + +void loop() { + // Update the debouncer and get the changed state + boolean changed = debouncer.update(); + + + + if ( changed ) { + // Get the update value + int value = debouncer.read(); + if ( value == HIGH) { + ledState = LOW; + digitalWrite(LED_PIN, ledState ); + + buttonState = 0; + Serial.println("Button released (state 0)"); + + } else { + ledState = HIGH; + digitalWrite(LED_PIN, ledState ); + + buttonState = 1; + Serial.println("Button pressed (state 1)"); + buttonPressTimeStamp = millis(); + + } + } + + if ( buttonState == 1 ) { + if ( millis() - buttonPressTimeStamp >= 500 ) { + buttonPressTimeStamp = millis(); + if ( ledState == HIGH ) ledState = LOW; + else if ( ledState == LOW ) ledState = HIGH; + digitalWrite(LED_PIN, ledState ); + Serial.println("Retriggering button"); + } + } + + +} + + diff --git a/INSTALL.txt b/INSTALL.txt new file mode 100644 index 0000000..6bd1b59 --- /dev/null +++ b/INSTALL.txt @@ -0,0 +1 @@ +Put the "Bounce" folder in your Arduino "libraries" folder.