 # 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.

``````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
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