Arduino - Programa 04: Semáforo Interativo com LED
Eletrônica

Arduino - Programa 04: Semáforo Interativo com LED


Continuando os tutoriais de arduino, dessa vez trago o código aprimorado do semáforo anterior. A peculiaridade deste código está no fato do usuário poder interagir com o arduino.
Mas, o que estamos a aprender de verdade, é como fazer a leitura de um botão e os tipos de dados e variáveis. Então chega de blá blá, e vamos ao código.


// 04 Semáforo interativo
int carRed = 12; // estabelece o semáforo para carros
int carYellow = 11;
int carGreen = 10;
int pedRed = 9; // estabelece o semáforo para pedestres
int pedGreen = 8;
int button = 2; // pino do botão
int crossTime = 5000; // tempo para que os pedestres atravessem
unsigned long changeTime; // tempo desde que o botão foi pressionado
void setup() {
pinMode(carRed, OUTPUT);
pinMode(carYellow, OUTPUT);
pinMode(carGreen, OUTPUT);
pinMode(pedRed, OUTPUT);
pinMode(pedGreen, OUTPUT);
pinMode(button, INPUT); // botão no pino 2
// acende a luz verde
digitalWrite(carGreen, HIGH);
digitalWrite(pedRed, HIGH);
}
void loop() {
int state = digitalRead(button);
/* verifica se o botão foi pressionado e se transcorreram 5 segundos desde a última vez que
isso ocorreu */
if (state == HIGH && (millis() - changeTime) > 5000) {
delay(1000);
// Chama a função para alterar as luzes
changeLights();
}
}
void changeLights() {
digitalWrite(carGreen, LOW); // apaga o verde
digitalWrite(carYellow, HIGH); // acende o amarelo
delay(2000); // espera 2 segundos
digitalWrite(carYellow, LOW); // apaga o amarelo
digitalWrite(carRed, HIGH); // acende o vermelho
delay(1000); // espera 1 segundo, por segurança
digitalWrite(pedRed, LOW); // apaga o vermelho dos pedestres
digitalWrite(pedGreen, HIGH); // acende o verde dos pedestres
delay(crossTime); // espera por um intervalo de tempo predefinido
// pisca o verde dos pedestres
for (int x=0; x<10; x++) {
digitalWrite(pedGreen, HIGH);
delay(250);
digitalWrite(pedGreen, LOW);
delay(250);
}
// acende o vermelho dos pedestres
digitalWrite(pedRed, HIGH);
delay(500);
digitalWrite(carYellow, HIGH); // acende o amarelo
digitalWrite(carRed, LOW); // apaga o vermelho
delay(1000);
digitalWrite(carGreen, HIGH); // acende o verde
digitalWrite(carYellow, LOW); // apaga o amarelo
// registra o tempo desde a última alteração no semáforo
changeTime = millis();
// depois retorna para o loop principal do programa
}

Como viram acima o código não está completamente comentado, visto que, pelo que já foi apresentado nos tutoriais anteriores, temos condições de olhar e ver o que cada comando no código está executando.Analisando o código, logo temos alguns elementos desconhecidos, e que serão explicados com este tutorial, alguns conceitos que irei descrever aqui poderão ficar vagos, mas em caso de dúvidas deixe seu comentário.

Continuando, a primeira novidade que temos é o tipo de dado "long", até agora só trabalhamos com o tipo de dado inteiro (int). Mas quando falamos em microcontroladores, que possuem pouca memória interna, o tipo e o "tamanho" dos dados que trabalhamos no programa fazem total diferença entre um programa deselegante e lento,  e um programa bem estruturado e ágil. Com o passar do tempo,  cada vez mais seremos capazes de desenvolver programas maiores e mais robustos, o que implica em maior uso da memória, e é ai que importante saber quais os tipos e quanto de memória uma dada variável ocupa.


No programa estamos declarando uma variável do tipo "long", este tipo de variável pode armazenar valores entre -2.137.483.648 e 2.147.483.647. Mas, porém no código foi especificado "unsigned long", o que significa para o arduino que a variável não armazenará números negativos, sendo assim o intervalo para o tipo "long", passa a ir de 0 a 4.294.967.295. Mas, e ai, o que esses números querem dizer ? Isso significa que a nossa variável será capaz de armazenar números racionais, localizados entre o intervalo numérico de 0 a 4.294.967.295. O autor demonstra, o porque de utilizarmos "long" ao invés de "int", ele diz que, uma variável "int" seria capaz de armazenar um intervalo máximo de 32 segundos, sabendo que é improvável um pedestre atrevessar a rua a cada 32 segundos, por isso utilizamos "unsigned long", o que permite trabalharmos com um intervalo de tempo maior. O livro traz alguns números para ajudar-nos a consolidar a ideia.

Logo, a variável é capaz de armazenar os dados sem "estourar" (termo utilizado quando uma variável excede seu limite) por 49 dias, o que é inevitável que o botão para pedestres seja apertado ao menos uma vez a cada 49 dias. Abaixo temos uma tabela com os tipos de variáveis e o espaço ocupado em memória.


