forked from annwuhoo/ieee-cumake-arduino-workshop
/
LEDDie_ButtonInput.ino
157 lines (130 loc) · 4.32 KB
/
LEDDie_ButtonInput.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
155
156
/* IEEE Arduino Workshop - LED Die (April 2017)
*
* Generates a random number upon a button press and displays onto the seven segment display.
* Also utilizes button debouncing as described in: https://www.arduino.cc/en/Tutorial/Debounce
*
*/
#define TOP_BAR 13
#define TOPRIGHT_BAR 12
#define TOPLEFT_BAR 11
#define MIDDLE_BAR 10
#define BOTRIGHT_BAR 9
#define BOTLEFT_BAR 8
#define BOT_BAR 7
#define BUTTON 2
boolean buttonState = LOW;
boolean lastButtonState = LOW;
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers
int randNum = 0;
void setup() {
// put your setup code here, to run once:
pinMode(TOP_BAR, OUTPUT);
pinMode(TOPRIGHT_BAR, OUTPUT);
pinMode(TOPLEFT_BAR, OUTPUT);
pinMode(MIDDLE_BAR, OUTPUT);
pinMode(BOTRIGHT_BAR, OUTPUT);
pinMode(BOTLEFT_BAR, OUTPUT);
pinMode(BOT_BAR, OUTPUT);
pinMode(BUTTON, INPUT);
randomSeed(analogRead(0));
Serial.begin(9600); //initializes serial monitor
Serial.println("Initialized LED Die. Press the push button to roll the die!");
}
void loop() {
int reading = digitalRead(BUTTON);
// check to see if you just pressed the button
// (i.e. the input went from LOW to HIGH), and you've waited
// long enough since the last press to ignore any noise:
// If the switch changed, due to noise or pressing
if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
// if the button state has changed:
if (reading != buttonState) {
buttonState = reading;
// only generate new random number if buttonState is high
if (buttonState == HIGH) {
randNum = random(1, 7); // minimum is inclusive, maximum is exclusive
Serial.println("Die rolled:");
Serial.println(randNum);
}
}
}
// Mirror Die Number onto LEDs
displayLEDNumber(randNum);
// Save the reading as lastButtonState
lastButtonState = reading;
}
// Display the number onto seven segment display
void displayLEDNumber(int num) {
switch (num) {
case 1:
digitalWrite(TOP_BAR, LOW);
digitalWrite(TOPRIGHT_BAR, HIGH);
digitalWrite(TOPLEFT_BAR, LOW);
digitalWrite(MIDDLE_BAR, LOW);
digitalWrite(BOTRIGHT_BAR, HIGH);
digitalWrite(BOTLEFT_BAR, LOW);
digitalWrite(BOT_BAR, LOW);
break;
case 2:
digitalWrite(TOP_BAR, HIGH);
digitalWrite(TOPRIGHT_BAR, HIGH);
digitalWrite(TOPLEFT_BAR, LOW);
digitalWrite(MIDDLE_BAR, HIGH);
digitalWrite(BOTRIGHT_BAR, LOW);
digitalWrite(BOTLEFT_BAR, HIGH);
digitalWrite(BOT_BAR, HIGH);
break;
case 3:
digitalWrite(TOP_BAR, HIGH);
digitalWrite(TOPRIGHT_BAR, HIGH);
digitalWrite(TOPLEFT_BAR, LOW);
digitalWrite(MIDDLE_BAR, HIGH);
digitalWrite(BOTRIGHT_BAR, HIGH);
digitalWrite(BOTLEFT_BAR, LOW);
digitalWrite(BOT_BAR, HIGH);
break;
case 4:
digitalWrite(TOP_BAR, LOW);
digitalWrite(TOPRIGHT_BAR, HIGH);
digitalWrite(TOPLEFT_BAR, HIGH);
digitalWrite(MIDDLE_BAR, HIGH);
digitalWrite(BOTRIGHT_BAR, HIGH);
digitalWrite(BOTLEFT_BAR, LOW);
digitalWrite(BOT_BAR, LOW);
break;
case 5:
digitalWrite(TOP_BAR, HIGH);
digitalWrite(TOPRIGHT_BAR, LOW);
digitalWrite(TOPLEFT_BAR, HIGH);
digitalWrite(MIDDLE_BAR, HIGH);
digitalWrite(BOTRIGHT_BAR, HIGH);
digitalWrite(BOTLEFT_BAR, LOW);
digitalWrite(BOT_BAR, HIGH);
break;
case 6:
digitalWrite(TOP_BAR, HIGH);
digitalWrite(TOPRIGHT_BAR, LOW);
digitalWrite(TOPLEFT_BAR, HIGH);
digitalWrite(MIDDLE_BAR, HIGH);
digitalWrite(BOTRIGHT_BAR, HIGH);
digitalWrite(BOTLEFT_BAR, HIGH);
digitalWrite(BOT_BAR, HIGH);
break;
default: // clear LEDs
digitalWrite(TOP_BAR, LOW);
digitalWrite(TOPRIGHT_BAR, LOW);
digitalWrite(TOPLEFT_BAR, LOW);
digitalWrite(MIDDLE_BAR, LOW);
digitalWrite(BOTRIGHT_BAR, LOW);
digitalWrite(BOTLEFT_BAR, LOW);
digitalWrite(BOT_BAR, LOW);
break;
}
}