Arduino: Temporizadores e Interrupcoes: mudanças entre as edições
Linha 84: | Linha 84: | ||
===Laboratório 3: Blink/Button=== | ===Laboratório 3: Blink/Button=== | ||
Construa um programa para '''acionar dois leds''', um piscando em uma '''frequência constante''' ('''Blink''') e outro que pisque quando uma '''chave for acionada''' ('''Button'''). | Construa um programa para '''acionar dois leds''', um piscando em uma '''frequência constante''' ('''Blink''') e outro que pisque quando uma '''chave for acionada''' ('''Button'''). | ||
A chave pode ser substituída, por exemplo, por um '''sensor de movimento''' do tipo '''PIR'''. Neste caso, quando um movimento for detectado, o programa é interrompido e uma '''rotina de tratamento de interrupção''' é chamada. | |||
[[Arquivo:PIR-motion-sensor.jpg|200px]] | |||
==Referências== | ==Referências== |
Edição das 17h24min de 9 de novembro de 2021
Arduíno: Temporizadores e Interrupções
Temporizadores
O Arduíno possui várias funções que permitem implementar temporizadores e realizar medidas de tempo.
- Funções de pausa temporizada no programa
delay(ms)
- Pausa o programa por uma quantidade de tempo especificada como parâmetro em milissegundos. (onde 1000 milissegundos é 1 segundo).
delayMicroseconds(us)
- Equivalente ao
delay()
com tempo especificado microssegundos.
- Funções para medidas de tempo
millis()
- Retorna o número de milissegundos decorridos desde que a placa Arduíno foi iniciada com o programa atual.
micros()
- Equivalente ao
millis()
retornando o número de microssegundos.
Laboratório 1: Blink sem pausar o programa em execução
Uma aplicação interessante da função millis()
é poder realizar temporizações sem pausar o programa em execução.
- Programa Blink sem pausar programa [1]:
/*
* Blink sem delay();
*/
const int ledPin = 13; // pino do led
int ledState = LOW; // estado do led
unsigned long previousMillis = 0; // tempo anterior no qual o led foi chaveado
const long interval = 1000; // intervalo para piscar led (milliseconds)
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // salva o tempo atual
ledState = !ledState; // chaveia o led
digitalWrite(ledPin, ledState); // atualiza estado do led
}
}
- Carregar e testar o programa.
Interrupções
As interrupções permitem detectar mudanças em uma entrada sem a necessidade de checar constantemente seu estado. Quando uma interrupção é detectada uma rotina de tratamento de interrupção é chamada.
No Arduíno UNO as interrupções externas são acionadas pelo comando AttachInterrupt()
e são acionadas pelo pino 2 (interrupção 0) e/ou pino 3 (interrupção 1).
No Arduíno as interrupções externas podem ser acionadas de quatro diferentes modos:
- LOW: Quando o pino está baixo;
- CHANGE: Quando o valor do pino muda;
- RISING: Quando o valor do pino sobe de baixo para alto;
- FALLING: Quando o valor do pino desce de alto para baixo;
A cada fechamento de contados ocasionado pelos sensores uma rotina de tratamento de interrupção será acionada.
Laboratório 2: Blink por interrupção
- Programa Blink acionado por interrupção [2]:
const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, FALLING);
}
void loop() {
digitalWrite(ledPin, state);
}
void blink() {
state = !state;
}
- Carregar e testar o programa.
- Detalhe do acionamento da interrupção
- A função
pinMode(interruptPin, INPUT_PULLUP)
define o pino comoINPUT_PULLUP
, isto é, uma entrada com resistor interno pull-up, de forma que se estiver desconectado tem valorHIGH
. Assim, quando levamos aLOW
através de uma chave a entrada a interrupção é acionada na transição negativa do pinoFALLING
. - Em caso de múltiplas transições no led, pode estar ocorrendo trepidações na chave (bounce).
Laboratório 3: Blink/Button
Construa um programa para acionar dois leds, um piscando em uma frequência constante (Blink) e outro que pisque quando uma chave for acionada (Button).
A chave pode ser substituída, por exemplo, por um sensor de movimento do tipo PIR. Neste caso, quando um movimento for detectado, o programa é interrompido e uma rotina de tratamento de interrupção é chamada.
Referências
Evandro.cantu (discussão) 09h51min de 9 de novembro de 2021 (-03)