RTC实时时钟模块

简介

DS3231M高精度微机电(MEMS)实时时钟(RTC)是内部集成了MEMS谐振器的温补RTC。内部集成微机电系统(MEMS)谐振器,相比石英晶振时钟,降低机械失效风险,解决温度漂移的问题。 该器件可以用纽扣电池供电,断开主电源时仍可保持精确计时。RTC可提供秒、分、时、星期、日期、月和年信息。少于31天的月,将自动调整月末的日期,包括闰年修正。 时钟格式可以是24小时或带AM/PM指示的12小时格式。提供两个可设置的日历闹钟和一个1Hz输出。在-45°C至+85°C温度范围内,计时精度保持在±5ppm (±0.432秒/天)。 通过I2C进行数据传输。当检测电源故障时,可以自动切换到备份电源。另外,RST监测引脚可以作为产生微处理器复位的按键输入。

优势和特性

技术规格

引脚说明

引脚说明

序号 丝印 功能描述
1 VCC 电源正极
2 GND 电源负极
3 SCL IIC时钟线
4 SDA IIC数据线
5 INT 低电平有效中断或1Hz方波输出
6 RST 复位校验引脚
7 32K 32.768KHz脉冲输出

使用教程

兼容

MCU Work Well Untest
Arduino Uno
Mega2560
Leonardo
ESP32
micro:bit

准备

