#include <LiquidCrystal.h>
// define constants for pins and timings
const int redPin = 40; //PIN FOR RED LED
const int yellowPin = 39; //PIN FOR YELLOW LED
const int greenPin = 38; //PIN FOR GREEN LED
const int buzzerPin = 37; //PIN FOR BUZZER
const int bluePin = 41; //PIN FOR BLUE PIN
const unsigned long redDuration = 3000; // 3 SECOND TIME FRAME NEEDED
const unsigned long yellowDuration = 2000; // 2 SECOND TIME FRAME NEEDED
const unsigned long greenDuration = 7000;// 7 SECOND TIME FRAME NEEDED
// create LiquidCrystal object for LCD display
LiquidCrystal lcd(3, 2, 4, 5, 6, 7);
unsigned long timeStart;
unsigned long timeElapsed;
// define variables for state and button
int state = 1;
int lastState = 0;
void setup() {
Serial.begin(115200, SERIAL_8N1);
// initialize pins
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(bluePin, OUTPUT);
// initialize LCD display
lcd.begin(16, 2);
lcd.print("Traffic Light");
timeStart = millis();
state = 1; //SET INITIAL STATE TO 1
}
void loop() {
switch (state) {
case 1: //INITIAL RED LIGHT ON MODE
if (lastState != state) {
lastState = state;
lcd.setCursor(0, 1); //LCD PRINT STATE
lcd.print("State: ");
lcd.print("1 ");
Serial.println("THE STATE IS 1"); //SERIAL PRINT STATE
digitalWrite(redPin, HIGH);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
}
timeElapsed = millis() - timeStart;
if (timeElapsed > redDuration) { //CHECKING TIME FOR NEXT STATE
timeStart = millis();
if (CheckSerial()) //IF KEY IS PRESSED GO STATE IS 9
{
state = 9;
}
else { //THERE IS NOTHING ON SERAIL IS PRESSED STATE IS 2
state = 2;
}
}
break;
case 2:
if (lastState != state) {
lastState = state;
lcd.setCursor(0, 1);//LCD PRINT STATE
lcd.print("State: ");
lcd.print("2 ");
Serial.println("THE STATE IS 2");//SERIAL PRINT STATE
digitalWrite(redPin, LOW);//GREEN LED ON ONLY
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, HIGH);
}
timeElapsed = millis() - timeStart;
if (CheckSerial()) { //CHECK FOR KEY PRESS ON SERIAL
if (timeElapsed > yellowDuration) { //IF KEY IS PRESSED AND TIME IS MORE THAN 2 SECONDS STATE CHANGE TO 7
timeStart = millis();
state = 7;
}
}
else { //THERE IS NOTHING ON SERAIL IS PRESSED STATE IS 3
if (timeElapsed > greenDuration) { //IF NO KEY PRESS AND TIME IS MORE THAN 7 SECONDS STATE IS 3
timeStart = millis();
state = 3;
}
}
break;
case 3:
if (lastState != state) {
lastState = state;
lcd.setCursor(0, 1);//LCD PRINT STATE
lcd.print("State: ");
lcd.print("3 ");
Serial.println("THE STATE IS 3");//SERIAL PRINT STATE
digitalWrite(redPin, LOW); //YELLOW LED ON ONLY
digitalWrite(yellowPin, HIGH);
digitalWrite(greenPin, LOW);
}
timeElapsed = millis() - timeStart;
if (timeElapsed > yellowDuration) { //IF TIME IS MORE THAN 2 SECONDS PROCESSED
timeStart = millis();
if (CheckSerial()) { //IF KEY PRESSED STATE IS 9
state = 9;
}
else { //IF THE NOTHING ON SERAIL IS PRESSED STATE IS 4
state = 4;
}
}
break;
case 4:
if (lastState != state) {
lastState = state;
lcd.setCursor(0, 1);//LCD PRINT STATE
lcd.print("State: ");
lcd.print("4 ");
Serial.println("THE STATE IS 4");//SERIAL PRINT STATE
digitalWrite(redPin, HIGH);//RED LED ON ONLY
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
}
timeElapsed = millis() - timeStart;
if (timeElapsed > redDuration) { //CHECK IF TIME IS MORE THAN 3 SECONDS
timeStart = millis();
if (CheckSerial()) { //IF KEY PRESSED STATE IS 9
state = 9;
}
else //IF THE NOTHING ON SERAIL IS PRESSED STATE IS 5
state = 5;
}
break;
case 5:
if (lastState != state) {
lastState = state;
lcd.setCursor(0, 1);//LCD PRINT STATE
lcd.print("State: ");
lcd.print("5 ");
Serial.println("THE STATE IS 5");//SERIAL PRINT STATE
digitalWrite(redPin, HIGH);//RED LED ON ONLY
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
}
timeElapsed = millis() - timeStart;
if (!CheckSerial()) { //IF THE NOTHING ON SERAIL IS PRESSED WAIT 7 SECONDS AND STATE IS 6
if (timeElapsed > greenDuration) {
timeStart = millis();
state = 6;
}
}
else {
if (timeElapsed > yellowDuration) {//THERE IS SOMETHING ON SERAIL IS PRESSED WAIT 2 SECONDS AND STATE IS 8
timeStart = millis();
state = 8;
}
}
break;
case 6:
if (lastState != state) {
lastState = state;
lcd.setCursor(0, 1);//LCD PRINT STATE
lcd.print("State: ");
lcd.print("6 ");
Serial.println("THE STATE IS 6");//SERIAL PRINT STATE
digitalWrite(redPin, HIGH);//RED LED ON ONLY
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
}
timeElapsed = millis() - timeStart;
if (timeElapsed > yellowDuration) { //WAIT 2 SECONDS
timeStart = millis();
if (!CheckSerial()) { //IF THE NOTHING ON SERAIL IS PRESSED STATE IS 1
state = 1;
}
else { //THERE IS SOMETHING ON SERIAL IS PRESSED STATE IS 9
state = 9;
}
}
break;
case 7:
if (lastState != state) {
lastState = state;
lcd.setCursor(0, 1);//LCD PRINT STATE
lcd.print("State: ");
lcd.print("7 ");
Serial.println("THE STATE IS 7");//SERIAL PRINT STATE
digitalWrite(redPin, LOW);//YELLOW LED ON ONLY
digitalWrite(yellowPin, HIGH);
digitalWrite(greenPin, LOW);
}
timeElapsed = millis() - timeStart;
if (timeElapsed > yellowDuration) { //WAIT 2 SECONDS
timeStart = millis();
state = 9;
} //STATE CHANGE TO 9
break;
case 8:
if (lastState != state) {
lastState = state;
lcd.setCursor(0, 1);//LCD PRINT STATE
lcd.print("State: ");
lcd.print("8 ");
Serial.println("THE STATE IS 8");//SERIAL PRINT STATE
digitalWrite(redPin, HIGH);//RED LED ON ONLY
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
}
timeElapsed = millis() - timeStart;
if (timeElapsed > yellowDuration) { //WAIT 2 SECONDS
timeStart = millis();
state = 9;
} //STATE CHANGE TO 9
break;
case 9:
if (lastState != state) {
lastState = state;
lcd.setCursor(0, 1);//LCD PRINT STATE
lcd.print("State: ");
lcd.print("9 ");
Serial.println("THE STATE IS 9");//SERIAL PRINT STATE
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, HIGH); //TURN ONLY ON BLUE LED
}
timeElapsed = millis() - timeStart;
if (timeElapsed > greenDuration) { //STAY FOR 7 SECONDS
timeStart = millis();
state = 1; //STATE CHANGE TO 1
digitalWrite(bluePin, LOW);
}// TURN BLUE LED OFF
break;
}
}
bool CheckSerial()
{
bool GotSome = false;
if (Serial.available())
{
GotSome = true;
while (Serial.available()) Serial.read();
}
return GotSome;
}