122 lines
3.3 KiB
Plaintext
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);
|
|
}
|