Programação sem delay(), usando millis()
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.