做个万年历、定时喂食器、到点报警,都需要一块掉电也不丢时间的时钟,DS3231就是为这个来的。它比常见的DS1307精度高很多,用温度补偿晶振,一年误差小,还自带电池座,断电时间照样走。这篇文章把接线和初始化讲清楚。
DS3231是什么,I2C地址0x68
DS3231是一颗高精度实时时钟芯片,内置温度补偿晶振(TCXO),在-40到+85℃都能保持精度,走时比DS1307稳定得多。它通过I2C通信,时钟寄存器地址是0x68,另外还带一个温度传感器(地址0x48)和一个掉电保存的SRAM/EEPROM。
模块上除了芯片,通常还焊着一颗CR2032纽扣电池座和充电电路,外接供电时给电池充电,断电用电池继续走时。模块引出VCC、GND、SCL、SDA以及SQW(方波输出)等脚。

接线表:I2C四线+电池
DS3231连Arduino Uno:VCC接5V(模块上很多带LDO限压,3.3V也能供电但为电池充电要5V)、GND接GND、SCL接A5、SDA接A4。装好CR2032电池,断电后时间才能保住。接线见下图。

初始化和读时间:先写一次再一直读
刚上电的模块时间可能是出厂默认的,所以第一次要“写入当前时间”做初始化,之后主控每次上电直接读寄存器就行,不必重复写。用库调用非常省事:设好现在是几点几分几秒和年月日,之后serialPrint就能读出时间,年会自动进位。
注意DS3231的时间寄存器里,秒寄存器最高位是“电池待机”标志,读取和写入时要做掩码处理,库已经封装好了,放心用。还有,如果读到的时间跳跃或不对,先确认晶振位设置正常,别只看表面。
时间不准或没电池?几个排查点
最常见是忘装电池导致断电时间归零,一旦拔出外电时间立刻回到出厂值。第二是问题怔怔的“上了电但时间不更新”,多刷新几次或确认I2C线没接反。第三,温度传感器和时钟共用一条I2C总线,注意别和地址冲突的设备挂在同一条线上。
把时间读好,就能做桌面时钟、定时喂食器、到点提醒、作息打卡这些实用项目。DS3231是理解RTC和I2C通信很好的一课,四根线+一颗电池,时间就牢牢锁住。







一年误差小,温度补偿晶振是真比1307省心
断电能保住时间靠的就是那块纽扣电池,别漏装
做定时喂食器、到点提醒这种需要准时的项目很香
VCC喂5V、SCL接A5、SDA接A4,别忘了装CR2032电池
第一次先写当前时间初始化,之后一直读就够