Arduino para de responder, pode ser o millis()???

A algum tempo um colega esta tendo problemas com uma aplicação do arduino usando o Ethernet Shield, parece que parava de
responder aos requestes após 3-4 horas de funcionamento.
Eu estava montando um sistema que usa o mesmo conceito do blink without delay(), e após alguns minutos ele travava.
A mudança que fiz e parece que deu resultado, foi em vez de chamar várias vezes o millis() para comparar com meus timers eu fiz.

unsigned int millisatu = millis();

E mudei de

Timer1_Fim = Timer1_Intervalo + millis();
if (Timer1_Fim > millisatu)
       {
       ....
       }

Para

Timer1_Inicio = millisatu;
if ((Timer1_Inicio + Timer1_Intervalo) < millis())
      {
      ....
     }

E parou de travar.
Será que há alguma coisa obscura quanto ao millis()???

Há dias vi um problema similar com o millis()…

o millis retorna unsigned long, unsigned int vai até 65000 (mais coisa menos coisa).

Passados 65 segundos, a variável vai voltar a 0 e a lógica pode falhar. Basicamente, vais comprar alhos com bogalhos. Muda as variáveis que são afectadas pelo millis para unsigned long e pelo menos fica correcto. :slight_smile:

No código atual já estão as variáveis como unsigned long. É que mesmo no blink without delay eles não usam diretamente o millis(), usam uma variável para armazernar o millis(). Talvez seja escolha de quem fez o exemplo, para deixar mais didático (mesmo não acreditando, pois há errros nos códigos de exemplo nas referências) ou alguma preciosidade do autor.