Tabela 1 - Tipos de dados.

Acima podemos conferir os tipos e o tamanho que os dados ocupam na memória do arduino.

Prosseguindo no código, há mais dois comandos novos que vamos conhecer, o "digitalRead" e o "if". O comando digitalRead é bem simples, o que ele faz é ler o que está na porta digital chamada entre os parenteses, este valor é armazenado na variável state como inteiro. Para apresentar o próximo comando, vou apresentar os operadores lógicos. Um operador lógico, é igual a um operador matemático, só que trabalhando em sinais digitais. Para quem não conhece sobre operadores lógicos clique aqui. Se você já é familiarizado com eletrônica digital, isto será mais fácil ainda. Para o arduino e algumas linguagem de programação, os operadores lógicos básicos são descritos abaixo.


Agora podemos iniciar com o "if", esse comando é chamado de condicional, note que em português "if" significa "se". O comando funcionará sempre que a condição estabelecida for verdadeira. No programa acima o if funcionará sempre que, a variável state for HIGH e a diferença do tempo passado e o tempo definido for maior que 5 segundos. A condição if pode ser aplicada a diversos programas, basta haver a necessidade.
O programa acima ainda destaca uma função chamada de changeLights, ela é criada para realizar uma sub-rotina dentro do programa, é interessante observar neste caso que, se o comando if for falso, em nenhum momento a função changeLights é executada. Como eu utilizo o livro Arduino Básico para me ajudar, mais a frente comentarei de como criar funções. Basicamente o tutorial de hoje termina por aqui, pois a maioria dos comandos acima já foram apresentados nos tutoriais anteriores.

Uma observação importante que faço, é que o código acima é o mesmo do livro, só que, ao fazer os testes em minha bancada, vi que tinha algo errado com o LED verde dos pedestres, ele não acendia muito bem. Então precisei modificar o código e inseri apenas um delay dentro do if antes de executar a função changeLight. O que acontece é que o código evitará erro caso o botão seja pressionado mais de uma vez, e aguardará um determinado tempo para permitir a passagem do restante dos carros. Enfim vamos a melhor parte, a montagem do hardware.


Para este exemplo os seguintes componentes são necessários.

  1. 1 arduino;
  2. 1 protoboard (opcional);
  3. 2 LED verde;
  4. 2 LED vermelho;
  5. 1 LED amarelo;
  6. 5 resistores de 300 Ohm;
  7. 1 resistor de 1K Ohm;
  8. 1 botão do tipo NA (normalmente aberto);
  9. Fios e jumpers;
Figura 1 - Foto dos componentes utilizados.
Abaixo apresento o esquema para montar a parte de hardware.

Figura 2 - Esquema de hardware do programa.

Para ligar o botão, utilize o resistor de 1k Ohm, abaixo a imagem do esquema de ligação do botão.

Figura 3 - Esquema de ligação do botão.
E para finalizar algumas fotos da minha montagem.

Figura 4 - Minha montagem.
Figura 5 - Minha montagem.
Para baixar este e mais programas clique aqui.

Como não pode faltar,  um vídeo demonstrando o funcionamento.



Bom, espero que tenham gostado, qualquer dúvida, deixe seu comentário. Se inscreva no nosso canal do YouTube e fique por dentro das novidades ! 
Até o próximo tutorial !



loading...

- Arduino - Programa 07: Interrupção (parte 2)
Prosseguindo o tutorial 7 vou apresentar o segundo modo de interrupção. Este modo permite que ao interrompermos o programa e acionarmos o botão novamente, o hardware inicie de onde parou, ou seja, é realizado uma pausa no programa. Para este programa...

- Arduino - Programa 07: Interrupção (parte 1)
No tutorial de hoje vou falar sobre a interrupção do arduino. Esta função permite interromper uma tarefa que esteja sendo executada pelo arduino a qualquer momento. Uma situação do tipo pode parecer sem lógica, mas em determinado problema pode...

- Arduino - Programa 06: Efeito Sequencial Variável Com Led
Olá pessoal, vamos dar continuidade aos tutoriais de arduino, desta vez trago o código do efeito sequencial com LED, porém há uma característica muito interessante nesse código. Este código é o mesmo do programa anterior, só que agora podemos...

- Arduino - Programa 02: Sinal De S.o.s
Bom pessoal dando continuidade aos tutoriais de arduino trago dessa vez um programa de sinal de código morse. Para quem não sabe o código morse é um sistema de representação de letras, números e sinais de pontuação através de um sinal codificado...

- Arduino - Programa 01: Acendendo Um Led
Bom pessoal como prometido estarei iniciando hoje o primeiro tutorial de arduino, o primeiro programa me pareceu bem simples, acendendo um LED.Entretanto apesar de ser um programa bem pequeno ele não pode ser deixado de lado. Acho melhor mostrar o programa...



Eletrônica








.