Lesson 22 Clock Module

Share for us
Share on facebook
Share on twitter
Share on pinterest
Share on whatsapp

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 LCD1602SunFounder
GNDGND
VCC5V
SDAA4
SCLA5

The wiring between DS1302 and the SunFounder Uno board:

DS1302SunFounder Uno
VCC5V
GNDGND
CLK7
DAT6
RST5

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);
}