查看: 12507|回复: 0

[入门教程] 《边学边用树莓派-4》I2C总线的使用和DS1307 RTC设置

[复制链接]
树莓派自带的I2C为我们连接众多的I2C的外设提供了方便,下面咱们试试树莓派上连接一个 DFRobot 推出的 Raspberry Pi meet Arduino 扩展板,在这个扩展板上已经有一个DS1307 RTC实时时钟它就是I2C的设备。
DFR0311-3包装.jpg


首先我们需要修改树莓派的配置文件使能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中的时间按指定格式转换成字符串
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail