带有EEPROM的DS3231实时时钟RTC模组
简介
一款不算太完美,但是效果还是不错的DS3231模组
简介:一款不算太完美,但是效果还是不错的DS3231模组开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
远在2022年,我其实做过一个DS3231的板子。那时候焊接技术不行,大量使用直插件;
图1.2022年绘制的DS3231模块
而2年后的2024年,我的焊接技术勉强过得去了,又赶上6月的尾巴,有张卷可以用用,所以有了这个项目。板子长宽:50x25mm,后备电池采用市面上最常见的CR2032电池,它不算是太小巧,但也不大了,可以插在面包板、洞洞板以及直接接入跳线来使用,电路图非常简单,在IIC总线上还加上了一组AT24C02存储器,它可以存放一些运行信息,为了防止与你其它的EEPROM地址重复,R6\R7\R8是用来给你改变它的通信地址的短路块,请按需要将它们拉高或者拉低,后期有计划看看能不能用它自制一个时控开关。
图2.2024年第二次绘制的DS3231模块
我为这个模块配了几个程序,其中含有一个IIC设备测地址的程序用来确定当前IIC总线上所有设备的地址,以及我自己在2022年写的一个DS3231读写的Arduino库文件,由于我使用的是STM32duino,所以你需要把IIC总线设置到PB6\PB7两个脚进行测试。还有两点需要注意,DS3231最好不要超过3.3V供电,有可能导致烧毁。还有就是我的板子SQW脚没有进行上拉,需要使用SQW点亮LED的话,需要外挂一个上拉电阻,并且减小R9的阻值(你可以看见我板子上加了一个电阻,从3.3到SQW。这样SQW脚即可驱动LED)。
以下是程序介绍:
1.为啥我要写这个库:其实,在我介绍DS1307那期视频中,那个作者就写了关于DS3231的库文件。本来,我也是想要利用的,不过,它有两个比较严重的问题——问题一就是它返回的数值是字符串,而我们有时需要对时间进行比较,字符串拆分后转换成数字。这需要代码来操作,不怎么方便,而且,外国佬设置时间的方式和格式和我们中国人的习惯不一样,很容易设错,我就是经常性的设错时间;问题二比较致命了,是我现在用STM32duino次数比较多,这些板子在使用老外他们写的库文件的过程中它会报错,导致STM32F用不了这款RTC。其实,还是主要想要学会写库这个技能,毕竟学会可以使自己写的代码简化很多,它也是了解Arduino的一种重要方式;给大家做点贡献也是一个原因,老是白嫖开源的库文件,我也要贡献一下自己的库,让大家白嫖才对嘛!所以,我决定,自己写一个这个库,来从新认识一下这款芯片。
图3.模块背面
2.这个库文件中的可以执行命令:
写入时间ds3231.SetTime1(a,b,c);这个命令负责把设定时间写入DS3231寄存区;a,b,c均为整数型变量,分别对应小时,分钟,秒钟。
写入时间ds3231.SetTime2(d,e,f,g);这个命令负责把设定的时间写入DS3231寄存区;d,e,f,g均为整数型变量,分别对应年,月,日,周;
写入SQW频率闪烁ds3231.sqw(h);此命令负责设定DS3231 SQW引脚输出一个频率脉冲,h=0时不输出,h=1时输出1Hz脉冲,其它频率脉冲没有做,其实其它频率的脉冲也用不到。
读出时间ds3231.YEAR( );此命令读出DS3231内部寄存区中的年,整数型变量。
读出时间ds3231.MOUNTH( );此命令读出DS3231内部寄存区中的月,整数型变量。
读出时间ds3231.DATE( );此命令读出DS3231内部寄存区中的日,整数型变量。
读出时间ds3231.WEEK( );此命令读出DS3231内部寄存区中的周,整数型变量。
读出时间ds3231.HOUR( );此命令读出DS3231内部寄存区中的时,整数型变量。
读出时间ds3231.MIN( );此命令读出DS3231内部寄存区中的分,整数型变量。
读出时间ds3231.SEC( );此命令读出DS3231内部寄存区中的秒,整数型变量。
读出温度ds3231.temp( );此命令读出DS3231内部寄存区中的温度,浮点型变量。
图4.模块正在使用自制的Nucleo-48川崎镜试车
3.这个库底层是基于Wire库,需要在具有Wire库的情况下进行使用,不过一般你只要下载Arduino IDE,Wire库是自带的;兼容性已测试STM32duino,ATMEGA8A等系列,普通Arduino,均可正常运营。
测试方法:将附件中demo烧录到MCU,打开串口助手后,你将收到如下报文代表测试成功。
图5.MCU返回到串口助手的报文(温度/年月日/时分秒)
后续参加CW32的训练营去了,希望训练营的项目可以一次成功!我们下个开源工程再见!多谢各位同志的观看。
评论