关于如何安装库文件,点击链接

  /*!
   *@功能 初始化芯片
   *@返回 True代表IIC通信成功,false代表通信失败
   */
  bool begin(void);
  /*!
   *@功能 获取当前时间数据
   */
  void getNowTime();

  /*!
   *@功能 获取年
   *@返回 年
   */
  uint16_t year();

  /*!
   *@功能 获取月
   *@返回 月
   */
  uint8_t  month();

  /*!
   *@功能 获取日
   *@返回 日
   */
  uint8_t  day();

  /*!
   *@功能 获取时
   *@返回 时
   */
  uint8_t  hour();

  /*!
   *@功能 获取分
   *@返回 分
   */
  uint8_t  minute();

  /*!
   *@功能 获取秒
   *@返回 秒
   */
  uint8_t  second();

  /*!
   *@功能 获取星期�
   *@返回 星期�
   */
  uint8_t  dayOfTheWeek() const ;

  /*!
   *@功能 设置年
   *@参数 年
   */
  void setYear(uint8_t year);

  /*!
   *@功能 设置月
   *@参数 月
   */
  void setMonth(uint8_t month);

  /*!
   *@功能 设置日
   *@参数 日
   */
  void setDate(uint8_t date);

  /*!
   *@功能 设置时和时制
   *@参数 小时:12小时内1-12小时,24小时内0-23小时
   *@参数 模式:e24hours, eAM, ePM
   */
  void setHour(uint8_t hour, ehours mode);

  /*!
   *@功能 设置分
   *@参数 分
   */
  void setMinute(uint8_t minute);

  /*!
   *@功能 设置秒
   *@参数 秒
   */
  void setSecond(uint8_t second);

  /*!
   *@功能 将上次编译时间设置为当前时间
   */
  void dateTime();

  /*!
   *@功能 校准当前时间
   */
  void adjust();

  /*!
   *@功能 输出时间AM或PM
   */
  const char* getAMorPM();

  /*!
   *@功能 获取当前温度
   *@返回 当前温度,单位为摄氏度
   */
  float getTemperatureC();

  /*!
   *@功能 判断是否掉电
   *@返回 true为发生掉电,需要重设时间,false为未发生掉电
   */
  bool lostPower(void);

  /*!
   *@功能 读取sqw引脚模式
   *@返回 eDS3231M_OFF             = 0x01 // Off
   *@n    eDS3231M_SquareWave_1Hz  = 0x00 // 1Hz square wave
   *@n    eDS3231M_SquareWave_1kHz = 0x08 // 1kHz square wave
   *@n    eDS3231M_SquareWave_4kHz = 0x10 // 4kHz square wave
   *@n    eDS3231M_SquareWave_8kHz = 0x18 // 8kHz square wave
   */
  eDs3231MSqwPinMode_t readSqwPinMode();

  /*!
   *@功能 设置sqw引脚模式
   *@参数 模式 eDS3231M_OFF             = 0x01 // Off
   *@n         eDS3231M_SquareWave_1Hz  = 0x00 // 1Hz square wave
   *@n         eDS3231M_SquareWave_1kHz = 0x08 // 1kHz square wave
   *@n         eDS3231M_SquareWave_4kHz = 0x10 // 4kHz square wave
   *@n         eDS3231M_SquareWave_8kHz = 0x18 // 8kHz square wave
   */
  void writeSqwPinMode(eDs3231MSqwPinMode_t mode);

  /*!
   *@功能 设置闹钟
   *@参数 闹钟工作模式 typedef enum{
   *@n                                eEverySecond,
   *@n                                eSecondsMatch,
   *@n                                eSecondsMinutesMatch,
   *@n                                eSecondsMinutesHoursMatch,
   *@n                                eSecondsMinutesHoursDateMatch,
   *@n                                eSecondsMinutesHoursDayMatch, //Alarm1
   *@n                                eEveryMinute,
   *@n                                eMinutesMatch,
   *@n                                eMinutesHoursMatch,
   *@n                                eMinutesHoursDateMatch,
   *@n                                eMinutesHoursDayMatch,        //Alarm2
   *@n                                eUnknownAlarm
   *@n                                }eAlarmTypes;
   *@参数 Alarm clock Day (day)
   *@参数 Alarm clock Hour (hour)
   *@参数 mode:   e24hours, eAM, ePM
   *@参数 minutes Alarm clock (minute)
   *@参数 seconds Alarm clock (second)
   */
  void setAlarm(const uint8_t alarmType,int16_t days,int8_t hours,ehours mode,
                int8_t minutes,int8_t seconds, const bool state  = true);

  /*!
   *@功能 判断闹钟是否被触发
   *@返回 true为触发,false为未触发
   */
  bool isAlarm();
  /*!
   *@功能 清除闹钟标志位
   */
  void clearAlarm();

  /*!
   *@功能 启用或禁用闹钟
   */
  void enAbleAlarm1Int();
  void disAbleAlarm1Int();
  void enAbleAlarm2Int();
  void disAbleAlarm2Int();

  /*!
   *@功能 启用32k输出
   */
  void enAble32k();

  /*!
   *@功能 禁用32k输出
   */
  void disAble32k();

接线图

<File:DFR0641-CONNECT1.jpg>

样例代码1 - 获取与设置时间

将时间设置为指定时间,串口每秒打印一次时间、温度数据

