#include <IRremote.h>
#define PIN_RECEIVER A0
#include <LiquidCrystal.h>
LiquidCrystal lcd(40, 41, 42, 43, 44, 45);
unsigned long int distanceDelay1;
const int trigPin1 = 24;
const int echoPin1 = 25;
const int trigPin2 = 26;
const int echoPin2 = 27;
const int trigPin3 = 28;
const int echoPin3 = 29;
const int trigPin4 = 30;
const int echoPin4 = 31;
long duration;
int distance;
int counter1 = 0;
int counter2 = 0;
int counter3 = 0;
int counter4 = 0;
boolean check1;
boolean check2;
boolean check3;
boolean check4;
boolean check5;
boolean check6;
boolean check7;
boolean check8;
boolean BCheckMillis1;
boolean BCheckMillis2;
boolean BCheckMillis3;
boolean BCheckMillis4;
unsigned long int yellowMillis1;
unsigned long int yellowMillis2;
unsigned long int yellowMillis3;
unsigned long int yellowMillis4;
unsigned long int checkMillis;
int Lane1[] = {13,12,11}; // Lane 1 Red, Yellow and Green
int Lane2[] = {10,9,8};// Lane 2 Red, Yellow and Green
int Lane3[] = {7,6,5};// Lane 3 Red, Yellow and Green
int Lane4[] = {4,3,2};// Lane 4 Red, Yellow and Green
boolean task48aEnable;
boolean task24aEnable;
boolean task122aEnable;
boolean task16aEnable;
boolean task168aEnable0;
boolean task168aEnable;
boolean task168aEnable1;
boolean task168aEnable2;
boolean task168aEnable3;
boolean task168aEnable4;
boolean task168aEnable5;
boolean task168aEnable6;
unsigned long int runTask48a;
unsigned long int runLane1Green;
unsigned long int runLane3Yellow;
unsigned long int runLane3Green;
unsigned long int runLane4Yellow;
unsigned long int runLane4Green;
unsigned long int runLane2Yellow;
unsigned long int runLane2Green;
IRrecv receiver(PIN_RECEIVER);
decode_results results;
void setup()
{
receiver.enableIRIn();
for (int i = 0; i < 3; i++)
{
pinMode(Lane1[i], OUTPUT);
pinMode(Lane2[i], OUTPUT);
pinMode(Lane3[i], OUTPUT);
pinMode(Lane4[i], OUTPUT);
}
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(trigPin3, OUTPUT);
pinMode(echoPin3, INPUT);
pinMode(trigPin4, OUTPUT);
pinMode(echoPin4, INPUT);
lcd.begin(16, 2);
lcd.print("Press Power Key");
lcd.setCursor(0, 1);
lcd.print("To Display Count");
Serial.begin(9600);
}
void lcdPrint()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("L1:");
lcd.print(counter1);
lcd.print(" ");
lcd.print("L2:");
lcd.print(counter2);
lcd.setCursor(0, 1);
lcd.print("L3:");
lcd.print(counter3);
lcd.print(" ");
lcd.print("L4:");
lcd.print(counter4);
}
void loop()
{
if (receiver.decode())
{
translateIR();
receiver.resume(); // Receive the next value
}
if(receiver.decodedIRData.command==162)//loop
{
//lane 1
if(millis() > distanceDelay1)
{
digitalWrite(trigPin1, LOW);
digitalWrite(trigPin1, HIGH);
digitalWrite(trigPin1, LOW);
duration = pulseIn(echoPin1, HIGH);
distance= duration*0.034/2;
Serial.print("Distance1: ");
Serial.println(distance);
if(millis() > distanceDelay1)
{
if (distance < 100 && distance > 10)
{
counter1 = counter1 + 1;
lcdPrint();
Serial.print("L1: ");
Serial.println(counter1);
}
}
}
//lane 2
if(millis() > distanceDelay1)
{
digitalWrite(trigPin2, LOW);
digitalWrite(trigPin2, HIGH);
digitalWrite(trigPin2, LOW);
duration = pulseIn(echoPin2, HIGH);
distance= duration*0.034/2;
Serial.print("Distance2: ");
Serial.println(distance);
if(millis() > distanceDelay1)
{
if (distance < 100 && distance > 10)
{
counter2 = counter2 + 1;
lcdPrint();
Serial.print("L2: ");
Serial.println(counter2);
}
}
}
//lane 3
if(millis() > distanceDelay1)
{
digitalWrite(trigPin3, LOW);
digitalWrite(trigPin3, HIGH);
digitalWrite(trigPin3, LOW);
duration = pulseIn(echoPin3, HIGH);
distance= duration*0.034/2;
Serial.print("Distance3: ");
Serial.println(distance);
if(millis() > distanceDelay1)
{
if (distance < 100 && distance > 10)
{
counter3 = counter3 + 1;
lcdPrint();
Serial.print("L3: ");
Serial.println(counter3);
}
}
}
//lane 4
if(millis() > distanceDelay1)
{
digitalWrite(trigPin4, LOW);
digitalWrite(trigPin4, HIGH);
digitalWrite(trigPin4, LOW);
duration = pulseIn(echoPin4, HIGH);
distance= duration*0.034/2;
Serial.print("Distance4: ");
Serial.println(distance);
if(millis() > distanceDelay1)
{
if (distance < 100 && distance > 10)
{
counter4 = counter4 + 1;
lcdPrint();
Serial.print("L4: ");
Serial.println(counter4);
}
}
}
//checking maximum count in all lanes
if(millis() > checkMillis)
{// checking for lane 1
if(BCheckMillis1 = true)
{
if(check1 == false and counter1 > counter2 and counter1 > counter3 and counter1 > counter4)
{
PowerOff();
Button1();
}
if(check2 = true and millis() > yellowMillis1 and counter1 > counter2 and counter1 > counter3 and counter1 > counter4)
{
counter1 = 0;
task48a();
}
}
}
if(millis() > checkMillis)
{// checking for lane 2
if(BCheckMillis2 = true)
{
if(check3 == false and counter2 > counter1 and counter2 > counter3 and counter2 > counter4)
{
PowerOff();
Button2();
}
if(check4 = true and millis() > yellowMillis2 and counter2 > counter1 and counter2 > counter3 and counter2 > counter4)
{
counter2 = 0;
task24a();
}
}
}
if(millis() > checkMillis)
{// checking for lane 3
if(BCheckMillis3 = true)
{
if(check5 == false and counter3 > counter1 and counter3 > counter2 and counter3 > counter4)
{
PowerOff();
Button3();
}
if(check6 = true and millis() > yellowMillis3 and counter3 > counter1 and counter3 > counter2 and counter3 > counter4)
{
counter3 = 0;
task122a();
}
}
}
if( millis() > checkMillis)
{//chekcing for lane 4
if(BCheckMillis4 = true)
{
if(check7 == false and counter4 > counter1 and counter4 > counter2 and counter4 > counter3)
{
PowerOff();
Button4();
}
if(check8 = true and millis() > yellowMillis4 and counter4 > counter1 and counter4 > counter2 and counter4 > counter3)
{
counter4 = 0;
task16a();
}
}
}
}//end of checking maximum count in all lane
if(receiver.decodedIRData.command==168)//loop
{
if(task168aEnable0 == true)
{
Button1();// loop for lane1 yellow
}
if(task168aEnable == true and millis() > runLane1Green)
{
task48a();// loop for lane1 green
}
if(task168aEnable1 == true and millis() > runLane3Yellow)
{
Button2();//loop for lane3 yellow
}
if(task168aEnable2 == true and millis() > runLane3Green)
{
task24a();//loop for lane3 green
}
if(task168aEnable3 == true and millis() > runLane4Yellow)
{
Button3();//loop for lane4 yellow
}
if(task168aEnable4 == true and millis() > runLane4Green)
{
task122a();//loop for lane3 green
}
if(task168aEnable5 == true and millis() > runLane2Yellow)
{
Button4();//loop for lane2 yellow
}
if(task168aEnable6 == true and millis() > runLane2Green)
{
task16a();//loop for lane2 green
}
}
if(task48aEnable == true and millis() > runTask48a)//button 1
{
if(receiver.decodedIRData.command==48)
{
task48a();
}
}
if( task24aEnable == true and millis() > runTask48a)//button 2
{
if(receiver.decodedIRData.command==24)
{
task24a();
}
}
if( task122aEnable == true and millis() > runTask48a)//button 3
{
if(receiver.decodedIRData.command==122)
{
task122a();
}
}
if( task16aEnable == true and millis() > runTask48a)//button 4
{
if(receiver.decodedIRData.command==16)
{
task16a();
}
}
}
void task48a(){
digitalWrite(Lane1[1], LOW);
digitalWrite(Lane1[2], HIGH); //lane 1-Green
task48aEnable = false; // do not run this task again until enabled
if(receiver.decodedIRData.command==162)
{
checkMillis = millis() + 7000;
BCheckMillis2 = false ;
BCheckMillis3 = false ;
BCheckMillis4 = false ;
check2 = false;
check1 = false;
}
if(receiver.decodedIRData.command==168)
{
task168aEnable = false;
task168aEnable1 = true;
}
}
void task24a(){
digitalWrite(Lane3[1], LOW);
digitalWrite(Lane3[2], HIGH); //lane 3-Green
task24aEnable = false; // do not run this task again until enabled
if(receiver.decodedIRData.command==162)
{
BCheckMillis1 = false ;
BCheckMillis3 = false ;
BCheckMillis4 = false ;
checkMillis = millis() + 7000;
check4 = false;
check3 = false;
}
if(receiver.decodedIRData.command==168)
{
task168aEnable2 = false;
task168aEnable3 = true;
}
}
void task122a(){
digitalWrite(Lane4[1], LOW);
digitalWrite(Lane4[2], HIGH); //lane 4-Green
task122aEnable = false; // do not run this task again until enabled
if(receiver.decodedIRData.command==162)
{
BCheckMillis1 = false ;
BCheckMillis2 = false ;
BCheckMillis4 = false ;
checkMillis = millis() + 7000;
check6 = false;
check5 = false;
}
if(receiver.decodedIRData.command==168)
{
task168aEnable4 = false;
task168aEnable5 = true;
}
}
void task16a(){
digitalWrite(Lane2[1], LOW);
digitalWrite(Lane2[2], HIGH); //lane 2-Green
task16aEnable = false; // do not run this task again until enabled
if(receiver.decodedIRData.command==162)
{
BCheckMillis1 = false ;
BCheckMillis2 = false ;
BCheckMillis3 = false ;
checkMillis = millis() + 7000;
check8 = false;
check7 = false;
}
if(receiver.decodedIRData.command==168)
{
task168aEnable6 = false;
task168aEnable0 = true;
runLane1Green = millis() + 3000;
runLane3Yellow = millis() + 13000;
runLane3Green = millis() + 16000;
runLane4Yellow = millis() + 23000;
runLane4Green = millis() + 26000;
runLane2Yellow = millis() + 36000;
runLane2Green = millis() + 39000;
}
}
void PowerOff()
{
digitalWrite(Lane1[0], LOW);
digitalWrite(Lane1[2], LOW);
digitalWrite(Lane1[1], LOW);
digitalWrite(Lane3[1], LOW);
digitalWrite(Lane3[2], LOW);
digitalWrite(Lane3[0], LOW);
digitalWrite(Lane4[1], LOW);
digitalWrite(Lane4[2], LOW);
digitalWrite(Lane4[0], LOW);
digitalWrite(Lane2[1], LOW);
digitalWrite(Lane2[2], LOW);
digitalWrite(Lane2[0], LOW);
}
void Button1()
{
digitalWrite(Lane1[0], LOW);
digitalWrite(Lane1[2], LOW);
digitalWrite(Lane1[1], HIGH); //lane 1-Yellow
digitalWrite(Lane3[1], LOW);
digitalWrite(Lane3[2], LOW);
digitalWrite(Lane3[0], HIGH); //lane 3-Red
digitalWrite(Lane4[1], LOW);
digitalWrite(Lane4[2], LOW);
digitalWrite(Lane4[0], HIGH); //lane 4-Red
digitalWrite(Lane2[1], LOW);
digitalWrite(Lane2[2], LOW);
digitalWrite(Lane2[0], HIGH); //lane 2-red
if(receiver.decodedIRData.command==162)
{
yellowMillis1 = millis() + 3000 ;
check1 = true ;
check2= true ;
}
if(receiver.decodedIRData.command==168)
{
task168aEnable0 = false;
task168aEnable = true;
}
}
void Button2()
{
digitalWrite(Lane4[1], LOW);
digitalWrite(Lane4[2], LOW);
digitalWrite(Lane4[0], HIGH); //lane 4-Red
digitalWrite(Lane2[1], LOW);
digitalWrite(Lane2[2], LOW);
digitalWrite(Lane2[0], HIGH); //lane 2-Red
digitalWrite(Lane1[2], LOW);
digitalWrite(Lane1[1], LOW);
digitalWrite(Lane1[0], HIGH); //lane 1-Red
digitalWrite(Lane3[0], LOW);
digitalWrite(Lane3[2], LOW);
digitalWrite(Lane3[1], HIGH); //lane 3-Yellow
if(receiver.decodedIRData.command==162)
{
yellowMillis2 = millis() + 3000 ;
check3 = true ;
check4= true ;
}
if(receiver.decodedIRData.command==168)
{
task168aEnable1 = false;
task168aEnable2 = true;
}
}
void Button3()
{
digitalWrite(Lane4[2], LOW);
digitalWrite(Lane4[0], LOW);
digitalWrite(Lane4[1], HIGH); //lane 4-Yellow
digitalWrite(Lane2[1], LOW);
digitalWrite(Lane2[2], LOW);
digitalWrite(Lane2[0], HIGH); //lane 2-Red
digitalWrite(Lane1[2], LOW);
digitalWrite(Lane1[1], LOW);
digitalWrite(Lane1[0], HIGH); //lane 1-Red
digitalWrite(Lane3[1], LOW);
digitalWrite(Lane3[2], LOW);
digitalWrite(Lane3[0], HIGH); //lane 3-Red
if(receiver.decodedIRData.command==162)
{
yellowMillis3 = millis() + 3000 ;
check5 = true ;
check6= true ;
}
if(receiver.decodedIRData.command==168)
{
task168aEnable3 = false;
task168aEnable4 = true;
}
}
void Button4()
{
digitalWrite(Lane4[2], LOW);
digitalWrite(Lane4[1], LOW);
digitalWrite(Lane4[0], HIGH); //lane 4-Red
digitalWrite(Lane2[0], LOW);
digitalWrite(Lane2[2], LOW);
digitalWrite(Lane2[1], HIGH); //lane 2-Yellow
digitalWrite(Lane1[2], LOW);
digitalWrite(Lane1[1], LOW);
digitalWrite(Lane1[0], HIGH); //lane 1-Red
digitalWrite(Lane3[1], LOW);
digitalWrite(Lane3[2], LOW);
digitalWrite(Lane3[0], HIGH); //lane 3-Red
if(receiver.decodedIRData.command==162)
{
yellowMillis4 = millis() + 3000 ;
check6 = true ;
check7= true ;
}
if(receiver.decodedIRData.command==168)
{
task168aEnable5 = false;
task168aEnable6 = true;
}
}
void translateIR()
{
// Takes command based on IR code received
switch (receiver.decodedIRData.command) {
case 48:
//Keypad button "1"
//Lane 1 - Green
Button1();
task48aEnable = true; // this is a global boolean variable.
runTask48a = millis() + 3000; // this is a global unsigned long int
break;
case 24:
//Keypad button "2"
//Lane 3 - Green
Button2();
task24aEnable = true;
runTask48a = millis() + 3000;
break;
case 122:
//Keypad button "3"
//Lane 4 - Green
Button3();
task122aEnable = true;
runTask48a = millis() + 3000;
break;
case 16:
//Keypad button "4"
//Lane 2 - green
Button4();
task16aEnable = true;
runTask48a = millis() + 3000;
break;
case 162:
//Power button
// All Lane goes OFF
PowerOff();
distanceDelay1 = millis() + 900;
checkMillis = millis() + 7000;
check1 = false;
check2 = false;
check3 = false;
check4 = false;
break;
case 168:
//play button
//loops continuesly
PowerOff();
task168aEnable0 = true;
runLane1Green = millis() + 3000;
runLane3Yellow = millis() + 13000;
runLane3Green = millis() + 16000;
runLane4Yellow = millis() + 23000;
runLane4Green = millis() + 26000;
runLane2Yellow = millis() + 36000;
runLane2Green = millis() + 39000;
break;
}
}