#define PIN_RED_CAR 4
#define PIN_YELLOW_CAR 3
#define PIN_GREEN_CAR 2
#define PIN_GREEN_PED 5
#define PIN_RED_PED 6
#define PIN_BTN 13
#define TIME_GREEN_PED 1000
#define TIME_YELLOW_CAR 3000
#define BLINK_TIME 300
#define BLINKS 10
#define BAND 9600
typedef struct LIGHT_STATE { //Struct pentru definirea starii semaforului
bool redCar, yellowCar, greenCar, redPed, greenPed;
} light_state;
//Declararea starilor semaforului
light_state normalState, initialPressState, walkState, blinkOnState, blinkOffState;
unsigned long startTime=0, currentTime=0;
int i;
bool pressed;
void setup() {
Serial.begin(BAND);
//Setup pini
pinMode(PIN_RED_CAR, OUTPUT);
pinMode(PIN_YELLOW_CAR, OUTPUT);
pinMode(PIN_GREEN_CAR, OUTPUT);
pinMode(PIN_RED_PED, OUTPUT);
pinMode(PIN_GREEN_PED, OUTPUT);
pinMode(PIN_BTN, INPUT_PULLUP);
//Setup stari semafor
normalState={false, false, true, true, false};
initialPressState={false, true, false, true, false};
walkState={true, false, false, false, true};
blinkOnState={true, false, false, false, true};
blinkOffState={true, false, false, false, false};
pressed=false;
//Initializare stare
updateLights(&normalState);
}
void loop() {
if (digitalRead(PIN_BTN) == LOW && !pressed) { //Daca pietonul apasa pe buton
pressed=true;
startTime=millis();
i=1;
}
if(pressed) {
currentTime=millis();
if(currentTime>=startTime+BLINK_TIME*BLINKS + TIME_GREEN_PED + TIME_YELLOW_CAR) {
pressed=false;
updateLights(&normalState); //revenire la starea initiala
Serial.println("Normal state. A trecut: ");
Serial.println(millis());
} else if (currentTime>=startTime + TIME_GREEN_PED + TIME_YELLOW_CAR) {
Serial.println("Blink state. A trecut: ");
Serial.println(millis());
//intermitent pentru pietoni
while((millis() < startTime + TIME_GREEN_PED + TIME_YELLOW_CAR + BLINKS*BLINK_TIME)){
(i%BLINKS <= BLINKS/2) ? updateLights(&blinkOffState):updateLights(&blinkOnState);
Serial.println("Intraram in blink");
Serial.println(" ");
Serial.println(" ");
Serial.println(i);
i++;
}
} else if (currentTime>=startTime + TIME_YELLOW_CAR) {
updateLights(&walkState);
Serial.println("Walk state. A trecut: ");
Serial.println(millis());
} else {
updateLights(&initialPressState); //Galben pentru masini
Serial.println("Initial press state. A trecut: ");
Serial.println(millis());
}
}
}
void updateLights(light_state* state) { //functie pentru aprinderea LED-urilor dupa stari
digitalWrite(PIN_RED_CAR, (state->redCar) ? HIGH:LOW);
digitalWrite(PIN_GREEN_CAR, (state->greenCar) ? HIGH:LOW);
digitalWrite(PIN_YELLOW_CAR, (state->yellowCar) ? HIGH:LOW);
digitalWrite(PIN_RED_PED, (state->redPed) ? HIGH:LOW);
digitalWrite(PIN_GREEN_PED, (state->greenPed) ? HIGH:LOW);
}
/* Tema Proiect: 15 Semafor pentru pietoni
Echipa: Ploae Darius-Adonis-Ionuț, Barbu David Constantin, Teică David Ștefan
*/