Arduino de principiante a utilizador avançado: Aula 2

Apresento-vos a segunda aula do curso “Arduino de principiante a utilizador avançado” criado pelo Make Bits, se só agora começas-te a seguir o nosso curso recomendo que leias a aula 1 para que não percas o fio a meada.
Na aula 1 falámos de outputs simples, vimos um exemplo de como fazer um led piscar a uma dada frequência. Hoje vamos continuar a trabalhar com leds portanto se ainda tens o circuito da aula 1 montado, não desmontes iremos utilizá-lo. O objetivo da aula de hoje é abordar os digital inputs para tal vamos ligar e desligar um led através de um pushbutton e deixar o led ligado quando retirarmos o dedo do botão.
Fazer com que o led pisca-se foi fácil (aula 1), agora nesta aula vamos acrescentar um nivel na dificuldade. Continuamos com exemplos bem simples, em vez de ser um delay a controlar o nosso led porque é que não somos nós próprios? Para esta aula irás necessitar apenas de dois componentes novos, uma resistência de 10kohm e um pushbutton. E sim também irás precisar de alguns fios para realizares as ligações mas isso já deves ter ai por casa se não procura alguns em equipamentos velhos.
Caso não saibas um pushbutton é um pequeno dispositivo que no seu interior tem uma placa metálica que quando é pressionada fecha o circuito e deixa a electricidade passar, assim o Arduino consegue ler os valores enviados pelo botão “HIGH e LOW” e dar instruções ao led para ligar ou desligar consoante o valor lido.
Instalação do circuito:

Passemos à montagem do circuito, na tua breadboard deves colocar o led ligado com a respetiva resistência a um pino digital do Arduino neste caso utilizámos o pino 8. Para ligares corretamente o pushbutton ao teu Arduino deves colocar uma resistência de 10kohm para servir como divisor de tensão de acordo com o que está descrito nos esquemas em cima e em baixo.

Arrumámos a parte das instalações e passemos então à programação que sem ela bem podes clicar milhentas vezes no botão que o led não irá acender.
Programar o Arduino:
O seguinte código irá ligar o led enquanto o botão estiver premido, mas assim que tirares o dedo o led apagar-se-à novamente.
int led=8; //led no pino 8 int botao=7;//butão no pino 7 int var=0; void setup() { pinMode(led,OUTPUT); pinMode(botao,INPUT); } void loop() { var=digitalRead(butao); //ler o valor enviado pelo botão "HIGH" ou "LOW" if (var == HIGH) { digitalWrite(led,HIGH); } else { digitalWrite(led,LOW); } }
Esta primeira parte é bem simples, só precisamos de ler o valor enviado pelo botão e casa seja “HIGH” ou led acende, caso seja “LOW” o led apaga. Porém ainda não chegamos ao objetivo desta aula. Com este exemplo o led apagar-se-à assim que retirares o dedo do botão. Para chegarmos ao nosso objetivo temos de definir uma variável para guardar o valor e desta forma o led continuará aceso.
int led=8; // led no pino 8 int botao=7; // botão no pino 7 int var=0; // valor instantaneo enviado pelo botão int var2=0; // valor guardado int estado=0; // guarda o valor 0 ou 1 (HIGH ou LOW) void setup() { pinMode(led,OUTPUT); pinMode(botao,INPUT); } void loop() { var=digitalRead(botao); // ler o valor enviado pelo botão "HIGH" ou "LOW" if ((var == HIGH) && (var2 == LOW)) { estado = 1 - estado; } var2=var; if (estado == 1) { digitalWrite(led, HIGH); // liga o led } else { digitalWrite(led, LOW); // desliga o led } }
Os pushbuttons são dispositivos muito simples, como já expliquei em cima, e por vezes podem gerar sinais errados de curtos milisegundos e induzir o Arduino em erro, a isto chama-se bouncing. Corrigir este erro é muito fácil e chama-se de-bouncing, apenas temos de adicionar um delay, por exemplo de 20ms assim o arduino só envia a instrução para ligar o led se o butão for premido no minimo 20ms.
Então este será o nosso código final:
int led=8; // led no pino 8 int botao=7; // botão no pino 7 int var=0; // valor instantaneo enviado pelo botão int var2=0; // valor guardado int estado=0; // guarda o valor 0 ou 1 (HIGH ou LOW) void setup() { pinMode(led,OUTPUT); pinMode(botao,INPUT); } void loop() { var=digitalRead(botao); // ler o valor enviado pelo botão "HIGH" ou "LOW" if ((var == HIGH) && (var2 == LOW)) { estado = 1 - estado; delay(20); // de-bouncing } var2=var; if (estado == 1) { digitalWrite(led, HIGH); // liga o led } else { digitalWrite(led, LOW); // desliga o led } }
Ficheiros anexos:
Arduino de principiante a utilizador Avançado: Aula 2 (1,3 MiB, 786 hits)
Agora é praticares até a próxima aula para que nos possas acompanhar sem perderes o rumo ao curso para ajudar oferecemos-te a possibilidade de receber as doze aulas comodamente no teu email e ainda o ebook com toda a matéria organizada em primeira mão!



Bom artigo.
Para quando um tutorial sobre como programar o arduino para funcionar com o QTR-8RC?
Em breve, pode ser que utilizemos esse sensor neste curso.
Cumprimentos
Eu faria diferente…
void loop()
{
if(digitalRead(botao))
{
while(digitalRead(botao))
{
delay(20); //Este delay dentro da while faz o debouncing, enquanto o botão estiver pressionado aguarda, quando soltar realiza a função na sequência do programa.
}
digitalWrite(led,!digitalRead(led)); //Escreve no led o contrário do que for lido nele. (! significa inverso)
}
}
Ola Victor Hugo, o que nós pretendemos aqui é o botão continuar ligado mesmo que tiremos o dedo do botão. E que ele apague quando carreguemos outra vez.
Cumprimentos
Vitor Hugo,
seu programa tem um problema, o led inicia aceso.
Para resolver acrescentei um: digitalWrite(led,LOW); em void setup. Ficou assim:
*obs: estou usando o PINGUINO 18f2550
int led=12; // led no pino 12
int botao=10; // botão no pino 10
void setup()
{
pinMode(led,OUTPUT);
pinMode(botao,INPUT);
digitalWrite(led,LOW); //inicia o led apagado
}
void loop()
{
if(digitalRead(botao))
{
while(digitalRead(botao))
{
delay(20); //de-bouncing
}
digitalWrite(led,!digitalRead(led)); //Escreve no led o contrário do que for lido nele.
}
}
Eu não percebo uma coisa, a resistência de 10k Ohm serve exactamente para quê? por que é que é necessário um divisor de tensão?
Cumprimentos
A resistência pull-up serve para o Arduino detectar o on/off do pushbutton e para a porta do digital read nao queimar. Visto que o digitalread so deteta quebra na tensão é necessário o botão estar ligado ao gnd e ao vcc.
Cumprimentos
Digite o texto aqui!
Pessoal,
Acesse o site da EMPRETECNET, eles fabricam um KIT com uma placa compatível com arduino duemilanove, uma placa de rele, de potenciômetro, de sensor de luz, de sensor de luminosidade, de buzzer, de botão e demais componentes que podem ser realizados vários experimentos sem a necessidade de solda. Qualidade excelente!!
como é que meto mais um botao?