millis() over flow question. Blink Without Delay (Resolved)

I am obviously missing something here, what would happen if: - at 50+ days millis() will return,lets say 0 - lets say previousMillis was 4,294,967,295 - long interval = 1000 So: unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { // if ( 0 - 4,294,967,295 > 1000); ? when will this be true ?

millis() Description Returns the number of milliseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 50 days.

Blink Without Delay

void loop()
 {
   // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the 
  // difference between the current time and last time you blinked 
  // the LED is bigger than the interval at which you want to 
  // blink the LED.
   unsigned long currentMillis = millis();
  
   if(currentMillis - previousMillis > interval) {
     // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
     if (ledState == LOW)
       ledState = HIGH;
     else
       ledState = LOW;

    // set the LED with the ledState of the variable:
     digitalWrite(ledPin, ledState);
   }
 }

What do you think the sum "0 - 4,294,967,295" gives you?

Remember - these are unsigned variables.

The secret is using unsigned variables. When unsigned variables overflow they go back to zero. In unsigned math using unsigned long variables,

0 - 4294967295 = 1

That's one millisecond if we're talking about using millis(). In the case of 1000, it would work out after 1000ms when current = 999 and

999 - 4294967295 = 1000

You gotta see the number line differently. It starts over at zero every so often. Think of it as a circle.

The key point is the exact arrangement of the code for the test:

  if(currentMillis - previousMillis > interval)

The subtraction is performed before the comparison - this is vital. Once you've subtracted two timestamps from each other you'll end up with a correct value for the difference, whether or not the values have wrapped around.

Were you to rearrange the code to:

  if(currentMillis > previousMillis +interval)

it would indeed be broken - comparisons don't work across a wrap-around in the way we want.

Its irrelevant if the variables are signed or unsigned for this code. In fact its carefully arranged to work with either.

Thanks