int value = LOW; // previous value of the LED int buttonState; // variable to store button state int lastButtonState; // variable to store last button state long interval = 100; // blink interval - change to suit long previousMillis = 0; // variable to store last time LED was updated long startTime ; // start time for stop watch long elapsedTime ; // elapsed time for stop watch int fractional; // variable used to store fractional part of time

He's still working millis() with signed longs but you won't be running this any 24 days straight so no problem.

It's still good practice (so you don't trip up later doing "what worked" before) to use unsigned long or unsigned long long to work with millis() and micros(). Both of those functions return unsigned long which is clue #1 about best use of those values.

Micros() rolls over in 1.193... hours using unsigned long. It turns negative in half that with signed. Millis() can measure intervals to over 48 days because it takes 49.7... to overflow using unsigned long. With signed, just under 25 days to find that bug. With unsigned long long the longest interval is over 4 billion times as large, counting millisecs. The sun is not that old! With signed... you should live to see the bug! Or of course knowing about rollover the clever programmer writes some logic to handle it. But why do that when there's no need for extra code at all with unsigned long. If signed integers are like measuring sticks with 2 ends for - and +, unsigned integers are circles like clock faces. You measure around the circle and don't worry about crossing zero, it comes out in the math always as a positive. The sign is in the direction from-to you measured, not in the result, unsigned don't have sign.