//---Mapeamento de Hardware---//
#define ledgPpin 13//15 //SD3
//#define ledgPpin1 3 //SD2
#define ledrCpin 33 //16//D2
#define ledyCpin 25 //4 //D0
#define ledgCpin 26 //5//D1
#define ledrApin 27 //2 //D4
#define ledyApin 14 //14 //D5i
#define ledgApin 12 //0 //D3
//---Variáveis Globais---//
unsigned long tempoAtual = 0, tempoAnterior = 0, intervalo = 100;
int contTempo = 0, cont500 = 0;
bool x = 0, y = 0;
bool ledrC = 0, ledgC = 0, ledyC = 0, ledrP = 0, ledgP = 0;
bool ledrA = 0, ledgA = 0, ledyA = 0;
int BT = 10; //10
int verde = 5 * BT; //50
int amarelo = 8 * BT; //80
int vermelho = 14 * BT; //140
int verdeA = 12 * BT;
int amareloA = 13 * BT;
int tempolimitefim = 14 * BT;
int tempolimite = 14 * BT; // 140
int vermelhopisca = tempolimite + BT;
int tempolimitevermelho = vermelhopisca + BT;//16*BT
int amarelopisca = tempolimitevermelho + BT;
int tempolimiteamarelo = amarelopisca + BT;
int verdepisca = tempolimiteamarelo + BT;
int tempolimiteverde = verdepisca + BT;
//---Protótipo das Funções Auxiliares---//
void setupInicial();
void temporizador();
void selecaoDeCor();
void saidas();
//---Configurações Iniciais---//
void setup()
{
setupInicial();
Serial.begin(115200);
}
//---Ciclo Infinito---//
void loop()
{
if ((digitalRead(ledgPpin) == 1) && (digitalRead(ledgApin) == HIGH))
{
tempolimite = tempolimitevermelho ; //160
contTempo = vermelhopisca; //160
Serial.println("else if ledgPpin == 1 & ledgApin == 1 ");
Serial.println( tempolimite,DEC );
Serial.println( contTempo,DEC );
} else {
if ((digitalRead(ledgPpin) == 1) && ((digitalRead(ledrCpin) == HIGH) && (digitalRead(ledrApin) == HIGH)))
{
tempolimite = tempolimiteverde ; //120
contTempo = verdepisca; //110
Serial.println("else if ledgPpin == 1 & ledrCpin == 1 ledrApin == 1 ");
Serial.println( tempolimite,DEC );
Serial.println( contTempo,DEC );
} else {
if ((digitalRead(ledgPpin) == 1) && (digitalRead(ledyCpin) == HIGH))
{
tempolimite = tempolimiteamarelo ; //110
contTempo = amarelopisca; //100
Serial.println("else if ledgPpin == 1 & ledyCpin == 1 ");
Serial.println( tempolimite,DEC );
Serial.println( contTempo,DEC );
} else {
if ((digitalRead(ledgPpin) == 1) && (digitalRead(ledgCpin) == HIGH))
{
tempolimite = tempolimiteverde ; //120
contTempo = verdepisca; //110
Serial.println("else if ledgPpin == 1 & ledgCpin == 1 ");
Serial.println( tempolimite,DEC );
Serial.println( contTempo,DEC );
}
}
}
}
temporizador();
selecaoDeCor();
saidas();
}
//---Protótipo das Funções Auxiliares---//
void setupInicial()
{
pinMode(ledyCpin, OUTPUT);
pinMode(ledgCpin, OUTPUT);
pinMode(ledrCpin, OUTPUT);
pinMode(ledgPpin, INPUT);
//pinMode(ledgPpin1,INPUT);
pinMode(ledrApin, OUTPUT);
pinMode(ledgApin, OUTPUT);
pinMode(ledyApin, OUTPUT);
}
//========================================//
void temporizador()
{
tempoAtual = millis();
/*Serial.println("TL");
Serial.println(tempolimite,DEC );
Serial.println("TAN");
Serial.println( tempoAnterior,DEC );
Serial.println( "I");
Serial.println(intervalo,DEC );
Serial.println( "TA");
Serial.println(tempoAtual,DEC );
Serial.println( "CT");
Serial.println(contTempo,DEC );*/
if (tempoAtual - tempoAnterior >= intervalo)
{
tempoAnterior = tempoAtual;
x = !x;
contTempo++;
// tempolimite=180
if (contTempo > tempolimite) contTempo = 0;
}
}
//========================================//
void selecaoDeCor()
{
//tempo verde && tempo vermelhoA
if (contTempo < verde) //50
{
ledrC = 0;
ledgC = 1; //verdeC
ledyC = 0;
ledgA = 0;
ledrA = 1; //vermelhoA
ledyA = 0;
}
//tempo amarelo && tempo vermelhoA
if ((contTempo >= verde) && (contTempo < amarelo))//80
{
ledrC = 0;
ledgC = 0;
ledyC = 1; //amareloC
ledgA = 0;
ledrA = 1; //vermelhoA
ledyA = 0;
}
//tempo comum VermelhoA e vermelho
if ((contTempo >= amarelo) && (contTempo < (amarelo + BT)))//90
{
ledrC = 1; //vermelhoC
ledgC = 0;
ledyC = 0;
ledgA = 0;
ledrA = 1; //vermelhoA
ledyA = 0;
}
//tempo verdeA && tempo vermelho
if ((contTempo >= (amarelo + BT)) && (contTempo < verdeA))//120
{
ledrC = 1; //vermelhoC
ledgC = 0;
ledyC = 0;
ledgA = 1; //verdeA
ledrA = 0;
ledyA = 0;
}
//tempo amareloA && tempo vermelho
if ((contTempo >= verdeA) && (contTempo < amareloA))//130
{
ledrC = 1; //vermelhoC
ledgC = 0;
ledyC = 0;
ledgA = 0;
ledrA = 0;
ledyA = 1; //amareloA
}
// tempo vermelho && vermelhoA
if ((contTempo >= amareloA) && (contTempo < (amareloA + BT)))//140
{
ledrC = 1; //vermelhoC
ledgC = 0;
ledyC = 0;
ledgA = 0;
ledrA = 1; //vermelhoA
ledyA = 0;
}
//........PISCA X MUDA DE 0 PARA 1 PARA 0
if ((contTempo > vermelho) && (contTempo < tempolimitevermelho )) //160
{
Serial.println("contTempo > vermelho & contTempo < tempolimitevermelho ");
Serial.println(contTempo,DEC);
Serial.println(tempolimitevermelho,DEC);
Serial.println( ledyA,DEC );
ledgA = 0; //!x; // atribuir o valor inverso de x faz com que o amarelo e o verde pisquem de forma alternada ao pressionar botão durante o verde do semáforo "A".
ledrA = 0;
ledyA = x ; //amareloA PISCA
if (contTempo == tempolimitevermelho - 1) {
tempolimite = tempolimitefim;
}
}
if ((contTempo > tempolimitevermelho) && (contTempo < tempolimiteamarelo)) //140
{
ledrC = 0;
ledgC = 0;
ledyC = x; //amarelo pisca
if (contTempo == tempolimiteamarelo - 1) {
tempolimite = tempolimitefim;
}
}
if ((contTempo > tempolimiteamarelo) && (contTempo < tempolimiteverde)) //140
{
ledrC = 0;
ledgC = x; //verde pisca
ledyC = 0;
if (contTempo == tempolimiteverde - 1) {
tempolimite = tempolimitefim;
}
}
}
//========================================//
void saidas()
{
digitalWrite(ledyApin, ledyA);
digitalWrite(ledgApin, ledgA);
digitalWrite(ledrApin, ledrA);
digitalWrite(ledyCpin, ledyC);
digitalWrite(ledgCpin, ledgC);
digitalWrite(ledrCpin, ledrC);
}
//========================================//
C
A