Arduino - Programa 07: Interrupção (Parte 1)
Eletrônica

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 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 !

Até o próximo !



loading...

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



Eletrônica








.