Tout peut dépendre de tempsEchant. Si l'échantillonnage est irrégulier c'est peut être que ce temps est très court. millis() s'incrémente de 1 toutes les 1/1,024ms et en compensation s'incrémente 24 fois sur 1024 de 2 unités pour rattraper. Cela peut jouer si tempsEchant est petit. Dans ce cas si le temps est inférieur à 16ms, il vaut mieux employer micros().
Sinon, plus loop est long, plus les temps auxquels peuvent se faire les échantillonnages s'espacent. Supposons qu'une boucle de loop dure 10ms. Si le temps est écoulé au bon moment, il sera pris immédiatement. Si il arrive un chouilla plus tard, il est pris 10ms plus tard. L'instant de déclenchement réel se fait donc avec une erreur de 10ms. Il faut donc réduire la boucle loop au maximum.
- j'ai l'impression que topDepart une fois mis à 1 ne repasse plus par 0, et donc le réglage ne se fait qu'une fois. Si c'est le cas, mettre le réglage dans le setup ce qui allège loop.
- il y a deux tests pour déclencher lecture(), je n'en comprends pas bien le sens. Dans le programme classique "blink without delay", on montre qu'un seul test suffit
- perso, j'aurais tendance à passer les durées en int et pas en unsigned long. Les calculs sur les entiers 16 bits vont plus vite. Pourquoi pas passer sur un octet? Mais j'ai l'impression que les opérations sur deux octets se font sur 16 bits, ce qui ne gagnerait rien au contraire.