注意:内部温度传感器是用来补偿时钟的,精度不高,如果对温度准确度要求较高,请选择其他温度传感器

    /*!
     * @file getTimeAndTemperature.ino
     * @brief Show current time
     * @n Experiment phenomenon: read data every 1 seconds and print it on serial port.
     *
     * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
     * @licence     The MIT License (MIT)
     * @author [LuoYufeng](yufeng.luo@dfrobot.com)
     * @version  V0.1
     * @date  2019-08-19
     * @url https://github.com/DFRobot/DFRobot_DS3231M
     */
    #include "DFRobot_DS3231M.h"

    DFRobot_DS3231M rtc;


    void setup(void)
    {
        Serial.begin(9600);
        /*Wait for the chip to be initialized completely, and then exit*/
        while(rtc.begin() != true){
            Serial.println("Failed to init chip, please check if the chip connection is fine. ");
            delay(1000);
        }
        /*!
         *@brief Set the vaule of pin sqw
         *@param mode eDS3231M_OFF             = 0x01 // Not output square wave, enter interrupt mode
         *@n          eDS3231M_SquareWave_1Hz  = 0x00 // 1Hz square wave
         *@n          eDS3231M_SquareWave_1kHz = 0x08 // 1kHz square wave
         *@n          eDS3231M_SquareWave_4kHz = 0x10 // 4kHz square wave
         *@n          eDS3231M_SquareWave_8kHz = 0x18 // 8kHz square wave
         */
        rtc.writeSqwPinMode(eDS3231M_SquareWave_1Hz);
        /*!
         *@brief Read the value of pin sqw
         *@return mode eDS3231M_OFF             = 0x01 // Off
         *@n           eDS3231M_SquareWave_1Hz  = 0x00 // 1Hz square wave
         *@n           eDS3231M_SquareWave_1kHz = 0x08 // 1kHz square wave
         *@n           eDS3231M_SquareWave_4kHz = 0x10 // 4kHz square wave
         *@n           eDS3231M_SquareWave_8kHz = 0x18 // 8kHz square wave
         */
        //rtc.readSqwPinMode();
        /*!
         *@brief Set the last compiled time as the current time
         */
        //rtc.dateTime();//If users use this function, please don't set time by other way
        rtc.setYear(19);//Set year, default in the 21st century, input negative number for years in the 20th century.
        rtc.setMonth(10);
        rtc.setDate(23);
        /*!
         *@brief Set the hours and 12hours or 24hours
         *@param hour:1-12 in 12hours,0-23 in 24hours
         *@param mode:e24hours, eAM, ePM
         */
        rtc.setHour(0,e24hours);
        rtc.setMinute(59);
        rtc.setSecond(40);

        rtc.adjust();

        /*!
         *@brief enable the 32k output (default is enable)
         */
        //rtc.disAble32k();

        /*!
         *@brief disable the 32k output
         */
        //rtc.enAble32k();
    }

    void loop() {
        /*!
         *@brief Get current time data
         *@return Current time data
         */
        rtc.getNowTime();
        Serial.print(rtc.year(), DEC);//year
        Serial.print('/');
        Serial.print(rtc.month(), DEC);//month
        Serial.print('/');
        Serial.print(rtc.day(), DEC);//date
        Serial.print(" (");
        Serial.print(rtc.getDayOfTheWeek());//day of week
        Serial.print(") ");
        Serial.print(rtc.hour(), DEC);//hour
        Serial.print(':');
        Serial.print(rtc.minute(), DEC);//minute
        Serial.print(':');
        Serial.print(rtc.second(), DEC);//second
        Serial.print(' ');
        /*if rtc works in 24hours mode,this function doesn't print anything*/
        Serial.print(rtc.getAMorPM());
        Serial.println();
        Serial.print("Temperature: ");
        /*!
         *@brief Get current temperature
         *@return Current temperautre, unit: ℃
         */
        Serial.print(rtc.getTemperatureC());
        Serial.println(" C");
        delay(1000);

        /*!
         *@brief Judge if it is power-down
         *@return If retrun true, power down, needs to reset time; false, work well.
         */
        if (rtc.lostPower()) {
            Serial.println("RTC lost power, plrase reset the time!");
        }
    }

结果

<File:DFR0641时间获取结果.png>

样例代码2 - 闹钟触发查询

本样例是通过loop函数里面rtc.isAlarm();函数查询闹钟是否被触发的

