Olá!
Sabemos que a função delay() gera uma pausa calculada na execução de uma programação, congelando o status da rotina durante este tempo. Por isso, ao usar o delay, não conseguimos executar nenhuma ação enquanto esta pausa é executada.
O delay é otimo para pequenos exemplos, como o blink:
(...)
void loop() {
digitalWrite(redLedPin, HIGH); //Liga o led vermelho
delay(1000); //Mantém o led ligado por 1 segundo
digitalWrite(redLedPin, LOW); //Desliga o led
delay(1000); //Mantém o led desligado por 1 segundo
}
O problema é quando precisamos executar outras ações enquanto o delay está acontecendo. Usando o exemplo acima, digamos que a gente queira piscar o led vermelho a cada 1 segundo e, a cada 300ms, piscar o led verde. Apesar de ser possível colocando uma série de delays, o problema fica mais complexo a cada nova instrução.
Para resolver este problema e termos mais autonomia na programação, podemos substituir o delay por outra técnica, que não trava a execução (loop). Para isso usaremos a função millis(). Esta função retorna o tempo em milissegundos desde quando o arduino foi ligado ou reiniciado. Desta forma, conseguimos verificar a quanto tempo nosso programa está em execução.
Sabendo o tempo total podemos, por exemplo, executar uma ação a cada 1 segundo sem travar o loop, basta para isso verificar se se passou 1 segundo desde a última execução. Este seria o modelo:
se (tempoAtual menos ultimoTempoGravado for maior que 1 segundo)
então (acendeOuApagaLed e salva ultimoTempoGravado como tempoAtual)
Veja o exemplo:
const int redLedPin = 13; //Pino onde está o LED vermelho
int redLedState = LOW; //Estado inicial do led
long previousMillis = 0; // Variável de controle do tempo
long redLedInterval = 1000; // Tempo em ms do intervalo a ser executado
(...)
void loop()
{
unsigned long currentMillis = millis(); //Tempo atual em ms
//Lógica de verificação do tempo
if (currentMillis - previousMillis > redLedInterval) {
previousMillis = currentMillis; // Salva o tempo atual
//E aqui muda o estado do led
//verificando como ele estava anteriormente
if (redLedState == LOW) {
redLedState = HIGH;
} else {
redLedState = LOW;
}
digitalWrite(redLedPin, redLedState);
}
}
agora ficou fácil de realizar qualquer execução sem precisar travar o loop.
E vocês, utilizam outras técnicas?