Básico - Projeto 06

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. (Obs.: Resistores superiores a 150 Ω poderão ser utilizados em LEDs de todas as cores para um circuito com tensão igual ou inferior a 5V).

Valores utilizados em nossos projetos: LEDs difusos ou de alto brilho: Vermelho, Laranja e Amarelo: 150 Ω | Led Verde e Azul: 100 Ω  (Usamos neste projeto resistores de 200 Ω)

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.

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:

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.

2. 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.

3. 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.

4. 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: