#define LED_Rabbit_RED 11
#define LED_Rabbit_YELLOW 12
#define LED_Rabbit_GREEN 13
#define LED_Tortoise_RED 8
#define LED_Tortoise_YELLOW 9
#define LED_Tortoise_GREEN 10
#define SW_MODE A0
#define SW_LIGHT_CONTROL A1
#define TIME_Setting A2
int readVal =0;
int pwmOut=0;
void hwInit(){
Serial.begin(115200);
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_Rabbit_RED, OUTPUT);
pinMode(LED_Rabbit_YELLOW, OUTPUT);
pinMode(LED_Rabbit_GREEN, OUTPUT);
pinMode(LED_Tortoise_RED, OUTPUT);
pinMode(LED_Tortoise_YELLOW, OUTPUT);
pinMode(LED_Tortoise_GREEN, OUTPUT);
digitalWrite(LED_Rabbit_RED, LOW);
digitalWrite(LED_Rabbit_YELLOW, LOW);
digitalWrite(LED_Rabbit_GREEN, LOW);
digitalWrite(LED_Tortoise_RED, LOW);
digitalWrite(LED_Tortoise_YELLOW, LOW);
digitalWrite(LED_Tortoise_GREEN, LOW);
}
const int GREEN_LIGHT = 12; // Green light time in seconds
const int AMBER_LIGHT = 3; // Amber light time in seconds
const int DEAD_LIGHT = 2; // Dead light time in seconds
const int RED_AMBER_LIGHT = 1; // Red/Amber light time in seconds
void usaTrafficLight()
{
// Remember to consult allaboutcircuits.com for the timing table! This will
// be really helpful in figuring out why the code exists below. Now this is
// only one way of making this whole cycle happen. When I code, I like to
// make everything as readable as possible. And if I do not need the extra
// computing speed, I will re-introduce statements for the sake of remembering
// what the last condition was. So if you think to yourself "hey, he turned
// on the red light, then off, and then on!", you are right! I just wanted
// to make things easier to read!
// First have Busy Bunny Lane have its green light on. And according to the
// chart, Lazy Tortoise Ave is Red. I will be using FOR LOOPs in one second
// increments since this will help maintain logical continuty from the timing
// table. Do not forget to turn the lights off after each cycle!
for (int seconds = 0; seconds < GREEN_LIGHT; seconds++)
{
digitalWrite(LED_Rabbit_GREEN,HIGH);
digitalWrite(LED_Tortoise_RED,HIGH);
delay(1000);
}
digitalWrite(LED_Rabbit_GREEN,LOW);
digitalWrite(LED_Tortoise_RED,LOW);
// Now that the green light time has elapsed for Busy Bunny Lane, we can
// move onto our amber light time.
for (int seconds = 0; seconds < AMBER_LIGHT; seconds++)
{
digitalWrite(LED_Tortoise_RED,HIGH);
for(int i=0;i<5;i++){
digitalWrite(LED_Rabbit_YELLOW, !digitalRead(LED_Rabbit_YELLOW));
delay(200);
}
}
digitalWrite(LED_Rabbit_YELLOW,LOW);
digitalWrite(LED_Tortoise_RED,LOW);
// Dead zone up ahead to prevent our traffic accidents.
for (int seconds = 0; seconds < DEAD_LIGHT; seconds++)
{
digitalWrite(LED_Rabbit_RED,HIGH);
digitalWrite(LED_Tortoise_RED,HIGH);
delay(1000);
}
digitalWrite(LED_Rabbit_RED,LOW);
digitalWrite(LED_Tortoise_RED,LOW);
// Finally Lazy Tortoise Ave gets its turn for green!
for (int seconds = 0; seconds < (GREEN_LIGHT / 3); seconds++)
{
digitalWrite(LED_Rabbit_RED,HIGH);
digitalWrite(LED_Tortoise_GREEN,HIGH);
delay(1000);
}
digitalWrite(LED_Rabbit_RED,LOW);
digitalWrite(LED_Tortoise_GREEN,LOW);
// Lazy Tortoise Ave now goes into amber light.
for (int seconds = 0; seconds < AMBER_LIGHT; seconds++)
{
digitalWrite(LED_Rabbit_RED,HIGH);
for(int i=0;i<5;i++){
digitalWrite(LED_Tortoise_YELLOW, !digitalRead(LED_Tortoise_YELLOW));
delay(200);
}
}
digitalWrite(LED_Rabbit_RED,LOW);
digitalWrite(LED_Tortoise_YELLOW,LOW);
// Once again, a dead zone
for (int seconds = 0; seconds < DEAD_LIGHT; seconds++)
{
digitalWrite(LED_Rabbit_RED,HIGH);
digitalWrite(LED_Tortoise_RED,HIGH);
delay(1000);
}
digitalWrite(LED_Rabbit_RED,LOW);
digitalWrite(LED_Tortoise_RED,LOW);
// Cycle is over!
}
void setup() {
hwInit();
}
// the loop function runs over and over again forever
void loop() {
usaTrafficLight();
}