本地时钟读取与显示

Update history
Date Version Author Update content
2024-12-05 1.0.1 老怪鸽 更新了基本文档

工程创建


在VSCode中打开PlatformIO扩展创建工程。

图 0

设置工程向导

图 1

图 2

等待创建完成。

图 3

安装驱动库


创建完成之后,我们在VSCode中打开我们刚才创建的工程文件夹。

图 4

在VSCode中回到PlatformIO的主页,给工程安装DS1302的驱动库。

图 5

图 6

搜索DS1302,安装l来自Rafa CoutoDs1302库。

图 7

将库安装到我们的工程中。

图 8

图 9

打开platformio.ini文件,可以看到已经安装上了DS1302的驱动库。

图 10

编辑代码


打开工程下的src文件夹下的main.cpp

输入以下代码:

#include <Arduino.h>
#include <Ds1302.h>

//计时模块DS1302相关定义
#define RST 10    //ds1302的RST引脚定义
#define DATA 3    //ds1302的DATA引脚定义
#define CLK 2     //ds1302的CLK引脚定义

Ds1302 rtc(RST, CLK, DATA); //创建DS1302这个对象

void setup()
{
  //初始化串口
  Serial.begin(9600);

  //初始化DS1302
  rtc.init();

  //测试时钟是否停止并设置一个日期时间来启动它
  if (rtc.isHalted())
  {
      Serial.println("RTC is halted. Setting time...");

      //创建基于DS1302库下的时间参数
      Ds1302::DateTime dt = {
          .year = 24,
          .month = Ds1302::MONTH_JUL,
          .day = 27,
          .hour = 14,
          .minute = 13,
          .second = 0,
          .dow = Ds1302::DOW_SAT
      };

      //将设置的时间写入DS1302模块
      rtc.setDateTime(&dt);
  }
  else
  {
    Serial.println("RTC is busy.\r\n");
  }


  Serial.println("Time start.\r\n");
}


void loop()
{
    char outputString[100]={0};
    Ds1302::DateTime now;
    //获取当前时间并且存储在now中
    rtc.getDateTime(&now);

    static uint8_t last_second = 0;
    //如果秒数发生更新
    if (last_second != now.second)
    {
        //手动更新秒数,方便下次判断
        last_second = now.second;
        //格式化字符串
        sprintf(outputString, 
        "%d-%d-%d %d  %d:%d:%d\r\n",
        now.year+2000,
        now.month,
        now.day,
        now.dow,
        now.hour,
        now.minute,
        now.second );
        //输出字符串
        Serial.println(outputString);
    }
    delay(1000);
}

硬件连接


图 11

这里其实我是做了电路设计的,如果你的模块上没有RST的话应该是不用连接RST引脚的。
图 12

代码验证


代码编写完成之后,将ESP32S3开发板接入电脑。我当前的开发板上是CH340K的驱动,故我这里选择COM3端口

图 13

编译并下载到开发板中。

图 14

点击打开串口监视器。

图 15

可以看到开发板可以正常的读取和设置DS1302的时间。输出正常。

图 16

说明:如果你根据代码操作运行不起来,可以下载👉例程看看