Arduino: Temporizadores e Interrupcoes: mudanças entre as edições

De Wiki Cursos IFPR Foz
Ir para navegaçãoIr para pesquisar
Sem resumo de edição
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 0.2794 mm de chuva dispara uma rotina de '''interrupção''' para incrementar o total de mm de chuva.
*'''Pluviômetro''' -> Emite um pulso cada 0.2794 mm de chuva dispara uma rotina de '''interrupção''' (<code>AttachInterrupt()</code>) 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.
*'''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''' (<code>pulseIn()</code>) 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 21h53min 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) [3] [4] define a entrada como INPUT_PULLUP, isto é, uma entrada com resistor interno pull-up, de forma que se estiver desconectado tem valor HIGH. Assim, quando levamos a LOW através de uma chave a entrada a interrupção é acionada na transição negativa do pino FALLING.
  • 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) [5].

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 rotina de interrupção (AttachInterrupt()) 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 (pulseIn()) 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)