树莓派 加时钟模块DS3231

本文详细介绍如何在树莓派上设置RTC实时时钟模块DS3231,包括购买合适模块、配置I2C接口、安装管理工具及设置RTC时间等步骤。


1. 去淘宝买RTC3231 (有两种, 一种是几块钱的(DS3231,5个孔的单排插座), 一种是30多的(红色板,双排插座的), 我买的前者,后者不知道为什么能卖那么贵。。。)

2. 树莓派关电,准备设置:

2.0 把模块插到树莓派3B的GPIO1,3,,5,7,9脚;RTC模块插座已经对应好的,别插反了, 电池朝着CPU就对了。

2.1 控制台运行 raspi-config : 打开树莓派的i2c接口

    sudo raspi-config 

Advanced Option-->I2C, 选择打开。

2.2  安装工具i2c-tools:  sudo apt-get install i2c-tools (这个工具作用是能管理I2C总线设备)


2.3 修改两个文件:

    a. 设备文件 sudo vi /etc/modules : 

写上i2c-dev , i2c-bcm2708 .

    b. 启动文件 vi /etc/rc.local 将以下内容加入“exit 0”行之前

        sudo modprobe i2c-dev  

        sudo modprobe i2c-bcm2708
        echo "ds3231 0x68" | sudo tee  /sys/class/i2c-adapter/i2c-1/new_device

sudo hwclock -r

sudo hwclock -s

 说下作用(个人理解), 

第1第2行是加载i2c总线设备;

第3行是指定驱动给0x68这个地址(也就是RTC模块的I2C地址0x68,驱动名称是ds3231.为什么呢? 

先用lsmod查看到rtc_ds1307已经加载 (这里需要修正:先手动执行了命令才能看到: 

sudo echo "ds3231 0x68" | sudo tee  /sys/class/i2c-adapter/i2c-1/new_device


然后用modinfo rtc_1307可以看到驱动对应的别名: alias i2c:ds3231 ===》故驱动是ds3231;  然后用  i2cdetect 1可以看到RTC占用地址 (输入Y, 然后出来一个map:68 位置就是RTC,不相信可以拔掉RTC看看);然后就是这样了)

第4行 ,纯粹打印RTC时间看看;

第5行是把RTC时间覆盖系统时间;


3. 另外: 有用的几个RTC操作指令:要用sudo 管理员权限运行

  

sudo hwclock -r 读取RTC时间

sudo hwclock -s 把RTC时间写入系统

sudo hwclock -w 把系统时间写入RTC

sudo hwclock --set --date="2017-01-13 11:00:11" 修改RTC时间为任意值


4. 关闭系统对时(我没这样做,国外的文章, 可以参考)


We can also disable the ntp daemon and fake-hwclock during boot. (关闭网络对时)

sudo update-rc.d ntp disable
sudo update-rc.d fake-hwclock disable

That's it. Pretty easy.

You can still sync the system time from the internet using... (复制网络时间到RTC)

sudo ntpd -gq
sudo hwclock -w

折腾了一天,终于知道如何把RTC时间设置到树莓派了。我这里没关闭ntp对时。另外注意一点,不要热插拔i2c RTC 模块,否则会有时间错乱。。。

我也是小白, 参考了众多资料, 微雪那篇文章  http://www.waveshare.net/study/article-623-1.html  ,做不到自动把RTC 对到树莓派系统,  大家就看着办了,反正我测试是不行的。







### DS3231时钟模块使用说明 DS3231是一款高精度实时时钟(RTC)芯片,支持通过I²C接口与微控制器通信。它内置温度补偿晶体振荡器和可编程晶振失效检测电路,能够在断电情况下依靠备用电池继续运行并保持时间[^1]。 #### 硬件连接 DS3231通常被设计成小型模块形式,例如ZS-042模块。该模块集成了一个CR2032纽扣电池座以及额外的AT24C32 EEPROM存储器。硬件连接非常简单,只需将DS3231模块上的SDA、SCL引脚分别接到树莓派或其他单片机的对应I²C引脚即可完成基本配置[^2]。 | 功能 | 连接 | |------|-------| | SDA (数据线)| GPIO 2 或其他指定针脚 | | SCL (时钟线)| GPIO 3 或其他指定针脚 | | GND (接地)| 地线 | | VCC (电源输入)| 3.3V | #### 软件设置 对于树莓派平台,在启动前需确认已启用I²C功能: ```bash sudo raspi-config ``` 进入 `Interfacing Options` -> `I2C` 并选择 `Yes` 来激活此服务。随后重启设备使更改生效。 接着可以利用命令扫描当前接入系统的I²C器件地址: ```bash i2cdetect -y 1 ``` 正常工作状态下应该能够发现位于`0x68`处存在的响应信号代表成功识别到了我们的目标——即DS3231芯片本身及其附属组件如EEPROM等资源均处于可用状态之中。 #### Python驱动代码实例 以下是适用于Python环境下的基础操作示范程序片段用于读取时间和日期信息: ```python import smbus from time import strftime def get_time(): bus = smbus.SMBus(1) # Rev 2 Pi uses 1 address = 0x68 # The I2C address of the RTC sec_reg = bus.read_byte_data(address, 0x00) min_reg = bus.read_byte_data(address, 0x01) hour_reg= bus.read_byte_data(address, 0x02) day_reg = bus.read_byte_data(address, 0x04) date_reg= bus.read_byte_data(address, 0x05) month_reg=bus.read_byte_data(address, 0x06) year_reg =bus.read_byte_data(address, 0x07) seconds = int(bin(sec_reg & ~0b11000000), 2) if not bool(sec_reg & 0b10000000) else None minutes = int(bin(min_reg & ~0b11000000), 2) if not bool(min_reg & 0b10000000) else None hours = int(bin(hour_reg&~0b11110000), 2)+((hour_reg>>6)&0b01)*10 if not bool(hour_reg & 0b01000000) else None days = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'][int(day_reg)-1] dates = str(int(bin(date_reg&~0b11110000), 2)) months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][int(month_reg)] years = '20'+str(year_reg) return f"{days}, {dates} {months} {years} {hours}:{minutes:0>2d}:{seconds:0>2d}" print(get_time()) ``` 上述脚本实现了从DS3231获取当前的时间戳,并将其转换为人易懂的形式打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值