Semáforos
Adaptação do site: http://www.makeuseof.com/tag/arduino-traffic-light-controller/
Vamos fazer um semáforo utilizando leds comandados por um Arduíno.
Além do Arduino Uno, é necessário o seguinte:
- 1 LED vermelho
- 1 LED amarelo
- 1 LED verde
- Uma placa de ensaio
- 3 Resistores adequadas aos LEDs (em princípio 220 Ohms)
- Condutores para as ligações
- Botão de pressão
- 1 resistência de valor elevado ( 10k )
Esquema

Aqui está um esquema muito simples – apenas três LEDs com com ligação às respetivas resistências que ligam a três diferentes pinos de entrada, os outros terminais dos LEDs são todos ligados ao GND.
Programação
Vamos começar por definir as variáveis para que possamos atender os LEDs, associando a cor de cada um (nome) ao respetivo Pin de saída:
int red = 13;
int yellow = 12;
int green = 11;
Em seguida, vamos adicionar a função de configuração, definimos os LEDs red (vermelho), yellow (amarelo) e green (verde) como ligados no modo de saída (Output). Como criamos as variáveis para representar os números de pinos, já podemos referir-nos aos pinos pelos respetivos nomes em vez dos números.
void setup(){
pinMode(red,OUTPUT);
pinMode(yellow,OUTPUT);
pinMode(green,OUTPUT);
}
Estes são os passos mais fáceis. A parte mais difícil é a programação real de um semáforo. Para isso vamos criar uma função diferente para cada mudança de cor, mais á frente é possível perceber porque motivo se opta por esta solução.
Quando se começar a programação, o código em si é muito simples, difícil é descobrir os detalhes da lógica de programação. O segredo para ser um bom programador é ser capaz de olhar para qualquer processo, e dividi-lo em etapas fundamentais.
void loop(){
changeLights();
delay(15000);
}
void changeLights(){
// por 3 segundos o LED green (verde) está ligado e o yellow (amarelo) desligado
digitalWrite(green,HIGH);
digitalWrite(yellow,LOW);
delay(3000);
// durante 5 segundos o LED yellow (amarelo) fica desligado e o red (vermelho), ligado
digitalWrite(yellow,LOW);
digitalWrite(red,HIGH);
delay(5000);
// O red (vermelho) e o yellow (amarelo) ficam ligados por 2 segundos ( o red (vermelho) ja estava ligado)
digitalWrite(yellow,HIGH);
delay(2000);
// Desliga o red (vermelho) e o yellow (amarelo), enquanto o green (verde) liga
digitalWrite(yellow,LOW);
digitalWrite(red,LOW);
digitalWrite(green,HIGH);
}
Agora é só carregar o programa e executar o esquema. Deverá ter um semáforo a trabalho que muda a cada 15 segundos. No entanto esta situação é um pouco básico agora, vamos adicionar um botão para os piões possam colocar o LED vermelho sempre que quiserem. Para esta situação utiliza o esquema do circuito atualizado.
Verifique que o botão de pressão está ligado a uma resistência de 10k, pode parecer um pouco estranho mas a explicação será feita mais à frente.
A função do botão de pressão é o de colocar o sinal LOW (0) no Pin 0, mas se for pressionado o sinal neste Pin fica High (1).
Agora, na parte de loop do programa, antes de mudar as luzes a cada 15 segundos, vamos ler o estado do botão de pressão e só mudar as luzes quando ele é ativado.
Começa-se por adicionar as novas variáveis no início da aplicação:
int button = 2; // switch is on pin 2
int buttonValue = 0; // switch defaults to 0 or LOW
Agora, na função de configuração, adiciona-se uma nova linha para declarar o botão de pressão como entrada. Também se acrescentou uma linha para o inicio dos semáforos no estádo verde (green). Sem esta configuração inicial, estariam desligados, até que a primeira vez a função changeLights ( ) fosse iniciada.
pinMode(switch,INPUT);
digitalWrite(green,HIGH);
Troque toda a função de loop para a seguinte:
void loop(){
// read the value of the switch
switchValue = digitalRead(button);
// if the switch is HIGH, ie. pushed down – change the lights!
if (buttonValue == HIGH){
changeLights();
delay(15000); // wait for 15 seconds
}
}
Ao esperar dentro da instrução “se” por 15 segundos , também asseguramos que os semáforos não pode mudar , pelo menos, durante esse tempo. Assim que terminam os 15 segundo reinicializa-se o ciclo (loop). Em cada reinício do loop, vamos ler novamente o estado do botão, mas se não for pressionada, o ” if” nunca é ativao e as luzes nunca mudam, e o loop simplesmente volta a reiniciar.

