#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 16, 2);
// Grupos de luzes 1
int tl1Red = 3;
int tl1Yellow = 4;
int tl1Green = 5;
// Grupo de luzes 2
int tl2Red = 6;
int tl2Yellow = 7;
int tl2Green = 8;
// Botões
int pushButton[] = {2,9};
int buttons[] = {0,0};
// Status
int currentState = 0;
// Tempo
unsigned long start = 0;
unsigned long greenDel = 4000;
unsigned long yellowDel = 1000;
unsigned long greenDelPre = greenDel / 2;
unsigned long yellowDelPre = yellowDel / 1;
/* Função determinante de cada luz e
botão no sistema. */
void setup() {
// Grupos de luzes 1
pinMode(tl1Red, OUTPUT);
pinMode(tl1Yellow, OUTPUT);
pinMode(tl1Green, OUTPUT);
// Grupos de luzes 2
pinMode(tl2Red, OUTPUT);
pinMode(tl2Yellow, OUTPUT);
pinMode(tl2Green, OUTPUT);
// PushButtons
pinMode (pushButton[0], INPUT);
pinMode (pushButton[1], INPUT);
lcd.init();
lcd.backlight();
lcd.print("CP3 - IOT - 2024");
}
/* Função principal com o objetivo de organizar
os estados e gerenciar as outras funções declaradas
neste algoritmo. */
void loop() {
buttons[0] = digitalRead(pushButton[0]);
buttons[1] = digitalRead(pushButton[1]);
natSequence();
bpSequence();
if (buttons[0] == HIGH) {
if (digitalRead(tl1Green) == HIGH) {
currentState = 4;
} else if (digitalRead(tl1Yellow) == HIGH) {
currentState = 5;
}
natSequence();
} else if (buttons[1] == HIGH) {
if (digitalRead(tl2Green) == HIGH) {
currentState = 8;
} else if (digitalRead(tl2Yellow) == HIGH) {
currentState = 9;
}
natSequence();
} else {
natSequence();
}
}
/* Função com objetivo de determinar os estados
para o uso dos botões. Quando um botão é pressionado,
ele recebe um estado declarado e atribuido atráves
dessa função abaixo. */
void bpSequence() {
unsigned long currentTime = millis();
unsigned long elapsedTime = currentTime - start;
// Botão 1 apertado
if (currentState == 4) {
if (elapsedTime < greenDelPre) {
// Luzes do semáforo 1
digitalWrite(tl1Red, LOW);
digitalWrite(tl1Yellow, LOW);
digitalWrite(tl1Green, HIGH);
// Luzes do semáforo 2
digitalWrite(tl2Red, HIGH);
digitalWrite(tl2Yellow, LOW);
digitalWrite(tl2Green, LOW);
}
else {
currentState = 5;
start = currentTime;
}
} else if (currentState == 5) {
if (elapsedTime < yellowDelPre) {
// Luzes do semáforo 1
digitalWrite(tl1Green, LOW);
digitalWrite(tl1Red, LOW);
digitalWrite(tl1Yellow, HIGH);
}
else {
currentState = 6;
start = currentTime;
}
} else if (currentState == 6) {
if (elapsedTime < greenDel) {
// Luzes do semáforo 1
digitalWrite(tl1Green, LOW);
digitalWrite(tl1Yellow, LOW);
digitalWrite(tl1Red, HIGH);
// Luzes do semáforo 2
digitalWrite(tl2Green, HIGH);
digitalWrite(tl2Yellow, LOW);
digitalWrite(tl2Red, LOW);
} else {
currentState = 7;
start = currentTime;
}
} else if (currentState == 7) {
if (elapsedTime < yellowDel) {
digitalWrite(tl2Green, LOW);
digitalWrite(tl2Red, LOW);
digitalWrite(tl2Yellow, HIGH);
} else {
currentState = 0;
start = currentTime;
}
}
// Botão 2 apertado
if (currentState == 8) {
if (elapsedTime < greenDelPre) {
// Luzes do semáforo 1
digitalWrite(tl2Red, LOW);
digitalWrite(tl2Yellow, LOW);
digitalWrite(tl2Green, HIGH);
// Luzes do semáforo 2
digitalWrite(tl1Red, HIGH);
digitalWrite(tl1Yellow, LOW);
digitalWrite(tl1Green, LOW);
}
else {
currentState = 9;
start = currentTime;
}
} else if (currentState == 9) {
if (elapsedTime < yellowDelPre) {
// Luzes do semáforo 1
digitalWrite(tl2Green, LOW);
digitalWrite(tl2Red, LOW);
digitalWrite(tl2Yellow, HIGH);
}
else {
currentState = 10;
start = currentTime;
}
} else if (currentState == 10) {
if (elapsedTime < greenDel) {
// Luzes do semáforo 1
digitalWrite(tl2Green, LOW);
digitalWrite(tl2Yellow, LOW);
digitalWrite(tl2Red, HIGH);
// Luzes do semáforo 2
digitalWrite(tl1Green, HIGH);
digitalWrite(tl1Yellow, LOW);
digitalWrite(tl1Red, LOW);
} else {
currentState = 11;
start = currentTime;
}
} else if (currentState == 11) {
if (elapsedTime < yellowDel) {
// Luzes do semáforo 1
digitalWrite(tl1Green, LOW);
digitalWrite(tl1Red, LOW);
digitalWrite(tl1Yellow, HIGH);
} else {
currentState = 12;
start = currentTime;
}
} else if (currentState == 12) {
if (elapsedTime < greenDel) {
// Luzes do semáforo 1
digitalWrite(tl1Green, LOW);
digitalWrite(tl1Yellow, LOW);
digitalWrite(tl1Red, HIGH);
// Luzes do semáforo 2
digitalWrite(tl2Green, HIGH);
digitalWrite(tl2Yellow, LOW);
digitalWrite(tl2Red, LOW);
} else {
currentState = 13;
start = currentTime;
}
} else if (currentState == 13) {
if (elapsedTime < yellowDel) {
// Luzes do semáforo 1
digitalWrite(tl1Green, LOW);
digitalWrite(tl1Red, HIGH);
digitalWrite(tl1Yellow, LOW);
} else {
currentState = 0;
start = currentTime;
}
}
}
/* Função que executa o funcionamento automatico
dos farois e interage com os estados atribuidos
quando um determinado botão é acionado. */
void natSequence() {
unsigned long currentTime = millis();
unsigned long elapsedTime = currentTime - start;
if (currentState == 0) {
if (elapsedTime < greenDel) {
// Luzes do semáforo 1
digitalWrite(tl1Red, LOW);
digitalWrite(tl1Yellow, LOW);
digitalWrite(tl1Green, HIGH);
// Luzes do semáforo 2
digitalWrite(tl2Red, HIGH);
digitalWrite(tl2Yellow, LOW);
digitalWrite(tl2Green, LOW);
}
else {
currentState = 1;
start = currentTime;
}
} else if (currentState == 1) {
if (elapsedTime < yellowDel) {
// Luzes do semáforo 1
digitalWrite(tl1Green, LOW);
digitalWrite(tl1Red, LOW);
digitalWrite(tl1Yellow, HIGH);
}
else {
currentState = 2;
start = currentTime;
}
} else if (currentState == 2) {
if (elapsedTime < greenDel) {
// Luzes do semáforo 1
digitalWrite(tl1Green, LOW);
digitalWrite(tl1Yellow, LOW);
digitalWrite(tl1Red, HIGH);
// Luzes do semáforo 2
digitalWrite(tl2Green, HIGH);
digitalWrite(tl2Yellow, LOW);
digitalWrite(tl2Red, LOW);
} else {
currentState = 3;
start = currentTime;
}
} else if (currentState == 3) {
if (elapsedTime < yellowDel) {
digitalWrite(tl2Green, LOW);
digitalWrite(tl2Red, LOW);
digitalWrite(tl2Yellow, HIGH);
} else {
currentState = 0;
start = currentTime;
}
}
}---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
Avenida Paulista
Rua Pamplona