Semáforo com Arduíno UNO

Olá, como estão? Hoje desenvolveremos um semáforo com Arduíno UNO, para este projeto usamos o KIT iniciante com Arduíno UNO da WJ Componentes.

Arduíno UNO
LED Difuso

Componentes Utilizados


OU

Funcionamento do Projeto Semáforo


Antes de mais nada como foi comentado acima iremos desenvolver um semáforo com o Arduíno, onde irá ter dois semáforos em paralelo com um botão. Assim quando o pedestre clicar no botão, ele irá fechar os semáforos, utilizamos a função millis ao invés do delay em alguns casos. Porém caso não conheça elas, iremos explicar abaixo como utilizar e para que elas servem.

Função Delay e Millis

Antes de tudo as duas funções têm como seu principal função esperar um determinado tempo para executar instruções. A função delay pausa o programa por um determinado tempo, ou seja, seu programa irá parar por um tempo assim ele não executara nenhuma outra função até que o tempo se esgote.

Sintaxe delay:

delay(ms);

Parâmetros:

  • ms: tempo em milissegundos, por exemplo 1 segundo = 1000 milissegundos.

Já a função millis, por usa vez ela não utiliza contador então ela não irá parar seu programa, porém ela é um pouco mais difícil de se utilizar. Pois assim que você a usar irá retornar o tempo de uso do Arduíno a partir de quando ele foi ligado, assim você pode estar realizando um cálculo para saber a quantidade de tempo.

Sintaxe millis:

time = millis();

Montagem do Projeto Semáforo


Logo após compra dos componentes na WJ Componentes, vamos à montagem! Em seguida conectamos os LEDs na protoboard com os resistores que ligamos nos catodos dos LEDs, e para finalizar os LEDs ligaremos o anodo aos pinos 3, 4, 5, 6, 7 e 8 do Arduíno. Então conectamos um botão na protoboard e conectamos no pino 2 do Arduíno, ele será responsável por deixar vermelho os semáforos para os pedestres atravessarem.

Contudo segue abaixo uma imagem que demonstra a montagem do circuito.

Pinout LED Código Morse
Pinout LED
Montagem do Circuito Eletrônico na protoboard - Semáforo
Figura 1 – Montagem do Circuito Eletrônico na protoboard – Semáforo

Diagrama Esquemático do Projeto Semáforo


Figura 2 – Diagrama do Circuito Eletrico – Código Morse

Código-fonte do Projeto Semáforo


Em seguida segue abaixo código completo do projeto semáforo.

//Definições -----------------------------------------------------------------------------------------
#define btn 2                                                             // Define pino botão
#define verde 3                                                           // Define LED verde
#define amarelo 5                                                         // Define LED amarelo
#define vermelho 7                                                        // Define LED vermelho
#define verde2 8                                                          // Define LED verde 2
#define amarelo2 6                                                        // Define LED amarelo 2
#define vermelho2 4                                                       // Define LED vermelho 2
 
//Variáveis Globais ----------------------------------------------------------------------------------
unsigned long delay1 = 0;                                                 // Armazena Tempo
	 
//Setup ----------------------------------------------------------------------------------------------
void setup() { 
    pinMode(verde, OUTPUT);                                               // Configura LED como OUTPUT
    pinMode(amarelo, OUTPUT);                                             // Configura LED como OUTPUT
    pinMode(vermelho, OUTPUT);                                            // Configura LED como OUTPUT
    pinMode(verde2, OUTPUT);                                              // Configura LED como OUTPUT
    pinMode(amarelo2, OUTPUT);                                            // Configura LED como OUTPUT
    pinMode(vermelho2, OUTPUT);                                           // Configura LED como OUTPUT
    pinMode(btn, INPUT_PULLUP);                                           // Configura btn como INPUT
}
 
