DS1307 RTC¶
Time to make some tests getting the time. I don’t prefer the DS1307 Real-Time-Clock, because of it’s inaccuracy.
I do this test to find out by how many seconds the time is off, after a while.
I use an Arduino Nano on a ProtoShield, for my test.
Wiring¶
Connecting the module with the Arduino Nano is very simple.
DS1307 | Nano |
---|---|
SCL | A5 |
SDA | A4 |
VCC | 5V |
GND | GND |
Installing the Libraries¶
In the Arduino Ide I’ve to install the Libraries DS1307RTC
and Time
with the Library Manager
First Read Test¶
First I flashed the DS1307RTC example sketch ReadTest
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
void setup() {
Serial.begin(9600);
while (!Serial) ; // wait for serial
delay(200);
Serial.println("DS1307RTC Read Test");
Serial.println("-------------------");
}
void loop() {
tmElements_t tm;
if (RTC.read(tm)) {
Serial.print("Ok, Time = ");
print2digits(tm.Hour);
Serial.write(':');
print2digits(tm.Minute);
Serial.write(':');
print2digits(tm.Second);
Serial.print(", Date (D/M/Y) = ");
Serial.print(tm.Day);
Serial.write('/');
Serial.print(tm.Month);
Serial.write('/');
Serial.print(tmYearToCalendar(tm.Year));
Serial.println();
} else {
if (RTC.chipPresent()) {
Serial.println("The DS1307 is stopped. Please run the SetTime");
Serial.println("example to initialize the time and begin running.");
Serial.println();
} else {
Serial.println("DS1307 read error! Please check the circuitry.");
Serial.println();
}
delay(9000);
}
delay(1000);
}
void print2digits(int number) {
if (number >= 0 && number < 10) {
Serial.write('0');
}
Serial.print(number);
}
After opening the Serial Monitor, I’ve got the following message :
It means, that the connection is established, but the time is not set.
Setting the Time¶
Time to change that, by using the SetTime
example sketch
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
const char *monthName[12] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
tmElements_t tm;
void setup() {
bool parse=false;
bool config=false;
// get the date and time the compiler was run
if (getDate(__DATE__) && getTime(__TIME__)) {
parse = true;
// and configure the RTC with this info
if (RTC.write(tm)) {
config = true;
}
}
Serial.begin(9600);
while (!Serial) ; // wait for Arduino Serial Monitor
delay(200);
if (parse && config) {
Serial.print("DS1307 configured Time=");
Serial.print(__TIME__);
Serial.print(", Date=");
Serial.println(__DATE__);
} else if (parse) {
Serial.println("DS1307 Communication Error :-{");
Serial.println("Please check your circuitry");
} else {
Serial.print("Could not parse info from the compiler, Time=\"");
Serial.print(__TIME__);
Serial.print("\", Date=\"");
Serial.print(__DATE__);
Serial.println("\"");
}
}
void loop() {
}
bool getTime(const char *str)
{
int Hour, Min, Sec;
if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
tm.Hour = Hour;
tm.Minute = Min;
tm.Second = Sec;
return true;
}
bool getDate(const char *str)
{
char Month[12];
int Day, Year;
uint8_t monthIndex;
if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
for (monthIndex = 0; monthIndex < 12; monthIndex++) {
if (strcmp(Month, monthName[monthIndex]) == 0) break;
}
if (monthIndex >= 12) return false;
tm.Day = Day;
tm.Month = monthIndex + 1;
tm.Year = CalendarYrToTm(Year);
return true;
}
After uploading, the time has been configured
Running Clock¶
After uploading the ReadTest
example again, the time was running.
Comparing with PC Clock¶
Here we see, that the time has a view seconds difference.
When the SetTime
sketch is compiling, it pulls the current time from the PC. So the difference is the time it takes to compile the sketch and upload it to the Arduino.
So, at the moment, the RTC Clock is 12 seconds behind the PC Clock. I’ll check back after a while and see, what has changed.
Two days later, the difference grows up to 25 seconds
That means, that I’ll have a time difference from round about 3 Minutes, after 30 days.