Arduino: Temporizadores e Interrupcoes: mudanças entre as edições
Linha 99: | Linha 99: | ||
Veja os exemplos de aplicação no projeto da [[Estacao Meteorologica|'''Estação Meteorológica''']] desenvolvida no IFPR: | Veja os exemplos de aplicação no projeto da [[Estacao Meteorologica|'''Estação Meteorológica''']] desenvolvida no IFPR: | ||
*'''Pluviômetro''' -> Emite um pulso cada | *'''Pluviômetro''' -> Emite um pulso cada 0.2794 mm de chuva dispara uma '''interrupção''' para incrementar o total de mm de chuva. | ||
*'''Anemômetro''' -> A cada volta do anemômetro fecha um contato com a ajuda de um ímã. Para medir a velocidade do vento, mede-se o tempo entre cada pulso e realiza um cálculo onde se considera que, para uma velocidade do vento de 2.4 km/h, o interruptor fecha uma vez por segundo. | *'''Anemômetro''' -> A cada volta do anemômetro fecha um contato com a ajuda de um ímã. Para medir a velocidade do vento, '''mede-se o tempo médio entre cada pulso''' e realiza um cálculo onde se considera que, para uma velocidade do vento de 2.4 km/h, o interruptor fecha uma vez por segundo. | ||
==Referências== | ==Referências== |
Edição das 17h53min 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 a entrada 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.
Medida do período de um sinal periódico
pulseIn()
A função pulseIn()
permite ler um pulso em um pino. Por exemplo, se o valor do pino é HIGH, a função espera o pino ir de LOW para HIGH, inicia uma temporização, espera o pino ir novamente para LOW e pára a temporização. Retorna o comprimento do pulso em microssegundos (ou retorna 0 em caso de erro na leitura) [3].
Esta função permite implementar, por exemplo, medidores de velocidade que emitem um pulso a cada volta, como o caso do anemômetro de uma estação meteorológica, ou do velocímetro de uma bicicleta.
Exemplos de Aplicação
Veja os exemplos de aplicação no projeto da Estação Meteorológica desenvolvida no IFPR:
- Pluviômetro -> Emite um pulso cada 0.2794 mm de chuva dispara uma interrupção para incrementar o total de mm de chuva.
- Anemômetro -> A cada volta do anemômetro fecha um contato com a ajuda de um ímã. Para medir a velocidade do vento, mede-se o tempo médio entre cada pulso e realiza um cálculo onde se considera que, para uma velocidade do vento de 2.4 km/h, o interruptor fecha uma vez por segundo.
Referências
Evandro.cantu (discussão) 09h51min de 9 de novembro de 2021 (-03)