//Loop -----------------------------------------------------------------------------------------------
void loop() {
    if(!digitalRead(btn)){                                                // Se botão pressionado
        delay(2000);                                                      // Espera 2s
        digitalWrite(amarelo, digitalRead(verde));                        // Usa o sinal do verde
        digitalWrite(verde, LOW);                                         // Desliga LED verde
        digitalWrite(amarelo2, digitalRead(verde2));                      // Usa o sinal do verde2
        digitalWrite(verde2, LOW);                                        // Desliga LED verde 2 
        delay(2000);                                                      // Espera 2s
        digitalWrite(amarelo, LOW);                                       // Desliga LED vermelho
        digitalWrite(amarelo2, LOW);                                      // Desliga LED vermelho 2
        digitalWrite(vermelho, HIGH);                                     // Liga LED vermelho
        digitalWrite(vermelho2, HIGH);                                    // Liga LED vermelho 2
        delay(5000);                                                      // Espera 5s
        digitalWrite(vermelho, LOW);                                      // Desliga LED vermelho
        digitalWrite(vermelho2, LOW);                                     // Desliga LED vermelho 2
    }
    else if((millis() - delay1) < 2000){                                  // Verificação de Tempo
        digitalWrite(amarelo, LOW);                                       // Desliga LED amarelo
        digitalWrite(vermelho, HIGH);                                     // Liga LED vermelho
        digitalWrite(verde2, HIGH);                                       // Liga LED verde 2
        digitalWrite(vermelho2, LOW);                                     // Desliga LED vermelho 2
    }
    else if((millis() - delay1) < 2000){                                  // Verificação de Tempo
        digitalWrite(amarelo, LOW);                                       // Desliga LED amarelo
        digitalWrite(vermelho, HIGH);                                     // Liga LED vermelho
        digitalWrite(verde2, HIGH);                                       // Liga LED verde 2
        digitalWrite(vermelho2, LOW);                                     // Desliga LED vermelho 2
    }
    else if((millis() - delay1) >= 2000 && (millis() - delay1) < 5000){   // Verificação de Tempo
        digitalWrite(verde2, LOW);                                        // Desliga LED verde 2
        digitalWrite(amarelo2, HIGH);                                     // Liga LED amarelo 2
    }
    else if((millis() - delay1) >= 5000 && (millis() - delay1) < 7000 ){  // Verificação de Tempo
        digitalWrite(verde, HIGH);                                        // Liga LED verde
        digitalWrite(vermelho, LOW);                                      // Desliga LED vermelho
        digitalWrite(amarelo2, LOW);                                      // Desliga LED amarelo 2
        digitalWrite(vermelho2, HIGH);                                    // Liga LED vermelho 2
    }
    else if((millis() - delay1) >= 7000 && (millis() - delay1) < 10000 ){ // Verificação de Tempo
        digitalWrite(verde, LOW);                                         // Desliga LED verde
        digitalWrite(amarelo, HIGH);                                      // Liga LED amarelo
    }
    else if((millis() -delay1) >= 10000){                                 // Verificação de Tempo
        delay1 = millis();                                                // Atribui o retorno 
    }
}

Vamos dar uma olhada mais de perto no código:

Definições de Pinos

Primeiramente temos que estar definindo os pinos que utilizamos em nosso projeto.

//Definições -----------------------------------------------------------------------------------------
#define btn 2                                                             // Define pino botão
#define verde 3                                                           // Define LED verde
#define amarelo 5                                                         // Define LED amarelo
#define vermelho 7                                                        // Define LED vermelho
#define verde2 8                                                          // Define LED verde 2
#define amarelo2 6                                                        // Define LED amarelo 2
#define vermelho2 4                                                       // Define LED vermelho 2

Variáveis Globais

Em seguida declaramos um variável global, sendo ela delay1 responsável por armazenar o tempo em milissegundos.

//Variáveis Globais ----------------------------------------------------------------------------------
unsigned long delay1 = 0;                                                 // Armazena Tempo

Funções Setup

Além disso na função setup, será onde configuramos o pino 2 como INPUT_PULLUP e também configuramos mais seis pinos sendo eles 3, 4, 5, 6, 7 e 8  como OUTPUT.

//Setup ----------------------------------------------------------------------------------------------
void setup() { 
    pinMode(verde, OUTPUT);                                               // Configura LED como OUTPUT
    pinMode(amarelo, OUTPUT);                                             // Configura LED como OUTPUT
    pinMode(vermelho, OUTPUT);                                            // Configura LED como OUTPUT
    pinMode(verde2, OUTPUT);                                              // Configura LED como OUTPUT
    pinMode(amarelo2, OUTPUT);                                            // Configura LED como OUTPUT
    pinMode(vermelho2, OUTPUT);                                           // Configura LED como OUTPUT
    pinMode(btn, INPUT_PULLUP);                                           // Configura btn como INPUT
}

Funções Loop

Agora na função loop, verificamos se o botão foi pressionado, caso tenha sido esperamos 2 segundos, ler o sinal do LED verde para ligar ou desligar o LED amarelo, em seguida desligamos o LED verde, esperamos mais 2 segundos, mudamos os dois semáforos para vermelho, esperamos 5 segundos e desligamos o vermelho do semáforos.

