Vamos programar com o Arduino – #04: Tempos de Espera
Dando seguimento à serie de tutoriais “Vamos programar com o Arduino”, hoje iremos aprender algumas funções que nos permitem definir tempos de espera na nossa aplicação.
Como observamos no projeto anterior “Projeto Sensor de Temperatura” foi utilizada uma função chamada delay para que fosse possível efetuar leituras das temperaturas num determinado espaço de tempo.
Além da função delay existem outras funções e métodos que nos permitem efetuar tempos de espera ao longo dos nossos projetos, como a função millis, micros e interrupts. Ao longo deste tutorial iremos abordar somente as funções millis e micros, iremos falar dos interrupts mais tarde ao longo desta serie de tutorias.
Função delay() / delayMicroseconds()
As funções delay() ou delayMicroseconds() têm como objetivo parar o programa por um determinado período de tempo. Ambas funções são muito simples de programar bastando colocar como paramento o tempo em milissegundos caso usarmos a função delay() ou em microssegundos caso for a função delayMicroseconds().
Aidciona-se o seguinte código:
void loop() {
digitalWrite(led,HIGH); delay(2000); digitalWrite(led,LOW);
}
Com este pedaço de código é possível colocar um led a piscar num intervalo de 2000 milissegundos. Como podemos verificar são funções bastantes simples de se trabalhar, porem por vezes não são as mais indicadas. Como foi falado mais acima neste tutorial, estas funções têm como objetivo parar o nosso programa por um determinado período de tempo, em certas circunstâncias a função delay() não é a melhor opção.
Por exemplo quando queremos que o nosso Arduino esteja a fazer várias leituras de diferentes sensores, a função delay() como para o programa por completo poderá atrapalhar as outras leituras. Por essas razões esta função só convém ser usada em pequenos projetos.
Função millis() / micros()
A função millis() ou micros() funciona de uma maneira diferente da função delay(). Ambas as contam o tempo em milissegundos(millis) ou em microssegundos(micros) desde que o nosso programa começou.
Ao contrário da função delay() estas funções não para o nosso programa, o que se torna pertinente. Por outro lado, estas funções não são tão simples como a delay(). Como podemos supor, estas funções simplesmente iniciam um pequeno contador quando o nosso programa arranca, se colocarmos o millis() da mesma maneira que colocamos o delay() simplesmente não acontecerá nada.
Para demonstrar e explicar como podemos usar a função millis() / micros() iremos recordar o projeto do Sensor de Temperatura. Se olharmos para esse mesmo projeto verificamos que foi utilizado a função delay() para que nos fosse possível mostrar a temperatura num período de tempo. Desta vez iremos pegar no mesmo projeto mas alterar de maneira a usarmos a função millis() invés da função delay().
#include
void setup() {
Serial.begin(9600); pinMode(Sensor, INPUT); dht.begin(); }
void loop() {
if (millis() - tempoAnterior >= intervalo) { // Esta condição vai verificar sempre que o tempo percorrido pelo programa for igual ou superior ao intervalo definido é executada a leitura da temperatura tempoAnterior = millis(); // Atualiza a variável para a nova contagem de tempo, para que e condição acima seja sempre sincronizada temperatura = dht.readTemperature(); humidade = dht.readHumidity(); Serial.print("Temperatura: "); Serial.print(temperatura); Serial.print("c Humidade: "); Serial.print(humidade); Serial.println("%");
Como verificamos no programa acima, para usarmos a função millis() ou micros() invés da função delay() é preciso criar uma condição que verifica se o tempo percorrido do programa é maior ou igual ao intervalo de tempo definido.
Para que o tempo seja sempre sincronizado e atualizado é necessário guardar o tempo percorrido numa variável, neste caso a variável tem como nome tempoAnterior.
Estas funções apresentadas são aquelas que podemos usar no Arduíno. Como podemos verificar neste tutorial a melhor maneira de efecturar um tempo de espera será com a função millis() / micros(). Além destas funções podemos, podemos substituir estas funções por Interrupts,o que na maioria dos casos é a opção mais pertinente, mas é conteúdo para ser abordado num outro tutorial.
Este artigo tem mais de um ano
Viva
Refaz lá isso com interrupts que o delay é uma pessima prática. Forte abraço.
E conteúdo para o próximo tutoria 😉
Tenho um arduino ali de lado para brincar quando entrar de ferias, pelo que este assunto me interessa, porque diz que o delay é má prática?
Por os motivos que estão referidos no artigo. É importante saber o que faz o delay mas usa-lo por vezes não é boa ideia. É preferível mesmo em pequenos projetos começar de logo a trabalhar com o millis ou Interrupts( o que iremos abordar mais tarde)
Para uma fase introdutória à programação no Arduino a função delay é sim uma boa prática. Como vejo estes artigos como uma ferramenta de aprendizagem para quem está a entrar no mundo do Arduino não vejo qualquer problema na utilização da função delay. A meu ver não faz qualquer sentido, por exemplo, começar pelas interrupções.
Basta ler os livros que já existem no mercado relacionados com introdução à programação para Arduino para constatar o que escrevi acima. A título de curiosidade, o primeiro projeto sugerido pelo site do Arduino (e que vem pré-carregado em todos os novos Arduinos) chama-se “Blink”. E neste primeiro projecto dá-se ênfase precisamente à função delay.
https://www.arduino.cc/en/Tutorial/Blink
Geeks aproveitem o sol que está um espectaculo no centro e sul do pais..ja no Porto hoje estão -6!
Como pôr a fazer leitura a horas predefinidas
Na minha opinião acho que não dá, tens que adquerir o shild clock e ligar ao arduino.
Usar um RTC (Real Time Clock), tal como sugerido pelo MG é talvez a opção mais fácil de implementar. http://playground.arduino.cc/Main/DS1302
Mas também podes programar um relógio interno no Arduino usando os timers do microcontrolador (atmega328p). Feito isto, sempre que ligas o Arduino acertas o relógio e está feito.
Pelo que estive a ver há modelos de Arduinos mais recentes que já têm RTC integrado. https://www.arduino.cc/en/Reference/RTC
Como ainda tenho os conhecimentos básicos de programação em c ainda não domino completamente a programação para Arduino . Gostaria de saber se possível programar por funções . Ou qual o melhor método para simplificar o código?
fiz contar de 0a9 com um botao e 9a0 com outro botao agora preciso pular do 9 para o 0 e do 0para 9 usando a funçao if alguem sabe