Um semáforo para pedestres
Na aula passada vimos o uso de protoboards que permitem adicionar vários componentes ao projeto dispensando o uso de solda. Além disso, como exemplo, fizemos um conjunto de dois semáforos que trabalhavam em sincronia de tempo.
Outro exemplo clássico mostrados nos cursos básicos de Arduino é o que vamos ver hoje: Um semáforo para pedestres. Basicamente utilizaremos o últimos projeto da aula passada com algumas modificações.
Tipos de semáforos
Você já deve ter utilizado um semáforo para pedestres para atravessar alguma rua ou avenida. Muitos deles são automáticos, acionando o vermelho para os motoristas e o verde para pedestres, independente da presença de alguém para atravessar a via.
Para esse tipo automático poderíamos usar o projeto passado e apenas remover o botão amarelo do segundo semáforo que ele estaria pronto.
No entanto, existem situações em vias de grande movimento onde o semáforo para veículos fica o tempo todo em verde, ficando vermelho APENAS quando um transeunte aperta um botão para atravessar.
É desses semáforos manuais que quero fazer hoje. Algo que mostre para o estudante como um botão pode interromper um procedimento, mesmo em sistemas sequenciais como na programação estruturada do framework Arduino.
Cabe esclarecer que na programação estruturada que vimos na maior parte dos cursos até aqui, as instruções são feitas em uma sequencia, linha por linha e não permitem um evento paralelo. Quando eu dou um delay(), por exemplo, toda a programação se interrompe enquanto estivermos naquele intervalo e nada será executado ou detectado no intervalo.
Oportunamente espero abordar nesse site em cursos futuros o uso de paralelismo que permite mais de um evento ou tarefa ao mesmo tempo.
Projeto de hoje
Tendo explicado o que faremos hoje preciso que você abra o projeto da última aula e salve uma cópia com o nome Framework Arduino Básico Aula 07: Semáforo Pedestre, para não estragar o projeto atual ou abra o nosso Link: https://wokwi.com/projects/412094021094529025 e salve uma cópia.
Montagem
![]() |
Layout para um semáforo de pedestres |
Depois de salvar preciso que você faça as seguintes alterações no semáforo2 que está a direita conforme a figura acima:
- Apague o led amarelo
- Mova o led vermelho para a posição antiga do led amarelo
- Altere o primeiro resistor que ficou sobrando de 330 Ω para 10 KΩ
- Mova esse resistor alterado conforme a figura acima, conectando o ao barramento GND, alinhando o com a trilha 26 da protoboard
- Puxe uma conexão do 5V da placa para o barramento + conforme a figura
- Adicione um push-button, rotacione para deixá-lo de pé e arraste o para a posição indicada na figura acima
- Repare que esse push-button conservará a conexão anterior com o pino 10
- Crie uma conexão entre o push-button e o barramento GND conforme e figura acima
Lembrando que para adicionar elementos usamos o botão + abaixo:
![]() |
Botão para adicionar componentes no Wokwi |
Lembrando também que para ajustar um resistor basta clicar nele e mudar o item value e item Unit:
![]() |
Ajustando o valor de resistência e orientação do resistor |
Alterando o Sketch
Não teremos mais o led amarelo do segundo farol, então sua variável será eliminada. O led vermelho2 mudou de pino, logo precisamos alterá-lo. Com a inclusão de um botão, precisamos criar uma variável para ele controlando o pino 10 e uma outra variável para armazenar o estado desse botão. Isso tudo na parte inicial do programa.
Na parte de setup(), o pinMode do pino 10 passará a ser INPUT por causa do botão ao invés de OUTPUT quando era led.
Em termos de instruções para o loop(), precisamos deixar o led verde do semáforo1 ligado a maior parte tempo, juntamente com o led vermelho do semaforo2 que agora cuida de pedestres. No entanto precisamos testar o estado do botão durante o looping para que, se ele estiver HIGH, o verde do semáforo 1 seja trocado pelo amarelo e posteriormente pelo vermelho. Só então o verde do pedestre será aceso. Não se esqueça do efeito bounce e do uso do delay() para "anulá-lo".
Em termos de tempo, para agilizar os testes, usarei o mesmo raciocínio adotado no projeto passado: 2 segundos para amarelo e 4 segundos para verde. Lembrando que na vida real, esses tempos seriam maiores.
Assim temos o seguinte código que você poderá copiar e colar no seu projeto. Teste bastante que conversaremos a respeito. Deixei as principais alterações em rosa:
- int vermelho=13;
- int amarelo=12;
- int verde=11;
- int vermelho2=9;
- int verde2=8;
- int botao=10;
- int estado=0;
- void setup() {
- pinMode(vermelho, OUTPUT);
- pinMode(amarelo, OUTPUT);
- pinMode(verde, OUTPUT);
- pinMode(vermelho2, OUTPUT);
- pinMode(verde2, OUTPUT);
- pinMode(botao, INPUT);
- }
- void loop() {
- digitalWrite(vermelho, LOW);
- digitalWrite(amarelo, LOW);
- digitalWrite(verde, HIGH);
- digitalWrite(vermelho2, HIGH);
- digitalWrite(verde2, LOW);
- delay(100);
- estado=digitalRead(botao);
- if (estado==HIGH){
- digitalWrite(amarelo, HIGH);
- digitalWrite(verde, LOW);
- delay(2000);
- digitalWrite(verde2, HIGH);
- digitalWrite(vermelho2, LOW);
- digitalWrite(vermelho, HIGH);
- digitalWrite(amarelo, LOW);
- delay(4000);
- }
- }
Dessa vez não vou compartilhar o link, mas explicarei o porque a seguir.
O que você achou do funcionamento desse Sketch? Ele realmente está adequado? Se você fosse o pedestre, como saberia que o farol abriria para os carros? Entendeu o meu questionamento? Está faltando algo para dizer ao pedestre que o tempo está acabando. Talvez se o o verde do pedestre piscasse algumas vezes já ajudaria.
É por isso que é importante uma fase de testes exaustivos em projetos antes de serem implementados para uso. Nas disciplinas de Engenharia de Software o estudante aprenderá que existem etapas a serem seguidas no desenvolvimento de um software. Aqui abordaremos, por enquanto, apenas a parte da codificação.
Melhorando o Sketch
Digamos que o verde para o pedestre piscará cinco vezes antes de ficar vermelho e o farol para os carros abrir. Como aqui não estamos trabalhando com o tempo correto da vida real, farei com que ele pisque em intervalos bem curtos. No entanto é importante que o tempo total do verde para pedestre permaneça igual.
Como o processo de apagar e acender será algo repetitivo, o ideal é utilizar uma instrução de laço controlada por um contador e aprendemos nos cursos anteriores que para essa situação utilizamos o for.
Como precisaremos contar o número de vezes com um contador, será necessário criar uma variável para essa função. Deixarei as alterações do Sketch em rosa para fascilitar.
Assim nosso Sketch poderia ficar desse jeito e você poderá copiar/colar no seu código ou pegar o nosso link que agora na versão final poderá ser compartilhado:
- int vermelho=13;
- int amarelo=12;
- int verde=11;
- int vermelho2=9;
- int verde2=8;
- int botao=10;
- int estado=0;
- int contador=0;
- void setup() {
- pinMode(vermelho, OUTPUT);
- pinMode(amarelo, OUTPUT);
- pinMode(verde, OUTPUT);
- pinMode(vermelho2, OUTPUT);
- pinMode(verde2, OUTPUT);
- pinMode(botao, INPUT);
- }
- void loop() {
- digitalWrite(vermelho, LOW);
- digitalWrite(amarelo, LOW);
- digitalWrite(verde, HIGH);
- digitalWrite(vermelho2, HIGH);
- digitalWrite(verde2, LOW);
- delay(100);
- estado=digitalRead(botao);
- if (estado==HIGH){
- digitalWrite(amarelo, HIGH);
- digitalWrite(verde, LOW);
- delay(2000);
- digitalWrite(verde2, HIGH);
- digitalWrite(vermelho2, LOW);
- digitalWrite(vermelho, HIGH);
- digitalWrite(amarelo, LOW);
- delay(2000);
- for (contador=1;contador<=5;contador++){
- digitalWrite(verde2, LOW);
- delay(200);
- digitalWrite(verde2, HIGH);
- delay(200);
- }
- }
- }
link do projeto: https://wokwi.com/projects/412209710054134785
Esperamos que as explicações tenham ficado claras. Aula que vem conheceremos um novo componente básico.
Referências
ARDUINO DOCS. Arduino Documentation. Disponível em: <https://docs.arduino.cc/> Acesso em 05 ago. 2024.
OLIVEIRA, Cláudio Luis Vieira et al. Aprenda Arduino: Uma abordagem prática. Duque de Caixas: Katzen Editora, 2018. 181p. Disponível em: <https://www.fatecjd.edu.br/fatecino/material/ebook-aprenda-arduino.pdf> Acesso em 05 ago. 2024.
OLIVEIRA, Cláudio Luis Vieira. Arduino Descomplicado - Como Elaborar Projetos de Eletrônica. São Paulo: Editora Érica, 2015. 287p.
TINKERCAD. Centro de Aprendizagem. Disponível em: <https://www.tinkercad.com/learn> Acesso em 05 ago. 2024.
WOKWI. Referência do wokwi-arduino-uno. Disponível em: <https://docs.arduino.cc/> Acesso em 05 ago. 2024.