1
1
#define PIN_RED 2
2
2
#define PIN_YELLOW 3
3
3
#define PIN_GREEN 4
4
+ #define PIN_MODE_MANUAL 11
4
5
#define PIN_MODE_YELLOW 12
5
6
6
7
#define COLOR_RED 0
11
12
#define DELAY_YELLOW 1500
12
13
#define DELAY_GREEN 5000
13
14
#define DELAY_BLINK 250
14
- #define DELAY_BUTTON_PRESS 250
15
+ #define DELAY_BUTTON_PRESS 500
15
16
16
17
#define MODE_AUTO 0
17
18
#define MODE_YELLOW 1
19
+ #define MODE_MANUAL 2
18
20
19
- unsigned long lastColorSwitchTime = millis();
20
- unsigned long lastModeSwitchTime = millis();
21
+ unsigned long lastColorChangeTime = millis();
22
+ unsigned long lastButtonPressTime = millis();
21
23
22
24
unsigned int mode = MODE_AUTO;
23
25
unsigned int color = COLOR_RED;
@@ -29,6 +31,7 @@ void setup() {
29
31
pinMode (PIN_YELLOW, OUTPUT);
30
32
pinMode (PIN_GREEN, OUTPUT);
31
33
pinMode (PIN_MODE_YELLOW, INPUT_PULLUP);
34
+ pinMode (PIN_MODE_MANUAL, INPUT_PULLUP);
32
35
}
33
36
34
37
void setRedLight (bool on) {
@@ -91,8 +94,12 @@ bool yellowButtonPressed() {
91
94
return digitalRead (PIN_MODE_YELLOW) == LOW;
92
95
}
93
96
97
+ bool blueButtonPressed () {
98
+ return digitalRead (PIN_MODE_MANUAL) == LOW;
99
+ }
100
+
94
101
void loop () {
95
- if (millis () - lastModeSwitchTime > DELAY_BUTTON_PRESS) {
102
+ if (millis () - lastButtonPressTime > DELAY_BUTTON_PRESS) {
96
103
if (yellowButtonPressed ()) {
97
104
if (mode != MODE_YELLOW) {
98
105
mode = MODE_YELLOW;
@@ -102,24 +109,39 @@ void loop() {
102
109
color = COLOR_RED;
103
110
}
104
111
on = true ;
105
- lastColorSwitchTime = millis ();
106
- lastModeSwitchTime = millis ();
112
+ lastColorChangeTime = millis ();
113
+ lastButtonPressTime = millis ();
114
+ }
115
+ if (blueButtonPressed ()) {
116
+ if (mode != MODE_MANUAL) {
117
+ mode = MODE_MANUAL;
118
+ color = COLOR_RED;
119
+ } else {
120
+ if (color == COLOR_RED) {
121
+ color = COLOR_GREEN;
122
+ } else {
123
+ color = COLOR_RED;
124
+ }
125
+ }
126
+ on = true ;
127
+ lastColorChangeTime = millis ();
128
+ lastButtonPressTime = millis ();
107
129
}
108
130
}
109
131
110
132
switch (mode) {
111
133
case MODE_AUTO:
112
134
switch (color) {
113
135
case COLOR_RED:
114
- if (millis () - lastColorSwitchTime > DELAY_RED) {
115
- lastColorSwitchTime = millis ();
136
+ if (millis () - lastColorChangeTime > DELAY_RED) {
137
+ lastColorChangeTime = millis ();
116
138
color = COLOR_YELLOW;
117
139
prevColor = COLOR_RED;
118
140
}
119
141
break ;
120
142
case COLOR_YELLOW:
121
- if (millis () - lastColorSwitchTime > DELAY_YELLOW) {
122
- lastColorSwitchTime = millis ();
143
+ if (millis () - lastColorChangeTime > DELAY_YELLOW) {
144
+ lastColorChangeTime = millis ();
123
145
if (prevColor == COLOR_GREEN) {
124
146
color = COLOR_RED;
125
147
} else {
@@ -129,8 +151,8 @@ void loop() {
129
151
}
130
152
break ;
131
153
case COLOR_GREEN:
132
- if (millis () - lastColorSwitchTime > DELAY_GREEN) {
133
- lastColorSwitchTime = millis ();
154
+ if (millis () - lastColorChangeTime > DELAY_GREEN) {
155
+ lastColorChangeTime = millis ();
134
156
color = COLOR_YELLOW;
135
157
prevColor = COLOR_GREEN;
136
158
}
@@ -141,15 +163,17 @@ void loop() {
141
163
}
142
164
break ;
143
165
case MODE_YELLOW:
144
- if (millis () - lastColorSwitchTime > DELAY_BLINK) {
145
- lastColorSwitchTime = millis ();
166
+ if (millis () - lastColorChangeTime > DELAY_BLINK) {
167
+ lastColorChangeTime = millis ();
146
168
if (on) {
147
169
on = false ;
148
170
} else {
149
171
on = true ;
150
172
}
151
173
}
152
174
break ;
175
+ case MODE_MANUAL:
176
+ break ;
153
177
}
154
178
155
179
setLight (color, on);
0 commit comments