给记录仪、数据采集、智能硬件做“时间”,Arduino自带的millis()一断电就清零,想长期准确走时就得上实时时钟模块RTC。DS3231是精度非常高的那颗芯片,内置温补晶振,年误差一般只有几秒,比普通时钟芯片准很多,还带纽扣电池备用电源,断电也能继续走。这篇把从接线到校时和使用的实操讲清楚。

I2C接线,别忘了电池座
DS3231模块一般是6个小脚:VCC、GND、SCL、SDA,还有32K和SQW两个附加输出(通常不用)。接到Arduino上走I2C:VCC接3.3V或5V(模块有稳压)、GND接地、SDA接A4、SCL接A5。默认I2C地址是0x68。
模块上通常有个纽扣电池座(CR2032)。这颗电池就是断电保走时的关键:主电源没了,DS3231靠它继续维持时间。上电时记得把电池装进去,否则断电后时间又归零,等于白装。
先校时,再读时
Arduino端最省心的是用RTClib库。第一次使用要先“校时”:把当前准确时间(可以是你电脑的时间,也可以从NTP或GPS取)写入DS3231,设置一次,之后芯片就会自己走时。用rtc.adjust()传进一个格式化的DateTime即可。
之后读取就用rtc.now()拿到包含年、月、日、时、分、秒的DateTime对象,直接取各个字段就行。配合字符串格式化,就能打印成“2026-10-14 23:00:00”这种易读的时间,或者用来做定时任务、给日志盖时间戳。

三个高频坑,提前绕开
第一是电池装没装。很多人第一次接好能读到时间,觉得正常,结果一断电再上电时间就归零,八成是纽扣电池没装或没装好。断电走时完全依赖这颗CR2032,别省这一步。
第二是读取格式和时区。DS3231存的是UTC还是北京时间,取决于你怎么校时。如果你希望本地时间,校时时直接传本地时间就行;如果配合网络校时,要特别注意时区换算,别显示出来快八小时。
第三是别和I2C地址冲突。如果总线上还挂了别的I2C设备(比如另一颗DS3231或OLED),地址都是0x68会冲突。可以换用能改地址的版本或用I2C多路器。把电池、时区和I2C地址三件事捋顺,DS3231就是一个能让你项目“记得时间”的省心时钟。



DS3231断电靠纽扣电池,装电池那步千万别省
校时一次就行,之后自己走,RTC确实比millis省心
时区要注意,不然显示出来快八小时
温补晶振就是准,比DS1302靠谱太多
写日志盖时间戳用它太方便了