Представляю вашему вниманию проект светофоров на плате 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;