注意:如果设置的时时钟时制和设置的闹钟时制不同,闹钟不会触发

    /*!
     * @file setAlarmInQuery.ino
     * @brief Set alarm clock
     * @n Experiment phenomenon: set the alarm clock to trigger at a sepcified time
     * @n           Trigger when the set time of clock is the same with the RTC time
     *
     * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
     * @licence     The MIT License (MIT)
     * @author [LuoYufeng](yufeng.luo@dfrobot.com)
     * @version  V0.1
     * @date  2019-08-19
     * @url https://github.com/DFRobot/DFRobot_DS3231M
     */
    #include "DFRobot_DS3231M.h"

    DFRobot_DS3231M rtc;

    void setup(void)
    {
        Serial.begin(9600);
        /*Wait for the chip to be initialized completely, and then exit*/
        while(rtc.begin() != true){
            Serial.println("failed to init chip, please check if the chip connection is fine");
            delay(1000);
        }
        /*!
         *@brief Set the vaule of pin sqw
         *@param mode eDS3231M_OFF             = 0x01 // Not output square wave, enter interrupt mode
         *@n          eDS3231M_SquareWave_1Hz  = 0x00 // 1Hz square wave
         *@n          eDS3231M_SquareWave_1kHz = 0x08 // 1kHz square wave
         *@n          eDS3231M_SquareWave_4kHz = 0x10 // 4kHz square wave
         *@n          eDS3231M_SquareWave_8kHz = 0x18 // 8kHz square wave
         */
        rtc.writeSqwPinMode(eDS3231M_OFF);
        /*!
         *@brief Set alarm clock
         *@param alarmType Alarm clock working mode typedef enum{
         *@n                                  eEverySecond,
         *@n                                  eSecondsMatch,
         *@n                                  eSecondsMinutesMatch,
         *@n                                  eSecondsMinutesHoursMatch,
         *@n                                  eSecondsMinutesHoursDateMatch,
         *@n                                  eSecondsMinutesHoursDayMatch, //Alarm1
         *@n                                  eEveryMinute,
         *@n                                  eMinutesMatch,
         *@n                                  eMinutesHoursMatch,
         *@n                                  eMinutesHoursDateMatch,
         *@n                                  eMinutesHoursDayMatch,        //Alarm2
         *@n                                  eUnknownAlarm
         *@n                                  }eAlarmTypes;
         *@param days    Alarm clock Day (day)
         *@param hours   Alarm clock Hour (hour)
         *@param mode:   e24hours, eAM, ePM
         *@param minutes Alarm clock (minute)
         *@param seconds Alarm clock (second)
         */
        rtc.setAlarm(eSecondsMatch,/*date,0-30*/27,/*hour,1-12 in 12hours,0-23 in 24hours*/12,eAM,/*minute,0-59*/0,/*second,0-59*/0);
        rtc.setAlarm(eMinutesHoursDateMatch,/*date,0-30*/27,/*hour,1-12 in 12hours,0-23 in 24hours*/12,eAM,/*minute,0-59*/0,/*second,0-59*/0);

        rtc.setYear(19);//Set year, default in the 21st century,
        rtc.setMonth(8);
        rtc.setDate(26);
        /*!
         *@brief Set the hours and 12hours or 24hours
         *@param hour:1-12 in 12hours,0-23 in 24hours
         *@param mode:e24hours, eAM, ePM
         */
        rtc.setHour(11,ePM);//1-12 in 12hours,0-23 in 24hours
        rtc.setMinute(59);
        rtc.setSecond(50);
        rtc.adjust();
    }
    void loop() {
        /*!
         *@brief Get current time data
         *@return Current time data
         */
        rtc.getNowTime();
        /*!
         *@brief Judge if the alarm clock is triggered
         *@return true, triggered; false, not triggered
         */
        if (rtc.isAlarm()){ // If the alarm bit is set
            Serial.println("Alarm clock is triggered.");
            /*!
             *@brief Clear trigger flag
             */
            rtc.clearAlarm();
        }
        Serial.print(rtc.year(), DEC);
        Serial.print('/');
        Serial.print(rtc.month(), DEC);
        Serial.print('/');
        Serial.print(rtc.day(), DEC);
        Serial.print(" (");
        Serial.print(rtc.getDayOfTheWeek());
        Serial.print(") ");
        Serial.print(rtc.hour(), DEC);
        Serial.print(':');
        Serial.print(rtc.minute(), DEC);
        Serial.print(':');
        Serial.print(rtc.second(), DEC);
        Serial.print(' ');
        /*if rtc works in 24hours mode,this function doesn't print anything*/
        Serial.print(rtc.getAMorPM());
        Serial.println();
        if (rtc.lostPower()) {
            Serial.println("RTC lost power, please reset the time!");
        }
        delay(1000);
    }

