/*Programa que organiza os 4 semaforos de 2 ruas paralelas
*/
int i;
#define NORTE 0
#define LESTE 1
#define SUL 2
#define OESTE 3
//Declaracao dos semaforos
const int svermelho[4] = {27, 33, 39, 45};
const int samarelo[4] = {25, 31, 37, 43};
const int sverde[4] = {23, 29, 35, 41};
const int pvermelho[4] = {63, 65, 67, 69};
const int pverde[4] = {62, 64, 66, 68};
void pedestre();
void norte();
const byte botao[4] = {3,2,20,21};
volatile byte stateN = HIGH;
volatile byte stateL = HIGH;
volatile byte stateS = HIGH;
volatile byte stateO = HIGH;
//const int botao[4] = {3, 2, 20, 21};
int state = !digitalRead(botao[0, 1, 2, 3]);
int tecla = 0;
void setup()
{
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(botao[0]), blink, RISING);
attachInterrupt(digitalPinToInterrupt(botao[1]), blink, RISING);
attachInterrupt(digitalPinToInterrupt(botao[2]), blink, RISING);
attachInterrupt(digitalPinToInterrupt(botao[3]), blink, RISING);
//Declaracao de Pinos
for (i = 0; i < 4; i++) {
pinMode(svermelho[i], OUTPUT);
pinMode(sverde[i], OUTPUT);
pinMode(samarelo[i], OUTPUT);
pinMode(pvermelho[i], OUTPUT);
pinMode(pverde[i], OUTPUT);
pinMode(botao[i], INPUT_PULLUP);
}
//Semaforo Norte
norte();
}
void loop()
{
// Identifica qual a tecla pressionada
if (Serial.available() > 0) {
tecla = Serial.read();
}
//Inicializa todos os semaforos
digitalWrite(pvermelho[NORTE], HIGH);
digitalWrite(pvermelho[LESTE], HIGH);
digitalWrite(pvermelho[SUL], HIGH);
digitalWrite(pvermelho[OESTE], HIGH);
while (state == !(digitalRead(botao[0]))) {
pedestre();
norte();
}
while (state == !(digitalRead(botao[1]))) {
pedestre();
norte();
}
while (state == !(digitalRead(botao[2]))) {
pedestre();
norte();
}
while (state == !(digitalRead(botao[3]))) {
pedestre();
norte();
}
//Ve qual a tecla pressionada
if (tecla == 'n') {
//Liga os verdes verdes
digitalWrite(sverde[NORTE], LOW);
digitalWrite(sverde[LESTE], LOW);
digitalWrite(sverde[SUL], LOW);
digitalWrite(sverde[OESTE], LOW);
//Muda os semaforos para amarelo
if (digitalRead(pvermelho[LESTE]) == HIGH && digitalRead(svermelho[LESTE]) == LOW) {
digitalWrite(samarelo[LESTE], HIGH);
delay(3000);
digitalWrite(samarelo[LESTE], LOW);
}
if (digitalRead(pvermelho[SUL]) == HIGH && digitalRead(svermelho[SUL]) == LOW) {
digitalWrite(samarelo[SUL], HIGH);
delay(3000);
digitalWrite(samarelo[SUL], LOW);
}
if (digitalRead(pvermelho[OESTE]) == HIGH && digitalRead(svermelho[OESTE]) == LOW) {
digitalWrite(samarelo[OESTE], HIGH);
delay(3000);
digitalWrite(samarelo[OESTE], LOW);
}
norte();
}
if (tecla == 'l') {
//Desliga os leds verdes
digitalWrite(sverde[NORTE], LOW);
digitalWrite(sverde[LESTE], LOW);
digitalWrite(sverde[SUL], LOW);
digitalWrite(sverde[OESTE], LOW);
//Transicao dos amarelos
if (digitalRead(pvermelho[NORTE]) == HIGH && digitalRead(svermelho[NORTE]) == LOW) {
digitalWrite(samarelo[NORTE], HIGH);
delay(3000);
digitalWrite(samarelo[NORTE], LOW);
}
if (digitalRead(pvermelho[SUL]) == HIGH && digitalRead(svermelho[SUL]) == LOW) {
digitalWrite(samarelo[SUL], HIGH);
delay(3000);
digitalWrite(samarelo[SUL], LOW);
}
if (digitalRead(pvermelho[OESTE]) == HIGH && digitalRead(svermelho[OESTE]) == LOW) {
digitalWrite(samarelo[OESTE], HIGH);
delay(3000);
digitalWrite(samarelo[OESTE], LOW);
}
leste();
}
if (tecla == 's') {
//Desliga os leds verdes
digitalWrite(sverde[NORTE], LOW);
digitalWrite(sverde[LESTE], LOW);
digitalWrite(sverde[SUL], LOW);
digitalWrite(sverde[OESTE], LOW);
//Liga os amarelos
if (digitalRead(pvermelho[NORTE]) == HIGH && digitalRead(svermelho[NORTE]) == LOW) {
digitalWrite(samarelo[NORTE], HIGH);
delay(1500);
digitalWrite(samarelo[NORTE], LOW);
}
if (digitalRead(pvermelho[LESTE]) == HIGH && digitalRead(svermelho[LESTE]) == LOW) {
digitalWrite(samarelo[LESTE], HIGH);
delay(1500);
digitalWrite(samarelo[LESTE], LOW);
}
if (digitalRead(pvermelho[OESTE]) == HIGH && digitalRead(svermelho[OESTE]) == LOW) {
digitalWrite(samarelo[OESTE], HIGH);
delay(1500);
digitalWrite(samarelo[OESTE], LOW);
}
sul();
}
if (tecla == 'o') {
//Desliga os verdes
digitalWrite(sverde[NORTE], LOW);
digitalWrite(sverde[LESTE], LOW);
digitalWrite(sverde[SUL], LOW);
digitalWrite(sverde[OESTE], LOW);
//Liga os amarelos
if (digitalRead(pvermelho[NORTE]) == HIGH && digitalRead(svermelho[NORTE]) == LOW) {
digitalWrite(samarelo[NORTE], HIGH);
delay(3000);
digitalWrite(samarelo[NORTE], LOW);
}
if (digitalRead(pvermelho[LESTE]) == HIGH && digitalRead(svermelho[LESTE]) == LOW) {
digitalWrite(samarelo[LESTE], HIGH);
delay(3000);
digitalWrite(samarelo[LESTE], LOW);
}
if (digitalRead(pvermelho[SUL]) == HIGH && digitalRead(svermelho[SUL]) == LOW) {
digitalWrite(samarelo[SUL], HIGH);
delay(3000);
digitalWrite(samarelo[SUL], LOW);
}
oeste();
};
Serial.print(" ");
}
void norte()
{
digitalWrite(sverde[LESTE], LOW);
digitalWrite(sverde[SUL], LOW);
digitalWrite(sverde[OESTE], LOW);
digitalWrite(svermelho[LESTE], HIGH);
digitalWrite(svermelho[SUL], HIGH);
digitalWrite(svermelho[OESTE], HIGH);
digitalWrite(pverde[NORTE], LOW);
digitalWrite(pvermelho[NORTE], HIGH);
delay(3000);
digitalWrite(sverde[NORTE], HIGH);
digitalWrite(samarelo[NORTE], LOW);
digitalWrite(svermelho[NORTE], LOW);
delay(50);
}
void leste()
{
digitalWrite(sverde[NORTE], LOW);
digitalWrite(sverde[SUL], LOW);
digitalWrite(sverde[OESTE], LOW);
digitalWrite(svermelho[NORTE], HIGH);
digitalWrite(svermelho[SUL], HIGH);
digitalWrite(svermelho[OESTE], HIGH);
digitalWrite(pverde[LESTE], LOW);
digitalWrite(pvermelho[LESTE], HIGH);
delay(1000);
digitalWrite(sverde[LESTE], HIGH);
digitalWrite(samarelo[LESTE], LOW);
digitalWrite(svermelho[LESTE], LOW);
delay(50);
}
void sul()
{
digitalWrite(sverde[NORTE], LOW);
digitalWrite(sverde[LESTE], LOW);
digitalWrite(sverde[OESTE], LOW);
digitalWrite(svermelho[NORTE], HIGH);
digitalWrite(svermelho[LESTE], HIGH);
digitalWrite(svermelho[OESTE], HIGH);
digitalWrite(pverde[SUL], LOW);
digitalWrite(pvermelho[SUL], HIGH);
delay(1000);
digitalWrite(sverde[SUL], HIGH);
digitalWrite(samarelo[SUL], LOW);
digitalWrite(svermelho[SUL], LOW);
delay(50);
}
void oeste()
{
digitalWrite(sverde[NORTE], LOW);
digitalWrite(sverde[LESTE], LOW);
digitalWrite(sverde[SUL], LOW);
digitalWrite(svermelho[NORTE], HIGH);
digitalWrite(svermelho[LESTE], HIGH);
digitalWrite(svermelho[SUL], HIGH);
digitalWrite(pverde[OESTE], LOW);
digitalWrite(pvermelho[OESTE], HIGH);
delay(3000);
digitalWrite(sverde[OESTE], HIGH);
digitalWrite(samarelo[OESTE], LOW);
digitalWrite(svermelho[OESTE], LOW);
delay(50);
}
void pedestre()
{
//Desliga os verdes
digitalWrite(sverde[NORTE], LOW);
digitalWrite(sverde[LESTE], LOW);
digitalWrite(sverde[SUL], LOW);
digitalWrite(sverde[OESTE], LOW);
//Controla os amarelos
if (digitalRead(pvermelho[NORTE]) == HIGH && digitalRead(svermelho[NORTE]) == LOW) {
digitalWrite(samarelo[NORTE], HIGH);
delay(3000);
digitalWrite(samarelo[NORTE], LOW);
}
else if (digitalRead(pvermelho[LESTE]) == HIGH && digitalRead(svermelho[LESTE]) == LOW) {
digitalWrite(samarelo[LESTE], HIGH);
delay(3000);
digitalWrite(samarelo[LESTE], LOW);
}
else if (digitalRead(pvermelho[SUL]) == HIGH && digitalRead(svermelho[SUL]) == LOW) {
digitalWrite(samarelo[SUL], HIGH);
delay(3000);
digitalWrite(samarelo[SUL], LOW);
}
else if (digitalRead(pvermelho[OESTE]) == HIGH && digitalRead(svermelho[OESTE]) == LOW) {
digitalWrite(samarelo[OESTE], HIGH);
delay(3000);
digitalWrite(samarelo[OESTE], LOW);
}
//Liga os vermelhos
digitalWrite(svermelho[NORTE], HIGH);
digitalWrite(svermelho[LESTE], HIGH);
digitalWrite(svermelho[SUL], HIGH);
digitalWrite(svermelho[OESTE], HIGH);
delay(3000);
//Desliga os vermelhos
digitalWrite(pvermelho[NORTE], LOW);
digitalWrite(pvermelho[LESTE], LOW);
digitalWrite(pvermelho[SUL], LOW);
digitalWrite(pvermelho[OESTE], LOW);
//Liga os pedestres verdes
digitalWrite(pverde[NORTE], HIGH);
digitalWrite(pverde[LESTE], HIGH);
digitalWrite(pverde[SUL], HIGH);
digitalWrite(pverde[OESTE], HIGH);
delay(5000);
//Desliga os pedestres verdes
digitalWrite(pverde[NORTE], LOW);
digitalWrite(pverde[LESTE], LOW);
digitalWrite(pverde[SUL], LOW);
digitalWrite(pverde[OESTE], LOW);
//Liga os pedestres vermelhos
digitalWrite(pvermelho[NORTE], HIGH);
digitalWrite(pvermelho[LESTE], HIGH);
digitalWrite(pvermelho[SUL], HIGH);
digitalWrite(pvermelho[OESTE], HIGH);
delay(1000);
}
void blink() {
state = !state;
}