Hot answers tagged

148

Short answer: do not try to “handle” the millis rollover, write rollover-safe code instead. Your example code from the tutorial is fine. If you try to detect the rollover in order to implement corrective measures, chances are you are doing something wrong. Most Arduino programs only have to manage events that span relatively short durations, like debouncing ...


28

TL;DR Short version: An unsigned long is 0 to 4,294,967,295 (2^32 - 1). So lets say previousMillis is 4,294,967,290 (5 ms before rollover), and currentMillis is 10 (10ms after rollover). Then currentMillis - previousMillis is actual 16 (not -4,294,967,280) since the result will be calculated as an unsigned long (which can't be negative, so itself will roll ...


21

If you want to know exactly how long something will take, there is only one solution: Look at the disassembly! Starting with the minimal code: void setup(){}; volatile uint16_t x; void loop() { x = millis(); } This code compiled and then fed into avr-objdump -S produces a documented disassembly. Here are the interesting excerpts: void loop() ...


17

The __DATE__ and __TIME__ are set when the code is compiling so they will naturally be behind since the code still needs to finish compiling and then be flashed to the chip. See the Arduino Playground for an example of how to sync it to your computer over serial. TimeSerial.pde shows Arduino as a clock without external hardware. It is synchronized ...


15

You do not need an RTC to build a clock: the ATmega chip has all the hardware needed to perform the duties of the RTC itself. Here is how: Get a 32768 Hz watch crystal: either buy it or disassemble an old clock. These crystals, specifically designed for time keeping, have an extremely small temperature drift. You would also need one of those if you ...


15

Note: although my answer was accepted and has a higher vote score, make sure you read Edgar Bonet's great answer on how to make your Arduino keep time without an RTC. I've been quite successful in using the DS1307 Real Time Clock. Here's a link to its datasheet. Below are some of its features: It uses IC interface for communication with Arduino, making it ...


12

A DateTime is a full class with lots of methods to it - a time_t is just an unsigned long. time_t is used to store the number of seconds since the epoch (normally 01/01/1970) The Arduino Time library returns a time_t to the now() function - but RTCLib return s a DateTime object. The DateTime object, though, has a unixtime() method which will return a ...


11

The limitations of accuracy of the library depend on accuracy of the crystal. When they make, or cook, the crystal they can only make it to a certain degree accurate, also the environment of the crystal (temperature, humidity, etc.) play a role in the accuracy of it. Let's say you have a crystal that is off by .5 second every hour, great for short term, but ...


10

millis() is interrupt driven so delay() won't impact it, at least not on an ATmega based board. That isn't to say that millis() is totally accurate either. Each tick of the timer is not exactly 1ms, but is 1.024ms. This error gradually accumulates until a correction is made. This can be seen in the implementation of the TIMER0_OVF (timer 0 overflow) ...


9

Here is an example that will run for 5 minutes. Note that the loop will begin executing anytime before the time limit is up, including 1 msec before; it can't cut-off something happening at the 5-minute mark, meaning the timing precision will be limited to the duration of the code in the loop. Update: My first suggestion had a bug related to the 50-some-odd ...


9

Several options here, and a couple folks have pointed out some challenges. "Best" answer -- probably to use a real-time clock (RTC) board to assist your timing, and effectively set a target time (next motor run is at 23:14...) each time the cycle restarts. By saving this target off (to the EEPROM or an SD card for instance), you'd protect against ...


8

Write a sketch that millis 1000 times, not by making a loop, but by copy and paste. Measure that and compare it to the actual expected time. Mind you that that the results may vary with different versions of the IDE (and its compiler in particular). Another option is to toggle an IO pin before and after the millis call, then measure the time for a very ...


8

It is hard to give a general answer, as it depends on the specifics of your code and on how the compiler compiles it: How much time does an Arduino Uno or Mega need to only call a function. This can involve a number of things: the caller puts the arguments on some predefined CPU registers, unless they are already there from a previous operation (the ...


8

Method summary (section added on 2018-01-28) There are several methods available for timing code. I am adding this preliminary section to my answer in order to provide comparative data on several methods. The methods covered in the table below are those proposed as answers to both this question and a duplicate question of this. As this question has been ...


7

I think that the two most used libraries are the Adafruit RTClib and the pjrc.com TimeLib. They both have functions to convert the epoch, and they both are reliable. But both lack the timezone and the DaylightSavingTime. I think you find the pjrc.com TimeLib just slightly more suitable to handle the epoch time (which is a 32-bit unsigned long defined as '...


6

The resonator you specified has a 0.3% stability, where the crystal or crystal oscillator (as mentioned by Ricardo) is 50ppm. Many times more stable. Not to even mention the temperature drift of resonator is horrible. Heating by sunlight will change it. Hence a resonator should not be used for keeping time over long periods. Hence using either a crystal or ...


6

So, the first consideration goes to the radio propagation aspect. Every country does things a little different with their radio clocks. And you might only have good signal a few times a day. For a nice overview, check out a solution for the German DCF77. If you're totally set on using a radio clock, time-nuts has discussed in the past ripping open a $10ish ...


6

The problem is the interaction between the interrupt handler that updates the value for the millis() function and the neopixels show() function. To maintain the counter for the millis() function a interrupt is triggered approximately every 1.024 ms. When the show() function is called all interrupts are disabled to get the precise timing needed to send the ...


6

millis() and micros() overflow periodically. However, this is not a problem: as long as you compare durations instead of timestamps you can forget about the overflows. The liked answer also gives the trick for resetting millis(). Can be handy for testing purposes, but you do not need this to handle the millis() rollover problem. Notice that there is no ...


6

As explained in the previous answers, your actual problem is not the accuracy of delayMicroseconds(), but rather the resolution of micros(). However, to answer your actual question, there is a more accurate alternative to delayMicroseconds(): the function _delay_us() from the AVR-libc is cycle-accurate and, for example _delay_us(1.125); does exactly what ...


6

The compiler has realized that your loop doesn't do anything useful and therefore optimized the whole thing away. Thus you are just timing how long it takes to do nothing. (You didn't get a result of zero, because calling micros will itself take time). BTW, the granularity of micros is 4 µs, so you won't get a reading of 1 or 2. The code actually probably ...


5

There is no more accurate way of getting time on the arduino, but I would suggest you use millis() instead. micros() returns microseconds, or millionths of a second, since the arduino was turned on. The issue is that the 32 bit unsigned integer used to store time on the arduino can only count about 70 minutes worth of micros before overflowing and resetting ...


5

Re-visiting an old question... as I found a very informative blog post that sheds new light into it. But let me first provide some context before giving the link. When assessing the quality of a time base, be it a crystal, a ceramic resonator or a lab-grade frequency standard, there are two notions that should be distinguished: accuracy: how close is the ...


5

the Yún doesn’t have a real time clock IC on board, so it can’t keep time when is powered off. Instead, it synchronizes with time servers automatically when it powers up and connects to a network using NTP. (Arduino Blog) Therefore, the Yun does not have a onboard RTC. If there there is no RTC, can I connect a DS1307 to the Atheros AR9331? Probably not....


5

I loved this question, and the great answers it generated. First a quick comment on a previous answer (I know, I know, but I don't have the rep to comment yet. :-). Edgar Bonet's answer was amazing. I've been coding for 35 years, and I learned something new today. Thank you. That said, I believe the code for "What if I really need to track very long ...


5

Overflow is never really an issue if you always calculate time difference. (Unless the time difference is more that 50 days.) unsigned long previousTime = millis(); ... wait for some event to happen ... unsigned long elapsedTime = millis() - previousTime; Even if previousTime was before the overflow, and millis() is after the overflow (so essentially ...


5

Save the variables you need to EEPROM.


5

An accurate enough way is to use the millis() function. It will return the value in milliseconds since the start of the Arduino. If you start the Arduino at a specific time, you will be able to calculate the exact date and time. Why not an external module?? An RTC such as the DS3231 in merely 5$ and it includes a temperature sensor for you!


5

An arduino does not have a real time clock (RTC) built in. Every time it restarts it will reset the millis counter. You will need to add a RTC peripheral that you can poll to find the current date and time.


Only top voted, non community-wiki answers of a minimum length are eligible