This circuit was tested and worked properly!
Check out this video below to see how the traffic lights system is working.
The code is written based on 4 situations:
- the first traffic light (TF1) has the red signal and the pedestrians ON; the second one (TF2) has green ON.
- TF1 has red and yellow ON; TF2 has yellow ON
- TF1 is green now and TF2 is red and pedestrians ON
- TF1 is yellow and TF2 is red and yellow
Code of the Arduino Traffic Lights Sketch
// Source: http://www.electroschematics.com/10178/arduino-traffic-light-system/ int trafficLights1[] = {2,3,4,5}; // red, yellow, green, pedestrians led pins int trafficLights2[] = {6,7,8,9}; // red, yellow, green, pedestrians led pins int situations = 4; int duration[] = {8000,3000,10000,3000}; // duration of each situation long previousCars = 0; long previousPeds = 0; long interval = 300; //blink interval for pedestrians int ledState = LOW; int state; int i = 0; void setup() { for(int i = 0; i < 4; i++) { pinMode(trafficLights1[i], OUTPUT); pinMode(trafficLights2[i], OUTPUT); } Serial.begin(9600); } void loop() { unsigned long currentMillis = millis(); if(currentMillis - previousCars < duration[i]) { situation(i); } else { previousCars = currentMillis; if(i >= situations) { i = 0; } else { i++; } } } void activateTrafficLight1(String lights, int pedestrians) { for(int x = 0; x < 3; x++) { if(lights[x] == '0') state = LOW; if(lights[x] == '1') state = HIGH; digitalWrite(trafficLights1[x], state); } if(pedestrians == 1) { blinkPed(trafficLights1[3]); } else { digitalWrite(trafficLights1[3], LOW); } } void activateTrafficLight2(String lights, int pedestrians) { for(int x = 0; x < 3; x++) { if(lights[x] == '0') state = LOW; if(lights[x] == '1') state = HIGH; digitalWrite(trafficLights2[x], state); } if(pedestrians == 1) { blinkPed(trafficLights2[3]); } else { digitalWrite(trafficLights2[3], LOW); } } void situation(int i) { switch(i){ case 0: activateTrafficLight1("100",1); // 100 means red ON, yellow OFF, green OFF activateTrafficLight2("001",0); // the second parameter is for pedestrians break; // 1 is ON and 0 is OFF case 1: activateTrafficLight1("110",0); // 110: red ON, yellow ON, green OFF activateTrafficLight2("010",0); break; case 2: activateTrafficLight1("001",0); activateTrafficLight2("100",1); break; case 3: activateTrafficLight1("010",0); activateTrafficLight2("110",0); break; } } void blinkPed(int ped) { unsigned long currentMillis = millis(); if(currentMillis - previousPeds > interval) { previousPeds = currentMillis; if (ledState == LOW) ledState = HIGH; else ledState = LOW; digitalWrite(ped, ledState); } }
No comments:
Post a Comment
its cool