Programação sem delay(), usando millis()

Fonte: Wikiversidade

Sistemas e Aplicações Digitais (Lógica e Programação) Robótica

Um programa Blink que pisca um LED pode ser usado para exemplificar o problema de uso do comando delay.

O comando delay deixa o microcontrolador "dormindo" sem fazer nada, não executa comandos e nem verifica se um sensor está sendo acionado por algum evento.

Deste modo, é importante trocar o uso do delay pelo uso da função milis() que retorna um número do tipo inteiro longo, com a quantidade de milisegundos passados desde que o Arduino foi ligado. A lógica da programação precisa calcular o tempo que já se passou desde o último evento controlado até o instante atual. Se esse tempo passado corresponder ao intervalo desejado o programa deve mudar de estado.

Código fonte comparando o programa Blink dos dois modos, para o Arduino na lnguagem C++

void setup() {
    pinMode(13, OUTPUT);
}
void loop() {
    digitalWrite(13, 1);
    delay(1000);
    digitalWrite(13, 0);
    delay(1000);
}


Programa utilizando a função millis() e não usar a função delay().


unsigned long anterior = 0;
unsigned long intervalo = 1000;
unsigned int liga = 1;
void setup() {
    pinMode(13, OUTPUT);
}
void loop() {
    unsigned long atual = millis();
    if (atual - anterior > intervalo)
        {
        if (liga == 1)
            {
            digitalWrite(13, 1);
            liga = 0;
            }
        else
            {
            digitalWrite(13, 0);
            liga = 1;
            }
        anterior = atual;
        }
}


O mesmo código fonte pode ser alterado, usando o S4A.