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 ser muito útil. Iremos montar um efeito sequencial de LEDs e interromper o programa de dois modos. Devido a isso este tutorial estará dividido em duas partes (Parte 1 e 2). No primeiro programa a interrupção retornará sempre ao inicio do loop, ou seja, a sequência dos LEDs sempre será reiniciada quando o botão for pressionado novamente. // 07 Programa Arduino Interrupção parte 1 volatile int state = HIGH; int ledArray[] = {8, 9, 10, 11, 12}; int count = 0; int timer = 75; int pause = 500; void setup(){ for(count=0; count<5; count++){ pinMode(ledArray[count], OUTPUT); } attachInterrupt(0, ledOnOff, FALLING); } void loop(){ if(state){ for(count=0; count<5; count++){ digitalWrite(ledArray[count], HIGH); delay(timer); } delay(pause); for(count=0; count<5; count++){ digitalWrite(ledArray[count], LOW); delay(timer); } delay(pause); } } void ledOnOff(){ static unsigned long lastMillis = 0; unsigned long newMillis = millis(); if(newMillis - lastMillis<50){ } else{ state = !state; lastMillis = newMillis; } }
Este programa inicia-se declarando a variável state como sendo volatile. Declarar uma variável volatile significa que a variável pode ser alterada ao longo do programa. A aplicação mais comum desta variável é em interrupções como no nosso caso. No arduino uno, há duas interrupções, uma interrupção feita através da porta digital 2 chamada de interrupção 0 e na porta 3 chamada de interrupção 1, diferente do uno o arduino mega, tem quatro interrupções adicionais: a interrupção 2 ligada ao pino digital 21, a interrupção 3 ligada ao pino 20, a interrupção 4 é ligada ao pino digital 19 e a interrupção 5 é ligada ao pino 18. Em seguida temos a função attachInterrupt(0, ledOnOff, RISING), ela utiliza três argumentos, 0 significa a interrupção que estamos utilizando, no nosso caso a interrupção 0 ligada a porta 2, podemos também utilizar a interrupção 1, bastando alterá-la na função e a conexão no hardware para a porta 3. Depois chamamos a função ledOnOff que não retorna nenhum dado, ela evita um erro chamado de bounce (ou flutuação), que provoca o falso acionamento do botão. Logo após temos o modo de interrupção, que pode ser de quatro tipos, LOW que interrompe sempre que o pino estiver em baixo; CHANGE interrompe sempre que o pino muda de valor; RISING interrompe sempre que o pino muda de LOW para HIGH; e FALLING interrompe sempre que o pino altera de HIGH para LOW. Atente-se ao modo de interrupção deste programa. A função void ledOnOff() como comentei anteriormente evita o falso acionamento do botão, a variável lastMillis é declarada como sendo uma variável do tipo static, essa forma faz com que a variável mantenha seu valor durante a chamada da função. A função millis() armazena o tempo transcorrido desde o inicio do programa. Observe a comparação da diferença do tempo em lastMillis e newMillis que caso seja menor do que 50 ms não acontece nada, evitando o bounce. Mas se a diferença for maior, a variável state que armazena LOW muda para HIGH, isso porque temos uma operação lógica sendo efetuada, ou seja, o comando ! significa inversão, ou seja, o inverso de HIGH é LOW e vice-versa. Quando o botão for pressionado e o tempo de acionamento for maior do que 50 ms o programa instantaneamente será interrompido. Se o botão for pressionado outra vez o programa reinicia e volta a funcionar. Uma interrupção é considerado por muitos uma técnica avançada, mas se for programada de forma correta não proporcionará possíveis erros inesperados. Outra constatação é que não é possível utilizar a função delay() dentro de uma rotina de interupção. Por fim, acredito que temos base teórica o suficiente desde os tutoriais passados para fazermos análises mais rápidas dos códigos que aqui apresento. Para montar este programa necessitamos dos seguintes componentes:
Arduino Uno;
5 LEDs;
5 resistores de 150 Ohm;
1 botão de pressão;
Fios ou jumpers.
As conexões que devemos fazer estão na imagem abaixo.
Figura 1 - Esquema elaborado com Fritzing
O esquema ainda está meio confuso, mas já estou pegando jeito com o Fritzing (depois escrevo um artigo apresentando-o). Continuando, abaixo apresento algumas imagens da minha montagem.
Figura 2 - Minha montagem
Figura 3 - Minha montagem
Figura 4 - Minha montagem
Depois de feito a montagem do hardware, não pode faltar o vídeo.
Os programas também podem ser baixados, basta clicar aqui e escolher.
Se você gostou, ajude o blog Eletrônica de Garagem compartilhando em suas redes sociais ou curtindo nossa fan page !
- Arduino - Programa 08: Led Pulsante
Neste tutorial será apresentado um efeito pulsante com LED. Para isso faremos uso de uma saída PWM (Pulse Width Modulation). Figura 1 - LED PulsanteEste programa traz uma aplicação com iluminação, ou seja, se antes o LED era aceso e apagado,...
- 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 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...
- 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...