《边学边用树莓派-4》I2C总线的使用和DS1307 RTC设置

2014-06-212.4万
AI 快速预览详细 收起
本文介绍了如何在树莓派上启用I2C功能并通过DFRobot的Raspberry Pi扩展板连接和配置DS1307实时时钟。首先,通过修改配置文件使能I2C,然后安装i2c-tools和python-smbus工具。接着,通过i2c-tools检测I2C设备,并将DS1307配置为系统时钟。最后,编辑启动文件以确保每次重启后系统时钟都能正确同步。通过这些步骤,可以确保树莓派系统时间的准确性。
树莓派自带的I2C为我们连接众多的I2C的外设提供了方便,下面咱们试试树莓派上连接一个 DFRobot 推出的 Raspberry Pi meet Arduino 扩展板,在这个扩展板上已经有一个DS1307 RTC实时时钟它就是I2C的设备。
《边学边用树莓派-4》I2C总线的使用和DS1307 RTC设置图1


首先我们需要修改树莓派的配置文件使能I2C,通过nano编辑器修改raspi-blacklist.conf 文件内容
  1. pi@raspberrypi ~ $ sudo nano /etc/modprobe.d/raspi-blacklist.conf
复制代码
修改为如下,开启I2C功能
  1. # blacklist spi and i2c by default (many users don't need them)
  2. blacklist spi-bcm2708
  3. blacklist i2c-bcm2708
复制代码

打开/etc/modules ,在文件结尾加上 i2c-dev
  1. pi@raspberrypi ~ $ sudo nano /etc/modules
复制代码
  1. # /etc/modules: kernel modules to load at boot time.
  2. #
  3. # This file contains the names of kernel modules that should be loaded
  4. # at boot time, one per line. Lines beginning with "#" are ignored.
  5. # Parameters can be specified after the module name.
  6. snd-bcm2835
  7. i2c-bcm2708
  8. i2c-dev
复制代码

更新一次包列表
  1. pi@raspberrypi ~ $ sudo apt-get update
复制代码

安装 i2c-tools工具与python-smbus
  1. pi@raspberrypi ~ $ sudo apt-get install i2c-tools python-smbus
复制代码

重启树莓派
  1. pi@raspberrypi ~ $ sudo reboot
复制代码

重启后重新通过ssh 登录到树莓派 通过刚才安装的i2c-tools对i2c设备进行探测
输入以下命令,得到如下结果,说明检测到一个地址为0x68的I2C设备就是板上的DS1307。
  1. pi@raspberrypi ~ $ sudo i2cdetect -y 1
  2.      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
  3. 00:          -- -- -- -- -- -- -- -- -- -- -- -- --
  4. 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  5. 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  6. 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  7. 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  8. 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  9. 60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
  10. 70: -- -- -- -- -- -- -- --
复制代码
检看 DS1307的数据手册,发现DS1307的7位地址的确是0x68。

下面我们通过i2c-tools来测试下DS1307的功能,并将DS1307这个掉电不丢失的时钟用于树莓派系统的时钟。
下面的测试必须在root权限下测试,如何进入root可以参考前面的文章
  1. pi@raspberrypi ~ $ su
  2. Password:
  3. root@raspberrypi:/home/pi# modprobe i2c-dev
  4. root@raspberrypi:/home/pi# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
  5. root@raspberrypi:/home/pi# hwclock -r
  6. Sat Jan  1 00:00:12 2000  -0.120717 seconds
  7. root@raspberrypi:/home/pi#
复制代码

将系统时钟设定为当前时间,然后将系统时钟写入到DS1307硬件时钟里面
  1. root@raspberrypi:/home/pi# date 062120352014.00     备注:6月21日  20点35分 2014年
  2. Sat Jun 21 20:35:00 UTC 2014
  3. root@raspberrypi:/home/pi# hwclock -w
  4. root@raspberrypi:/home/pi# date
  5. Sat Jun 21 20:35:21 UTC 2014
复制代码

编辑启动文件
  1. sudo nano /etc/rc.local
复制代码

l将以下内容加入“exit 0”行之前
  1. modprobe i2c-dev
  2. echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
  3. hwclock -r
  4. hwclock –s
复制代码
ctrl+x退出

过几分钟拔掉网线,重启树莓派,输入“date”看看时间是否正确。
  1. root@raspberrypi:/home/pi# date
  2. Sat Jun 21 20:55:00 UTC 2014
  3. root@raspberrypi:/home/pi# hwclock -r
  4. Sat Jun 21 20:56:30 2014  -0.181549 seconds
  5. root@raspberrypi:/home/pi#
复制代码
以上将系统时钟和DS1307硬件时钟读出来发现 系统时钟比DS1307时钟慢了1分多。可能是在重启后DS1307写入系统后,系统需要等待1分多才开始计时。

至此,以后要用到实时时间就可以简单的使用 date 这个命令来获取。
在python编程中可以使用以下代码读取实时时间。
  1. import datetime                                                        #导入系统时钟
  2. now = datetime.datetime.now()                              #读取当前时间并保存到now变量
  3. timeString = now.strftime("%Y-%m-%d%H:%M")   #把now中的时间按指定格式转换成字符串
复制代码

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(0)
- 没有更多了 -