// Adicionar Pisca para o vermelho do pedestre.

#define Vm_c 21
#define Am_c 19
#define Vd_c 18
#define Botao 25
#define Pedestre_VM 4
#define Pedestre_VD 2

int flagSemaforo;
int StatusBotao;  //verificar o estado anterior do botao 

int Pisca;
int flagPisca;

void setup()
{
  pinMode(Vm_c, OUTPUT);
  pinMode(Am_c, OUTPUT);
  pinMode(Vd_c, OUTPUT);
  pinMode(Botao, INPUT);
  pinMode(Pedestre_VM, OUTPUT);
  pinMode(Pedestre_VD, OUTPUT);

  flagSemaforo = 1;
  StatusBotao = digitalRead(Botao); // verificar botao

  Pisca = 0;
  flagPisca = HIGH;

}
void loop()
{
  
  int flagBotao;
  

  
  flagBotao = digitalRead(Botao);
//                    Borda de subida e de descida.
    if ((flagBotao == HIGH) && (StatusBotao == LOW))  // atribuir nova verificação do estado anterior do botao.
    {
      if (flagSemaforo < 4)
      {
      flagSemaforo = flagSemaforo + 1;
      }
      else
      {
        flagSemaforo = 1;
      }
      delay(100);
    }
    StatusBotao = flagBotao;

    if (flagSemaforo == 1)
    {
      digitalWrite(Vd_c, HIGH);
      digitalWrite(Am_c, LOW);
      digitalWrite(Vm_c, LOW);

      digitalWrite(Pedestre_VD, LOW);
      digitalWrite(Pedestre_VM, HIGH);

    }
    if (flagSemaforo == 2)
    {
      digitalWrite(Vd_c, LOW);
      digitalWrite(Am_c, HIGH);
      digitalWrite(Vm_c, LOW);

      digitalWrite(Pedestre_VD, LOW);
      digitalWrite(Pedestre_VM, HIGH);
     
    }
    if (flagSemaforo == 3)
    {
      digitalWrite(Vd_c, LOW);
      digitalWrite(Am_c, LOW);
      digitalWrite(Vm_c, HIGH);

      digitalWrite(Pedestre_VD, HIGH);
      digitalWrite(Pedestre_VM, LOW);
      
    }

     if (flagSemaforo == 4)  // Pisca Semaforo VM Pedestre.
    {
      digitalWrite(Vd_c, LOW);
      digitalWrite(Am_c, LOW);
      digitalWrite(Vm_c, HIGH);

      Pisca = Pisca + 1;
      if (Pisca == 400)
      {
        flagPisca = !flagPisca;
        Pisca = 0;
      }

      digitalWrite(Pedestre_VD, LOW);
      digitalWrite(Pedestre_VM, flagPisca);
      
    }

    delay(1);
}