//Loop -----------------------------------------------------------------------------------------------
void loop() {
    if(!digitalRead(btn)){                                                // Se botão pressionado
        delay(2000);                                                      // Espera 2s
        digitalWrite(amarelo, digitalRead(verde));                        // Usa o sinal do verde
        digitalWrite(verde, LOW);                                         // Desliga LED verde
        digitalWrite(amarelo2, digitalRead(verde2));                      // Usa o sinal do verde2
        digitalWrite(verde2, LOW);                                        // Desliga LED verde 2 
        delay(2000);                                                      // Espera 2s
        digitalWrite(amarelo, LOW);                                       // Desliga LED vermelho
        digitalWrite(amarelo2, LOW);                                      // Desliga LED vermelho 2
        digitalWrite(vermelho, HIGH);                                     // Liga LED vermelho
        digitalWrite(vermelho2, HIGH);                                    // Liga LED vermelho 2
        delay(5000);                                                      // Espera 5s
        digitalWrite(vermelho, LOW);                                      // Desliga LED vermelho
        digitalWrite(vermelho2, LOW);                                     // Desliga LED vermelho 2
    }
    else if((millis() - delay1) < 2000){                                  // Verificação de Tempo
        digitalWrite(amarelo, LOW);                                       // Desliga LED amarelo
        digitalWrite(vermelho, HIGH);                                     // Liga LED vermelho
        digitalWrite(verde2, HIGH);                                       // Liga LED verde 2
        digitalWrite(vermelho2, LOW);                                     // Desliga LED vermelho 2
    }

Então caso o botão não tenha sido clicado, passamos para a parte do controle de tempo do semáforo. Para isso temos que definir um ciclo, nós definimos 10 segundos, ou seja, cada loop do semáforo irá ter 10 segundos. Para isso verificamos se millis() menos delay1 é menor que 2000 milissegundos, para que assim ligue o LED vermelho do primeiro e o LED verde do segundo semáforo. Caso seja maior que 2000 milissegundo verificamos se é maior ou igual a 2000 milissegundos e menor que 5000 milissegundos, caso seja desligamos LED verde e ligamos LED amarelo do segundo semáforo, para finalizar fechamos o loop verificando se é maior ou igual 10000 milissegundos, caso seja atribuímos a delay1 o valor de millis assim fazendo com que ele refaça o loop corretamente.

    else if((millis() - delay1) < 2000){                                  // Verificação de Tempo
        digitalWrite(amarelo, LOW);                                       // Desliga LED amarelo
        digitalWrite(vermelho, HIGH);                                     // Liga LED vermelho
        digitalWrite(verde2, HIGH);                                       // Liga LED verde 2
        digitalWrite(vermelho2, LOW);                                     // Desliga LED vermelho 2
    }
    else if((millis() - delay1) >= 2000 && (millis() - delay1) < 5000){   // Verificação de Tempo
        digitalWrite(verde2, LOW);                                        // Desliga LED verde 2
        digitalWrite(amarelo2, HIGH);                                     // Liga LED amarelo 2
    }
    else if((millis() - delay1) >= 5000 && (millis() - delay1) < 7000 ){  // Verificação de Tempo
        digitalWrite(verde, HIGH);                                        // Liga LED verde
        digitalWrite(vermelho, LOW);                                      // Desliga LED vermelho
        digitalWrite(amarelo2, LOW);                                      // Desliga LED amarelo 2
        digitalWrite(vermelho2, HIGH);                                    // Liga LED vermelho 2
    }
    else if((millis() - delay1) >= 7000 && (millis() - delay1) < 10000 ){ // Verificação de Tempo
        digitalWrite(verde, LOW);                                         // Desliga LED verde
        digitalWrite(amarelo, HIGH);                                      // Liga LED amarelo
    }
    else if((millis() -delay1) >= 10000){                                 // Verificação de Tempo
        delay1 = millis();                                                // Atribui o retorno 
    }
}

Assim finalizamos todo o código com a explicação sobre o projeto de semáforo com Arduíno UNO.

Resultado do Projeto Semáforo


Por fim esse foi o resultado obtido com o projeto do Semáforo.

Agradecemos sua Presença


Por fim, espero que tenham gostado e aprendido. Compartilhe com seus colegas e deixe um comentário de qual projeto deveria ser o próximo aqui no Blog da WJ Componentes!!
Enfim estarei deixando o arquivo Arduíno e Fritzing, link dos posts anteriores referentes ao projeto e software e sites utilizados.
Fique à vontade para tirar suas dúvidas nos comentários.

Software e Sites Utilizados

Post Relacionados

Posts mais Recentes

Julio Cesar Bonow Manoel

Julio Cesar Bonow Manoel

Cursando Engenharia da Computação pelo Centro Universitário Facens e atua no desenvolvimento de projetos na WJ Componentes. Participante da equipe de robótica Omegabotz.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *