Projeto 06 - Simulação Semáforo com Arduino

Básico - Projeto 06

Simular um semáforo completo iniciado por botão

Objetivo

Criar um simulador de farol de pedestre em conjunto com um semáforo para automóveis. O sistema de luzes é alterado (vermelho) para que os carros parem e os pedestres possam atravessar a rua em segurança (verde). Para iniciar o semáforo é preciso pressionar o botão uma vez.

Aplicação

Para fins didáticos. Pode ser utilizado também em maquetes para ferrovia em miniatura ou em mini cidades de brinquedo.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

Protoboard Protoboard 400 pontos 1 Resultado de imagem para protoboard 830v

No mínimo utilizar protoboard com 400 pontos

Jumpers Kit cabos ligação macho / macho 1  
Resistor

Resistor

5

5 Resistor 200Ω

Se precisar usar outros valores, calcule o resistor apropriado para o led utilizado - Calcular Resistor.

Led 5mm LED 5mm 5

2 leds vermelhos, 2 leds verdes e um led amarelo alto brilho ou difuso

Você poderá utilizar também LEDs de 3 mm na cor que desejar.

Push Button Push button 6X6X5mm 1  
Arduino UNO R3 Arduino UNO 1

Você poderá utilizar uma placa Arduino UNO original ou similar

Montagem do Circuito

Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito.

Atenção

1) Lembre-se que o LED tem polaridade: O terminal maior tem polaridade positiva e o lado do chanfro tem polaridade negativa.

1.1. Portanto, faça a conexão do Arduino no terminal positivo (anodo) e o GND no terminal negativo (catodo) do led.

1.2. Para evitar danos ao led é necessário a inclusão de um resistor no circuito. Como o resistor é um limitador da corrente elétrica, ele poderá estar conectado no anodo (terminal maior) ou no catodo (terminal menor) do led, tanto faz.

2. Determinamos o valor do resistor através da tabela prática: Tabela prática de utilização de leds 3mm e 5mm. Entretanto, o mais correto é sempre verificar o datasheet do fabricante do LED para você ter os exatos valores de tensão e corrente do mesmo - leia Como calcular o resistor adequado para o led e Leds ligados em série e em paralelo.

Obs.: Resistores iguais ou superiores a 250 Ω poderão ser utilizados em LEDs de todas as cores para um circuito com tensão igual ou inferior a 5V.

Valores utilizados para nossos projetos: LEDs difusos ou de alto brilho: Vermelho, Laranja e Amarelo: 150 Ω | Led Verde e Azul: 100 Ω

3. Monte os botões (push button) sem resistor, pois habilitaremos o pull-up interno do arduino através da programação. Desta forma, quando o botão estiver pressionado, o Arduino retornará "LOW" ou "0". Assista o vídeo Arduino: Botão e Resistor de Pull Up Interno e veja o projeto Projeto 02b - Led apaga com push button pressionado (pull-up interno do Arduino).


Obs.: Os resistores pull-up e pull-down garantem um nível lógico estável quando por exemplo uma tecla não está pressionada. Geralmente utiliza-se um resistor de 10KΩ para esse propósito. A seguir é exibida a ligação desses resistores no circuito para leitura de tecla do botão:

Entradas-e-Saídas-digitais-Arduino-pull-up-pull-down

Atenção: Observe que neste projeto não utilizaremos o resistor de 10K pois vamos habilitar o resitor pull-up interno do Arduino através da programação. Leia mais em Como usar push button com Arduino (programação)

4. A montagem do nosso projeto foi realizada em um protoboard com linhas de alimentação não contínuas, onde acrescentamos jampers para a ligação. Verifique se o seu protoboard possui linhas de alimentação contínuas ou separadas - saiba mais em protoboard

Código do projeto (Sketch)

Faça o dowload e abra o arquivo projeto06.ino no IDE do Arduino: DOWNLOAD - projeto06.ino

Ou se preferir, copie e cole o código abaixo no IDE do Arduino:

/*******************************************************************************
*
*    Projeto 6: Semáforo Completo
*    Data: 15/05/2020
*                       http://squids.com.br/arduino                
*
*******************************************************************************/
// Define pinos utilizados
int autoVermelho = 2;
int autoAmarelo = 3;
int autoVerde = 4;
int pinBot = 8;
int pedVermelho = 11;
int pedVerde = 12;

// Define variaveis
int ini = 0;

//******************************************************************************
 
