Introduction
There are many popular serial clock circuits today, such as DS1302, DS1307, PCF8485, etc. They are widely used due to their simple interfaces, low cost, and ease of use. In this lesson, we will use DS1302 real-time clock module as shown below:
Components
– 1*SunFounder Uno board
– 1*USB data cable
– 1*RTC module
– 1*I2C LCD1602 module
– Several jumper wires
– 1 *Breadboard
Experimental Principle
DS1302 is a trickle charging clock chip, which is launched by DALLAS in America. With a built-in real-time clock/calendar and a 31-byte static RAM, it can communicate with MCU through simple serial interfaces. The real-time clock/calendar circuit provides information about second, minute, hour, day, week, month, and year. DS1302 can automatically adjust the number of days per month and days in leap year. You can determine to use 24-hour or 12-hour system by AM/PM selection. DS1302 can simply communicate with MCU in a synchronous serial way and only need to use three interface cables: RST Reset, I/O data cable and SCLK serial clock.
Experimental Procedures
Step 1: Build the circuit
The wiring between I2C LCD1602 and the SunFounder Uno board is as shown below:
I2C LCD1602 | SunFounder |
GND | GND |
VCC | 5V |
SDA | A4 |
SCL | A5 |
The wiring between DS1302 and the SunFounder Uno board:
DS1302 | SunFounder Uno |
VCC | 5V |
GND | GND |
CLK | 7 |
DAT | 6 |
RST | 5 |
Step 2: Program (Please refer to the example code in LEARN -> Get Tutorials on our website)
Note: Here you need to add a library. Refer to the description in Lesson 4 previously in the manual.
Step 3: Compile the code
Step 4: Upload the sketch to the SunFounder Uno board
Now, you can see the current date and time displayed on the I2C LCD1602.
Code
/***************************************************** * name:Real-time Clock Module * function:you can see the current date and time displayed on the I2C LCD1602. ******************************************************/ //Email:support@sunfounder.com //Website:www.sunfounder.com//include the libraries #include <stdio.h> #include <string.h> #include <DS1302.h> #include <Wire.h> #include <LiquidCrystal_I2C.h>LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line displayuint8_t RST_PIN = 5; //RST pin attach to uint8_t SDA_PIN = 6; //DAT pin attach to uint8_t SCL_PIN = 7; //CLK Pin attach to /* Create buffers */ char buf[50]; char day[10];String comdata = “”; int numdata[7] ={0}, j = 0, mark = 0; /* Create a DS1302 object */ DS1302 rtc(RST_PIN, SDA_PIN, SCL_PIN); //create a variable type of DS1302 void print_time() { /* Get the current time and date from the chip */ Time t = rtc.time(); /* Name the day of the week */ memset(day, 0, sizeof(day)); switch (t.day) { case 1: strcpy(day, “Sun”); break; case 2: strcpy(day, “Mon”); break; case 3: strcpy(day, “Tue”); break; case 4: strcpy(day, “Wed”); break; case 5: strcpy(day, “Thu”); break; case 6: strcpy(day, “Fri”); break; case 7: strcpy(day, “Sat”); break; } /* Format the time and date and insert into the temporary buffer */ snprintf(buf, sizeof(buf), “%s %04d-%02d-%02d %02d:%02d:%02d”, day, t.yr, t.mon, t.date, t.hr, t.min, t.sec); /* Print the formatted string to serial so we can see the time */ Serial.println(buf); lcd.setCursor(2,0); lcd.print(t.yr); lcd.print(“-“); lcd.print(t.mon/10); lcd.print(t.mon%10); lcd.print(“-“); lcd.print(t.date/10); lcd.print(t.date%10); lcd.print(” “); lcd.print(day); lcd.setCursor(4,1); lcd.print(t.hr); lcd.print(“:”); lcd.print(t.min/10); lcd.print(t.min%10); lcd.print(“:”); lcd.print(t.sec/10); lcd.print(t.sec%10); } void setup() { Serial.begin(9600); rtc.write_protect(false); rtc.halt(false); lcd.init(); //initialize the lcd lcd.backlight(); //open the backlight Time t(2015, 6, 15, 17, 59, 50, 2); /* Set the time and date on the chip */ rtc.time(t); }void loop() { /*add the data to comdata when the serial has data */ while (Serial.available() > 0) { comdata += char(Serial.read()); delay(2); mark = 1; } /* Use a comma to separate the strings of comdata, and then convert the results into numbers to be saved in the array numdata[] */ if(mark == 1) { Serial.print(“You inputed : “); Serial.println(comdata); for(int i = 0; i < comdata.length() ; i++) { if(comdata[i] == ‘,’ || comdata[i] == 0x10 || comdata[i] == 0x13) { j++; } else { numdata[j] = numdata[j] * 10 + (comdata[i] – ‘0’); } } /* The converted numdata add up to the time format, then write to DS1302*/ Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]); rtc.time(t); mark = 0;j=0; /* clear comdata ,in order to wait for the next input */ comdata = String(“”); /* clear numdata */ for(int i = 0; i < 7 ; i++) numdata[i]=0; } /* print the current time */ print_time(); delay(1000); } |