Files
thomasfredericks_Bounce2/examples/edge/edge.pde
T
2013-12-21 13:34:31 -05:00

122 lines
3.3 KiB
Plaintext

// Edge Test For use with the DANGER SHIELD
// This code turns a LED on and incraments number displayed on the 7-segment display
// whenever either PB1 or PB2 is pressed. PB1 used the debounce library and PB2 does
// not. PB1 will cleanly increment the displayed value. PB2 will not alway increment
// the display because the switch is not debounced.
//
// The bounce library also detects the rising or falling edge of the input.
// This is often called a one-shot and is usefull if you want something to only
// happen once when a button is pressed or released. The risingEdge method is true
// for only one scan when the input goes from off-to-on. The fallingEdge method is
// true for only one scan when the input goes from on-to-off. Even if you are not
// using the debounce feature the the library you need to call the update method
// every scan for the edge detection to work.
//
// Notes:
// The buttons on the Danger Shield pull the input to ground when they are pressed,
// so they act like normally closed switches. If order to make them work like one
// would expect, he tests for the button states are reversed. This also reversesd
// the rising edge test on button1 to a falling edge test.
//
// Since PB2 is not debounced, the edge detection is done directly in the sketch.
//
#include <Bounce.h>
// This code turns a led on/off through a debounced button
// Build the circuit indicated here: http://arduino.cc/en/Tutorial/Button
#define BUTTON1 10
#define BUTTON2 11
#define BUTTON3 12
#define BUZZER 3
#define LED1 5
#define LED2 6
#define LATCH 7
#define CLOCK 8
#define DATA 4
// Shift register bit values to display 0-9 on the seven-segment display
const byte ledCharSet[16] = {
B00111111, B00000110, B01011011, B01001111, B01100110,
B01101101, B01111101, B00000111, B01111111, B01101111,
B01110111, // a
B01111100, // b
B00111001, // c
B01011110, // d
B01111001, // e
B01110001 // f
};
byte pressCount= 0;
bool lastButton2;
// Instantiate a Bounce object with a 5 millisecond debounce time
Bounce bouncer1 = Bounce(BUTTON1, 5);
void setup() {
pinMode(BUTTON1, INPUT);
pinMode(LED1, OUTPUT);
pinMode(BUTTON2, INPUT);
pinMode(LED2, OUTPUT);
pinMode(BUTTON3, INPUT);
pinMode(BUZZER, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
lastButton2 = digitalRead(BUTTON2);
displayDigit(255, true);
}
void loop() {
// Update debouncer
boolean button1Changed = bouncer1.update();
// Turn on or off the LED
if ( !bouncer1.read()) {
digitalWrite(LED1, HIGH);
} else {
digitalWrite(LED1, LOW);
}
int buttonValue2 = digitalRead(BUTTON2);
if (buttonValue2 == LOW) {
digitalWrite(LED2, HIGH);
} else {
digitalWrite(LED2, LOW);
}
if ( bouncer1.fallingEdge() || // rising edge of button 1
(lastButton2 && !buttonValue2)) { // rising edge of button 2
displayDigit(pressCount, false);
pressCount++;
if (pressCount > 15) { pressCount = 0; }
}
lastButton2 = digitalRead(BUTTON2);
}
void displayDigit(byte value, boolean dp) {
byte shiftData = 0;
if (value <= 15) { shiftData = ledCharSet[value]; }
if (dp) { shiftData |= B10000000; }
digitalWrite(LATCH,LOW);
shiftOut(DATA, CLOCK, MSBFIRST, ~shiftData);
digitalWrite(LATCH,HIGH);
}