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.
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.
Figura 1 - Esquema elaborado com Fritzing |
Figura 2 - Minha montagem |
Figura 3 - Minha montagem |
Figura 4 - Minha montagem |
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 !
EmoticonEmoticon