ESP8266-Arduino编程实例-DS3231实时时钟(RTC)驱动

DS3231实时时钟(RTC)驱动

1、DS3231介绍

DS3231 是一款低成本、极其精确的 I2C 实时时钟 (RTC),具有集成的温度补偿晶体振荡器 (TCXO) 和晶体。

该设备包含电池输入,并在设备的主电源中断时保持准确的计时。

DS3231具有如下特性:

  • 高精度 RTC 全面管理所有计时功能
  • 实时时钟计数秒、分、小时、月日期、月、星期几和年,闰年补偿有效至 2100
  • 0°C 至 +40°C 的精度为 ±2ppm
  • -40°C 至 +85°C 的精度为 ±3.5ppm
  • 数字温度传感器输出:±3°C 精度
  • 两个时间警报
  • 可编程方波输出信号
  • 简单的串行接口连接到大多数微控制器
  • 快速 (400kHz) I2C 接口
  • 用于连续计时的备用电池输入
  • 低功耗操作可延长电池备用运行时间
  • 3.3V 操作

在这里插入图片描述

2、硬件准备

  • ESP8266 NodeMCU开发板一块
  • DS3231RTC模块一个
  • 面板板一个
  • 杜邦线若干
  • 数据线一条

硬件接线如下:

在这里插入图片描述

3、软件准备

  • Arduino IDE或VSCode + PlatformIO

在前面的文章中,对如何搭建ESP8266开发环境做了详细的介绍,请参考:

ESP8266 NodeMCU的引脚介绍在前面的文章中做了详细的介绍,请参考:

4、代码实现

本次实例使用DS3231驱动库如下:

1)导入依赖库头文件

1
2
3
4
5
6
7
8
#include <Wire.h>
#include "RTClib.h"

RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};


2)设备初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void setup () {
// 初始化串口
Serial.begin(9600);
// 初始化设备
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
// 调整时间
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
// 使用文件编译日期和时间调整时间
rtc.adjust(DateTime(F(\_\_DATE\_\_), F(\_\_TIME\_\_)));
// rtc.adjust(DateTime(2022, 05, 21, 3, 0, 0));
}
}

3)时间数据采集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void loop () {
DateTime now = rtc.now();

Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();

Serial.print(" since midnight 1/1/1970 = ");
Serial.print(now.unixtime());
Serial.print("s = ");
Serial.print(now.unixtime() / 86400L);
Serial.println("d");

// 计算未来 7 天 30 秒后的日期
DateTime future (now + TimeSpan(7,12,30,6));

Serial.print(" now + 7d + 30s: ");
Serial.print(future.year(), DEC);
Serial.print('/');
Serial.print(future.month(), DEC);
Serial.print('/');
Serial.print(future.day(), DEC);
Serial.print(' ');
Serial.print(future.hour(), DEC);
Serial.print(':');
Serial.print(future.minute(), DEC);
Serial.print(':');
Serial.print(future.second(), DEC);
Serial.println();

Serial.println();
delay(3000);
}

文章来源: https://iotsmart.blog.csdn.net/article/details/126398864