项目15——实时时钟的基本实现

DS3231库

DS3231库有很多种,如下图



这里先介绍怎样将库导入至arduino中:
第一步


1

第二步,找到库文件,选中,打开
2

第三步,右下角显示已加入库表明操作成功!


3

链接:https://pan.baidu.com/s/1ihGOOqJDp6em0ur-LBDCAg
提取码:0oh0
连接里放了以上五个库,经过一一比较,我选择了Sodaq_DS3231-master库文件
在库文件中可以看到keyword名字的文件夹,打开可以看到使用方法,这里给出他的数据类型与函数:

# Datatypes (KEYWORD1)
Sodaq_DS3231    KEYWORD1
DateTime    KEYWORD1
# Methods and Functions (KEYWORD2)
second  KEYWORD2
minute  KEYWORD2
hour    KEYWORD2
date    KEYWORD2
month   KEYWORD2
year    KEYWORD2
active  KEYWORD2
dayOfWeek   KEYWORD2
get     KEYWORD2
begin    KEYWORD2
setDateTime KEYWORD2
enableInterrupts    KEYWORD2
disableInterrupts   KEYWORD2
clearINTStatus  KEYWORD2
convertTemperature  KEYWORD2
getTemperature  KEYWORD2
now KEYWORD2

了解了这些就让我们开始制作吧!


目标:利用I2C库和DS3231库实现从串口每隔1S输出一次年月日星期时分秒信息,实现从串口输入“YYYYMMDDHHMMSS”格式的信息后,实现调表功能,写出包含完整注释的代码

先完成第一步:利用I2C库和DS3231库实现从串口每隔1S输出一次年月日星期时分秒信息

代码如下:

#include 
#include "Sodaq_DS3231.h"
char weekDay[7] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat","Sun"};
//DateTime dt(2011, 11, 10, 15, 18, 0, 5);
void setup () 
{
    Serial.begin(57600);
    Wire.begin();
    rtc.begin();
    //rtc.setDateTime(dt); 
}

void loop () 
{
    DateTime now = rtc.now(); //获取当前时间
    Serial.print(now.year(), DEC);//以十进制形式输出ASCII编码值
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.date(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.print("   ");
    Serial.print(weekDay[now.dayOfWeek()-1]);
    Serial.println();
    delay(1000);
}

实验效果:


再完成第二步:可通过串口修改时间

代码如下:

#include 
#include "Sodaq_DS3231.h"
DateTime dt;
#define numdata_length 7
String comdata = "";
String weekDay[7]= { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat","Sun" };

void setup () 
{
    Serial.begin(57600);
    Wire.begin();
    rtc.begin();
}

void loop () 
{
  if(Serial.available())
  {
      int yy, MM, dd, w, hh, mm, ss;  
      int numdata[numdata_length] = {0};
      int flag = 0;
      int j = 0;
      while (Serial.available() > 0)
      {
        comdata += char(Serial.read());
        delay(2);
        flag = 1;
      }
      if(flag == 1)
      {
      for(int i = 0; i < comdata.length() ; i++)
      {
        if(comdata[i] == ',')
         {
          j++;
         }
        else
        {
            numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
        }
      }
       yy = numdata[0];
       MM = numdata[1];
       dd = numdata[2];
       w = numdata[3];
       hh = numdata[4];
       mm = numdata[5];
       ss = numdata[6];
       
      comdata = String("");
      flag = 0;
      }
    DateTime dt(yy, MM, dd, hh, mm, ss, w);
    rtc.setDateTime(dt);
    }
    DateTime now = rtc.now(); 
    Serial.print(now.year());
    Serial.print('/');
    Serial.print(now.month());
    Serial.print('/');
    Serial.print(now.date());
    Serial.print(' ');
    
    if(now.hour()<10){
    Serial.print("0");
    Serial.print(now.hour());
    Serial.print(':');
    }
    else{
    Serial.print(now.hour());
    Serial.print(':');
    }
    if(now.minute()<10){
    Serial.print("0");
    Serial.print(now.minute());
    Serial.print(':');
    }
    else{
    Serial.print(now.minute());
    Serial.print(':');
    }

    if(now.second()<10){
    Serial.print("0");
    Serial.print(now.second());
    Serial.print(' ');
    }
    else{
    Serial.print(now.second());
    Serial.print(' ');
    }
    Serial.print(weekDay[now.dayOfWeek()-1]);
    Serial.println();
    delay(1000);
}

实验效果:
因为用的markdown编辑的,但是不支持上传视频所以将视频上传至B站供大家观看~~
演示视频点击此处

你可能感兴趣的:(项目15——实时时钟的基本实现)