结果

<File:DFR0641查询闹钟结果.png>

样例代码3 - 闹钟触发中断

本样例是通过时钟模块的INT引脚来判断闹钟是否被触发的

注意:如果设置的时钟时制和设置的闹钟时制不同,闹钟不会触发

本样例需要将传感器的INT引脚连接到主控板相应的中断引脚(样例选用的UNO中断引脚D2)

AVR系列中断引脚与中断号
Uno,Nano,Mini
其他328主板 中断引脚 D2 D3
中断号 0 1
Mega2560 中断引脚 D2 D3 D21 D20 D19 D18
中断号 0 1 2 3 4 5
Leonardo,其他32u4主板 中断引脚 D3 D2 D0 D1 D7
中断号 0 1 2 3 4
    /*!
     * @file setAlarmInterrupt.ino
     * @brief Set alarm, and use interrput pin to trigger it
     * @n Experiment phenomenon: set the alarm clock to trigger at a specified time
     * @n                        connect SQW pin with DIGITALPIN2
     * @n                        print information on serial port after the alarm clock is triggered.
     * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
     * @licence     The MIT License (MIT)
     * @author [LuoYufeng](yufeng.luo@dfrobot.com)
     * @version  V0.1
     * @date  2019-08-19
     * @url https://github.com/DFRobot/DFRobot_DS3231M
     */
    #include "DFRobot_DS3231M.h"

    volatile  int8_t alarmFlag = 0;

    DFRobot_DS3231M rtc;

    void setup(void)
    {
        Serial.begin(9600);
        /*Wait for the chip to be initialized completely, and then exit*/
        while(rtc.begin() != true){
            Serial.println("failed to init chip, please check if the chip connection is correct. ");
            delay(1000);
        }
        /*!
         *@brief Set the value of pin sqw
         *@param mode eDS3231M_OFF             = 0x01 // Not output square wave, enter interrupt mode
         *@n          eDS3231M_SquareWave_1Hz  = 0x00 // 1Hz square wave
         *@n          eDS3231M_SquareWave_1kHz = 0x08 // 1kHz square wave
         *@n          eDS3231M_SquareWave_4kHz = 0x10 // 4kHz square wave
         *@n          eDS3231M_SquareWave_8kHz = 0x18 // 8kHz square wave
         */
        rtc.writeSqwPinMode(eDS3231M_OFF);

        /*!
         *@brief enable Alarm1 interrupt
         */
        rtc.enAbleAlarm1Int();

        /*!
         *@brief disable Alarm1 interrupt
         */
        //rtc.disAbleAlarm1Int();

        /*!
         *@brief enable Alarm2 interrupt
         */
        rtc.enAbleAlarm2Int();

        /*!
         *@brief disable Alarm2 interrupt
         */
        //rtc.disAbleAlarm2Int();

        /*!
         *@brief Set alarm clock
         *@param alarmType Alarm clock working mode typedef enum{
         *@n                                  eEverySecond,
         *@n                                  eSecondsMatch,
         *@n                                  eSecondsMinutesMatch,
         *@n                                  eSecondsMinutesHoursMatch,
         *@n                                  eSecondsMinutesHoursDateMatch,
         *@n                                  eSecondsMinutesHoursDayMatch, //Alarm1
         *@n
         *@n                                  eEveryMinute,
         *@n                                  eMinutesMatch,
         *@n                                  eMinutesHoursMatch,
         *@n                                  eMinutesHoursDateMatch,
         *@n                                  eMinutesHoursDayMatch,        //Alarm2
         *@n                                  eUnknownAlarm
         *@n                                  }eAlarmTypes;
         *@param days    Alarm clock (day)
         *@param hours   Alarm clock (hour)
         *@param mode:   e24hours, eAM, ePM
         *@param minutes Alarm clock (minute)
         *@param seconds Alarm clock (second)
         */
        //Alarm1
        rtc.setAlarm(eSecondsMatch,/*date,0-30*/30,/*hour,1-12 in 12hours,0-23 in 24hours*/15,e24hours,/*minute,0-59*/12,/*second,0-59*/35);
        //Alarm2
        rtc.setAlarm(eMinutesHoursDayMatch,/*date,0-30*/30,/*hour,1-12 in 12hours,0-23 in 24hours*/15,e24hours,
                     /*minute,0-59*/13,/*second,0-59, this argument doesn't work in Alarm2*/42);
        /*!
         *@brief Judge if it is power-down
         *@return if return true, power-down, time needs to reset; false, work well
         */
        if (rtc.lostPower()) {
            Serial.println("RTC lost power, lets set the time!");
            /*!
             *@brief Adjust the current time
             */
            rtc.setYear(19);//Set year, default in the 21st century.
            rtc.setMonth(9);
            rtc.setDate(30);
            /*!
             *@brief Set the hours and 12hours or 24hours
             *@param hour:1-12 in 12hours,0-23 in 24hours
             *@param mode:e24hours, eAM, ePM
             */
            rtc.setHour(15,e24hours);
            rtc.setMinute(12);
            rtc.setSecond(30);
            rtc.adjust();
        }
        attachInterrupt(0, interrupt, FALLING);
    }
    void loop() {
        /*!
         *@brief Judge if the alarm clock is triggered
         *@return true, triggered; false, not triggered
         */
        rtc.getNowTime();
        Serial.print(rtc.year(), DEC);
        Serial.print('/');
        Serial.print(rtc.month(), DEC);
        Serial.print('/');
        Serial.print(rtc.day(), DEC);
        Serial.print(" (");
        Serial.print(rtc.getDayOfTheWeek());
        Serial.print(") ");
        Serial.print(rtc.hour(), DEC);
        Serial.print(':');
        Serial.print(rtc.minute(), DEC);
        Serial.print(':');
        Serial.print(rtc.second(), DEC);
        Serial.print(' ');
        /*if rtc works in 24hours mode,this function doesn't print anything*/
        Serial.print(rtc.getAMorPM());
        Serial.println();
        if(alarmFlag == 1){
            alarmFlag = 0;
            Serial.println("Alarm clock is triggered.");
            delay(1000);
            rtc.clearAlarm();
        }
        else
            delay(1000);
        if (rtc.lostPower()) {
            Serial.println("RTC lost power, please reset the time!");
        }
    }

    void interrupt(){
      alarmFlag = 1;
    }

