@rew: Bijna goed.
Jouw voorbeeld gaat uit van een StartTijd in de toekomst, dus wanneer je de aktie wilt uitvoeren, en dat levert inderdaad een negatief getal op als het nog geen tijd is. Maar dat is lastig testen want millis() is unsigned en is dus altijd positief.
Mijn voorbeeld gaat uit van een StartTime in het verleden, dus wanneer je begint met de delay.
if ((millis() - StartTime) > Delay)
{ StartTime += Delay;
StartTime is een moment in het verleden. En millis() loopt steeds door. Dus (millis() - StartTime) is altijd positief. En je start de aktie (en zet een nieuwe StartTijd) als het verschil groot genoeg is. De getallen hoeven niet signed te zijn. De enige eis is dat alle getallen even groot zijn, want als millis() bijv een 16-bit getal geeft en StartTime is 32-bit dan gaat het mis
Veel mensen zetten StartTime dmv millis()
if ((millis() - StartTime) > Delay)
{ StartTime - millis();
Dat werkt ook, maar geeft extra vertraging als je de test te laat uitvoert. Bijv als je systeem zo traag is dat je de controle maar 1 keer per meerdere milliseconden kunt uitvoeren. Dat is soms een probleem, niet altijd.
Rekenvoorbeeld:
Stel StartTime is unsigned long (32 bit). En de waarde is 0xFFFFFFFE (dus tegen overflow aan.
En je wilt een actie starten telkens na 5 milliseconden (Delay = 5).
Millis() StartTime Millis() - StartTime
0xFFFFFFFE 0xFFFFFFFE 0x00000000 Nog niet
0xFFFFFFFF 0xFFFFFFFE 0x00000001 Nog niet
0x00000000 0xFFFFFFFE 0x00000002 Nog niet
0x00000001 0xFFFFFFFE 0x00000003 Nog niet
0x00000002 0xFFFFFFFE 0x00000004 Nog niet
0x00000003 0xFFFFFFFE 0x00000005 Nu wel
Zet nieuwe StartTime (StartTijd + Delay)
0x00000003 0x00000003 0x00000000 Nog niet
0x00000004 0x00000003 0x00000001 Nog niet
enz ...
PS Dat het goed blijft gaan ook igv overflow is 'by design'. Dat is inherent aan het gebruik van "2's complement" binaire notatie.