void setup() {
  // Define os pinos de saidas
  pinMode(autoVermelho, OUTPUT);
  pinMode(autoAmarelo, OUTPUT);
  pinMode(autoVerde, OUTPUT);
  pinMode(pedVermelho, OUTPUT);
  pinMode(pedVerde, OUTPUT);
  // Define o pino de entrada
  pinMode(pinBot, INPUT_PULLUP);
}

//******************************************************************************
 
void loop() {
  // faz a leitura do botão - inicia o semáforo
  if (digitalRead(pinBot) == LOW) {
    while (digitalRead(pinBot) == LOW) {} // espera soltar o botão
    delay(10);
    // Posição inical após presionar botão. Somente o verde dos carros e o vermelho dos pedestres acesos
    digitalWrite(autoVerde, HIGH); 
    digitalWrite(autoVerde, LOW);
    digitalWrite(autoVerde, LOW);
    digitalWrite(pedVerde, LOW);
    digitalWrite(pedVermelho, HIGH);
    ini = 1;        
  }
  // funcionamento do semáforo após pressionar o botão
  if (ini == 1) {
  // Acende o verde dos carros e o vermelho dos pedestres
    digitalWrite(autoVerde, HIGH); 
    digitalWrite(pedVermelho, HIGH);  
    delay(5000); // Aguarda 5 segundos
    digitalWrite(autoVerde, LOW);
    // apaga o verde dos carros e acende o amarelo
    digitalWrite(autoAmarelo, HIGH);
    delay(3000); // aguarda mais 3 segundos
    // apaga o amarelo dos carros e acende o vermelho
    digitalWrite(autoAmarelo, LOW); 
    digitalWrite(autoVermelho, HIGH);
    // apaga o vermelho dos pedestres e acende o verde
    digitalWrite(pedVermelho, LOW); 
    digitalWrite(pedVerde, HIGH);
    delay(5000);  // aguarda mais 5 segundos
    digitalWrite(pedVerde, LOW);
    for(int x = 0; x<5; x++) { // Pisca 5x o vermelho dos pedestres
      digitalWrite(pedVermelho, HIGH);
      delay(250);
      digitalWrite(pedVermelho, LOW);
      delay(250);
    }
    digitalWrite(autoVermelho, LOW);
  }  
}

Depois, faça a verificação e o upload para o microcontrolador.

Vídeo

  

Como o projeto deve funcionar

1. Pressione o botão para iniciar o nosso semáforo.

2. O programa irá iniciar com o semáforo no verde, para para permitir que os carros passem, e a luz para pedestres no vermelho.

3. O semáforo para carros vai do verde para o amarelo e depois para o vermelho, e então o semáforo para pedestres vai para o verde.

4. Depois de um intervalo de tempo, a luz verde para pedestre deverá piscar para avisar aos pedestres que devem atravessar rapidamente antes que o semáforo feche.

5. Então, a luz vermelha do semáforo do pedestre ascende e a luz dos carros vai do vermelho para o verde, permitindo novamente o fluxo do tráfego.

Explicando o código do projeto

1. Primeiro declaramos as constantes e as variáveis do projeto.

1.1. Observe que utilizamos a variável tipo "int". Veja na tabela abaixo as diferenças nos tipos de constantes e variáveis:

Tipo Valores Válidos para Variáveis e Constantes

char

letras e símbolos: 'a', 'b', 'H', '^', '*','1','0' (utiliza 1 byte da memória,)
uint32_t, unsigned_long de 0 a 4.294.967.295 (números inteiros) (utiliza 2 bytes da memória)

uint16_t, unsigned_int

de 0 a 65.535 (números inteiros) (utiliza 2 bytes da memória)
long de - 2.147.483.648 a 2.147.483.647 (números inteiros) (utiliza 4 bytes da memória)

int, short

de -32767 até 32767 (números inteiros) (utiliza 2 bytes da memória)
float,  double de -3.4 x 1038 até +3.4 x 10+38com até 6 dígitos de precisão (2 casas depois da vírgula - ponto flutuante) (utiliza 4 bytes da memória)

byte, uint8_t

de 0 a 255 (números inteiros) (utiliza 1 byte da memória)

boolean

true (1) , false (0) (utiliza 1 byte de memória)

1.2. As variáveis tipo int autoVermelho, autoAmarelo e AutoVerde  definem as portas digitais 2, 3 e 4 respectivamente. Referem-se aos leds do semáforo de automóveis.

1.3. A variável tipo int pinBot define a porta digital 8 onde está conectado o botão (push button) utilizado para iniciar o funcionamento do semáforo.

1.4. As variáveis tipo int pedVermelho e pedVerde definem as portas digitais 11 e 12. Referem-se aos leds do semáforo de pedestres.

1.5. A variável tipo int ini recebe o valor zero.

