Semáforos

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


semaf_01

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.

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

Anúncios