Most microcontrollers are time-agnostic, meaning they are unaware of the time around them, but that’s ok as most things we make have no need for it. But… every once in awhile you come up with an idea that requires knowing the actual time. Mostly this is used for data-logging, or creating this year’s newest clock. (Why do we come up with harder ways to tell time?) But whatever your reason, we have a solution: The DS1307 RTC (Real Time Clock).
For this article we will be discussing and using Sparkfun’s RTC Module because it incorporates everything you need to make it work, including a backup battery good for a minimum of 9 years. It also comes with the time preset so you may not even need to configure it when you get it.
Why write this article?
If you look around, this chip has been used for years, and there are dozens of tutorials on using it. So why write another? I read a lot of them and they all had slightly different information, and most of them talked about the chip without the crystal or other needed addons. So im writing this specifically about using Sparkfun’s RTC module version, and specifically for use on an Arduino.
The DS1307 is actually a very simple I2C chip. It just gives you back 7 bytes of information that is the time. So all we need to do is receive it … and transcode it to decimal. “Transcode it to decimal?!?” Yeah, don’t worry, it sounds scary, but it’s not. See the DS1307 encodes all the data in “Binary Coded Decimal” or BCD. BCD is just a way to encode numbers, and works by encoding each digit in 4 digits of binary… like so:
157 = 0001 0101 0111
1 = 0001
5 = 0101
7 = 0111
Normally you would say that 157 = 10011101. But that is 157, BCD encodes each digit separately. 1, 5, 7 not 157. hence 0001, 0101, 0111 not 10011101.
Ok, now that we know we will be receiving the data as BCD, we just need a way to convert that to decimal. Luckily, John Boxall over at TronixStuff (incredibly awesome site) has a pretty simple function to do that for us. Lucky for me too because my method was much more complicated.
Like all clocks, minus maybe atomic clocks, this clock isn’t perfect. Just as the clock on your microwave, the time on this chip will shift. It uses a crystal oscillator to be as precise as possible, but these are susceptible to drift based on temperature changes and magnetic fields, so it’s going to shift. How much? Well the spec sheet is a little vague about that. But from what I have read, about one minute per month is considered normal. If this is just too much drift, you do have other options – The DS3234 clock’s drift is +/- only 1min a year.
For more detail: Do You Have The Time? DS1307 RT Clock + Arduino