2. Através da strutura void setup(), definimos:

2.1. Define autoVermelho, autoAmarelo, autoVerde, pedVermelho e pedVerde como saídas do controlador Arduino (OUTPUT) referentes aos pinos 2, 3, 4 ,11 e 12.

2.1. Define pinBot como entrada do controlador Arduino (INPUT_PULLUP) referente ao pino 8 do microcontrolador.

2.2.1. INPUT_PULLUP habilita o resistor pull-up interno do Arduino, eliminando a necessidade de colocarmos um resistor de 10K ligado ao VCC (5V).

3. Através da estrutura void loop(), obtemos:

3.1. Primeiro fazemos a leituras dos botão através função digitalRead(pinBot), para verificar se ele está pressionado (0 ou LOW) ou se está liberado (1 ou HIGH).

3.1.1. A função digitalRead() lê o valor de um pino digital especificado, que pode ser HIGH ou LOW. Leia Referência Arduino - digitalRead().

3.1.2. Observe que configuramos o botão como PULLUP_INTERNO e desta forma o botão enviará um sinal LOW quando pressionado. Leia Como usar push button com Arduino (programação) .

3.2. Através da estrutura de  controle while (digitalRead ==LOW) {}, o programa aguarda que o botão seja liberado, ou seja, retorne HIGH. Leia Referência Arduino - while().

3.3. Forçamos uma pausa no programa de 10 milissegundos através da função delay(). Leia Referência Arduino - delay().

3.3.1. Isto é necessário para eliminarmos possíveis erros do botão em função da sua característica mecânica. Falaremos mais sobre isso em projetos futuros.

3.4. Através da função digitalWrite() ligamos os leds 4 e 11 (autoVerde e pedVermelho) iniciando a simulação. Observe que desligamos os demais leds.

3.4.1. A função digitalWrite() Aciona um valor HIGH ou LOW em um pino digital. Este valor será de 5V para HIGH e 0V para LOW. Leia Referência Arduino - digitalWrite().

3.5. Alteramos o valor da variável ini, passando de 0 para 1. Isto significa que a simulação poderá ser iniciada.

3.6. Utilizando a condiciona if (ini ==1) iniciamos a simulação do semáforo.

3.6.1. Observe que utilizamos o operador de comparação (==) que é diferente do operador de atribuição (=). Leia Referência Arduino - Condicional IF.

Simulação de um semáforo completo - automóveis e pedestres:

3.7. Acendemos o led verde dos automóveis (autoVerde - pino 4) e o vermelho dos pedestres (pedVermelho - pino 11) usando a função digitalWrite().

3.8. Através da função delay(), o programa espera 5 segundos (5000 ms).

3.9. Após a pausa, desligamos o led verde dos automóveis (autoVerde - pino 4) e acendemos o led amarelo dos automóveis (autoAmarelo - pino3).

3.10. Criamos mais uma pausa de 3 segundos no amarelo. Para isso utilizamos novamente a função delay().

3.11. Após os 3 segundos de pausa, apagamos o led amarelo (autoAmarelo - pino3) e acendemos o led vermelho (autoVermelho - pino 2) dos automóveis. Ao mesmo tempo, apagamos o led vermelho dos pedestres (pedVermelho - pino 11) e ligamos o led verde (pedVerde - pino 12).

3.12. Criamos mais uma pausa de 5 segundos e apagamos o led verde dos pedestres (pedVerde - pino 12).

3.13. Após apagarmos o led verde dos pedestres criamos um loop para piscar o led 5 vezes com o objetivo de chamar atenção:

3.13.1. Para piscar o led usamos o expressão for (int x = 0; x <5; x++):

3.13.1.1 Declaramos a variável local x como int. Incrementamos a variável em +1, usando a expressão x++. Obs.: O incremento será utilizado após o primeiro bloco de códigos ser totalmente utilizado. Desta forma, o loop irá de x=0 até x<5, ou seja, x=0, x=1 e x=3, realizando cinco repetições:

3.13.1.1.1. Através da função digitalWrite(led, HIGH) informamos o Arduino para acender o led.

3.13.1.1.2. Através da função delay(250) pausamos o programa em 250 milissegundos.

3.13.1.1.3. Através da função digitalWrite(led, HIGH) informamos o Arduino para acender o led.

3.13.1.1.3. Através da função delay(250) pausamos o programa em 250 milissegundos.

3.14. Finalmente apagamos o led vermelho para os pedestres (pedVermelho - pino 11), reiniciando a simulação.

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

Comentários

×

Infomações do site / SEO








×

Adicionar Marcadores