Представляю вашему вниманию проект светофоров на плате Arduino. В нем мы управляем 3-мя светодиодами - зеленым, желтым и красным.
Данная системы состоит из 2-х световоров. Когда один светофор разрешает движение другой запрещает.
Когда движение запрещено - горит красный цвет, то в этот момент времени начинает моргать индикатор ожидания - маленький красный светодиод.
Проект в целях демонстрации собран на монтажной плате. Питание осуществляется через саму плату.
Каждый светодиод подключен через сопротивление в 470 Ом. Выдержка времени осуществленна через заданные временные интервалы в массиве duration.
Подключение светофоров осуществляеться к следующим выводам:
Код не такой уж и сложный, ели немного посмотреть и подумать то можно понять как он работает.
// 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);
}
}
Комментарии
long previousCars = 0;
long previousPeds = 0;