结果

<File:DFR0641闹钟触发中断.png>

样例代码4 - 低功耗与唤醒

本样例是在设置完时钟、闹钟之后让主控板进入低功耗,当闹钟触发后主控板退出低功耗,打印10次时间后又进入低功耗。

本样例需要将传感器的INT引脚连接到主控板相应的中断引脚(样例选用的UNO中断引脚D2)。

    /*!
     * @file lowPowerAndWakeUp.ino
     * @brief Set alarm, and use interrput pin to trigger MCU wake up
     * @n Experiment phenomenon: Set the alarm clock to trigger at a specified time.
     * @n                        Connect SQW pin with DIGITALPIN2.
     * @n                        Print information on serial port after the alarm clock is triggered.
     * @n                        This demo only works on avr
     * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
     * @licence     The MIT License (MIT)
     * @author [LuoYufeng](yufeng.luo@dfrobot.com)
     * @version  V0.1
     * @date  2019-08-19
     * @url https://github.com/DFRobot/DFRobot_DS3231M
     */
    #include "DFRobot_DS3231M.h"
    #include <avr/sleep.h>

    volatile  int8_t alarmFlag = 0;

    DFRobot_DS3231M rtc;
    int t = 0;

    void setup(void)
    {
        Serial.begin(9600);
        /*Wait for the chip to be initialized completely, and then exit*/
        while(rtc.begin() != true){
            Serial.println("failed to init chip, please check if the chip connection is correct. ");
            delay(1000);
        }
        /*!
         *@brief Set the value of pin sqw
         *@param mode eDS3231M_OFF             = 0x01 // Not output square wave, enter interrupt mode
         *@n          eDS3231M_SquareWave_1Hz  = 0x00 // 1Hz square wave
         *@n          eDS3231M_SquareWave_1kHz = 0x08 // 1kHz square wave
         *@n          eDS3231M_SquareWave_4kHz = 0x10 // 4kHz square wave
         *@n          eDS3231M_SquareWave_8kHz = 0x18 // 8kHz square wave
         */
        rtc.writeSqwPinMode(eDS3231M_OFF);
        rtc.enAbleAlarm1Int();
        //rtc.disAbleAlarm1Int();
        rtc.enAbleAlarm2Int();
        //rtc.disAbleAlarm2Int();
        /*!
         *@brief Set alarm clock
         *@param alarmType Alarm clock working mode typedef enum{
         *@n                                  eEverySecond,
         *@n                                  eSecondsMatch,
         *@n                                  eSecondsMinutesMatch,
         *@n                                  eSecondsMinutesHoursMatch,
         *@n                                  eSecondsMinutesHoursDateMatch,
         *@n                                  eSecondsMinutesHoursDayMatch, //Alarm1
         *@n                                  eEveryMinute,
         *@n                                  eMinutesMatch,
         *@n                                  eMinutesHoursMatch,
         *@n                                  eMinutesHoursDateMatch,
         *@n                                  eMinutesHoursDayMatch,        //Alarm2
         *@n                                  eUnknownAlarm
         *@n                                  }eAlarmTypes;
         *@param days    Alarm clock (day)
         *@param hours   Alarm clock (hour)
         *@param mode:   e24hours, eAM, ePM
         *@param minutes Alarm clock (minute)
         *@param seconds Alarm clock (second)
         */
        rtc.setAlarm(eSecondsMatch,/*date,0-30*/29,/*hour,1-12 in 12hours,0-23 in 24hours*/9,e24hours,/*minute,0-59*/10,/*second,0-59*/40);

        rtc.setYear(19);//Set year, default in the 21st century.
        rtc.setMonth(9);
        rtc.setDate(29);
        /*!
         *@brief Set the hours and 12hours or 24hours
         *@param hour:1-12 in 12hours,0-23 in 24hours
         *@param mode:e24hours, eAM, ePM
         */
        rtc.setHour(9,e24hours);
        rtc.setMinute(10);
        rtc.setSecond(30);
        rtc.adjust();
        attachInterrupt(0, interrupt, FALLING);

        /*!
         *@brief Set avr sleep mode
         */
        set_sleep_mode (SLEEP_MODE_PWR_DOWN);
        sleep_cpu();
        sleep_enable();

    }
    void loop() {
        /*!
         *@brief Judge if the alarm clock is triggered
         *@return true, triggered; false, not triggered
         */
        if(alarmFlag == 1){
            Serial.println("Alarm is up");
            rtc.clearAlarm();
            alarmFlag = 0;
            while (t < 10){
                rtc.getNowTime();
                Serial.print(rtc.year(), DEC);
                Serial.print('/');
                Serial.print(rtc.month(), DEC);
                Serial.print('/');
                Serial.print(rtc.day(), DEC);
                Serial.print(" (");
                Serial.print(rtc.getDayOfTheWeek());
                Serial.print(") ");
                Serial.print(rtc.hour(), DEC);
                Serial.print(':');
                Serial.print(rtc.minute(), DEC);
                Serial.print(':');
                Serial.print(rtc.second(), DEC);
                Serial.print(' ');
                /*if rtc works in 24hours mode,this function doesn't print anything*/
                Serial.print(rtc.getAMorPM());
                Serial.println();
                delay(1000);
                t = t + 1;
            }
            t = 0;
        }
        else
            delay(1000);
        /*!
         *@brief Judge if it is power-down
         *@return if return true, power-down, time needs to reset; false, work well
         */
        if (rtc.lostPower()) {
            Serial.println("RTC lost power, please reset the time!");
        }
        sleep_enable();
        //energy.PowerDown();
    }


    void interrupt(){
        alarmFlag = 1;
        sleep_disable();
    }

结果

<File:DFR0641低功耗唤醒结果.png>

样例代码5 - 获取NTP时间

本样例是从NTP服务器上获取当前时间然后每秒打印

注意:本样例需要联网,所以需要ESP32系列主控板 |

如果没有编译环境,请配置ESP32编译环境

在配置好ESP32编译环境之后,需要选择FireBeetle-ESP32开发板和端口

    /*!
     * @file getTimefromNTP.ino
     * @brief Get time from ntpServer and show current time
     * @n Experiment phenomenon: read data every second and print it on serial port.
     * @n                        This demo only works on mpython
     *
     * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
     * @licence     The MIT License (MIT)
     * @author [LuoYufeng](yufeng.luo@dfrobot.com)
     * @version  V0.1
     * @date  2019-08-19
     * @url https://github.com/DFRobot/DFRobot_DS3231M
     */
    #include "DFRobot_DS3231M.h"
    #include <WiFi.h>
    #include "time.h"

    DFRobot_DS3231M rtc;

    const char* ssid       = "dfrobotYanfa";//wlan information
    const char* password   = "hidfrobot";

    const char* ntpServer = "ntp.ntsc.ac.cn";//local ntp server
    const long  gmtOffset_sec = 8*3600;  //GMT+08:00
    const int   daylightOffset_sec = 0;


    void getTimeFromNTP()
    {
        struct tm timeinfo;
        if(!getLocalTime(&timeinfo)){
            Serial.println("Failed to obtain time");
            return;
        }

        rtc.setYear(timeinfo.tm_year - 100);
        rtc.setMonth(timeinfo.tm_mon + 1);
        rtc.setDate(timeinfo.tm_mday);
        rtc.setHour(timeinfo.tm_hour, e24hours);
        rtc.setMinute(timeinfo.tm_min);
        rtc.setSecond(timeinfo.tm_sec);
        rtc.adjust();

    }

    void setup()
    {
        Serial.begin(9600);
        while(rtc.begin() != true){
            Serial.println("Failed to init chip, please check if the chip connection is fine. ");
            delay(1000);
        }
        //connect to WiFi
        Serial.printf("Connecting to %s ", ssid);
        WiFi.begin(ssid, password);
        while (WiFi.status() != WL_CONNECTED) {
            delay(500);
            Serial.print(".");
        }
        Serial.println(" CONNECTED");

        //init and get the time
        configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
        getTimeFromNTP();
        //disconnect WiFi as it's no longer needed
        WiFi.disconnect(true);
        WiFi.mode(WIFI_OFF);
    }

    void loop()
    {
        rtc.getNowTime();
        Serial.print(rtc.year(), DEC);//year
        Serial.print('/');
        Serial.print(rtc.month(), DEC);//month
        Serial.print('/');
        Serial.print(rtc.day(), DEC);//date
        Serial.print(" (");
        Serial.print(rtc.getDayOfTheWeek());//day of week
        Serial.print(") ");
        Serial.print(rtc.hour(), DEC);//hour
        Serial.print(':');
        Serial.print(rtc.minute(), DEC);//minute
        Serial.print(':');
        Serial.print(rtc.second(), DEC);//second
        Serial.println();
        delay(1000);

    }

结果

<File:DFR0641获取NTP时间.png>

常见问题

还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。 |

更多