订阅趣无尽微信公众号

树莓派 SAKS 扩展板实用应用 之 DS1307 RTC 时钟模块

本文所介绍的内容基于树莓派瑞士军刀扩展板(SAKS),由于 SAKS 基于树莓派通用的 GPIO 设计,文中的原理和代码也适用于其他情况。

本节以 SAKS 扩展板为硬件基础,实现让树莓派掉电后系统时间能继续保持的功能。在这个扩展板上已经有一个DS1307 RTC实时时钟模块,它是I2C类的设备,首先我们需要修改树莓派的配置文件使能I2C,通过nano编辑器修改raspi-blacklist.conf 文件内容。

sudo nano /etc/modprobe.d/raspi-blacklist.conf

修改为如下,开启I2C功能

# blacklist spi and i2c by default (many users don't need them)
blacklist spi-bcm2708
blacklist i2c-bcm2708

打开/etc/modules ,在文件结尾加上 i2c-dev

sudo nano /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

snd-bcm2835
i2c-bcm2708
i2c-dev

运行配置工具

sudo raspi-config

raspi_config_spi_05
选择Advanced Options -> I2C,依次选择Yes、OK、Finish。完成。下次启动系统时,I2C模块将被自动加载。

更新一次包列表,并安装 i2c-tools工具与python-smbus,重启树莓派。

sudo apt-get update
sudo apt-get install i2c-tools python-smbus
sudo reboot

重启后通过刚才安装的i2c-tools对i2c设备进行探测,输入以下命令,得到如下结果,说明检测到一个地址为0x68的I2C设备就是板上的DS1307。

sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

检看 DS1307的数据手册,发现DS1307的7位地址的确是0x68。注意,如果忘了为时钟模块安装纽扣电池这里可能读取不到。

下面我们通过i2c-tools来测试下DS1307的功能,并将DS1307这个掉电不丢失的时钟用于树莓派系统的时钟。
下面的测试必须在root权限下测试。

=== 如何启用 root 账户的分割线 开始===
debian里root账户默认没有密码,但账户锁定。
当需要root权限时,由默认账户经由sudo执行,Raspberry pi 系统中的Raspbian
默认用户是pi 密码为raspberry

重新开启root账号,可由pi用户登录后,在命令行下执行

sudo passwd root

执行此命令后系统会提示输入两遍的root密码,输入你想设的密码即可,然后执行

sudo passwd --unlock root

这样就可以解锁root账户了。
现在就有两个账户 pi@raspberrypi 和 root@raspberrypi 两个账户可以来回切换:
在pi@raspberrypi 输入 su 然后输入刚才设置的密码进入 root 账户
在root@raspberrypi 输入su pi 进入 pi账户
=== 如何启用 root 账户的分割线 结束===

su
Password: 
modprobe i2c-dev
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
hwclock -r
Sat Jan  1 00:00:12 2000  -0.120717 seconds

将系统时钟设定为当前时间,然后将系统时钟写入到DS1307硬件时钟里面

date 062120352014.00     备注:6月21日  20点35分 2014年
Sat Jun 21 20:35:00 UTC 2014
hwclock -w
date
Sat Jun 21 20:35:21 UTC 2014

编辑启动文件

sudo nano /etc/rc.local

将以下内容加入“exit 0”行之前

modprobe i2c-dev
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
hwclock -r
hwclock -s

ctrl+x退出

过几分钟拔掉网线,重启树莓派,输入“date”看看时间是否正确。

date
Sat Jun 21 20:55:00 UTC 2014
root@raspberrypi:/home/pi# hwclock -r
Sat Jun 21 20:56:30 2014  -0.181549 seconds

以上将系统时钟和DS1307硬件时钟读出来发现 系统时钟比DS1307时钟慢了1分多。可能是在重启后DS1307写入系统后,系统需要等待1分多才开始计时。

至此,以后要用到实时时间就可以简单的使用 date 这个命令来获取。
在python编程中可以使用以下代码读取实时时间。

import datetime #导入系统时钟
now = datetime.datetime.now() #读取当前时间并保存到now变量
timeString = now.strftime("%Y-%m-%d%H:%M") #把now中的时间按指定格式转换成字符串

后面我们后面将开始介绍如何基于 SAKS 扩展板 DIY 各种有趣、实用的东西,欢迎持续关注!

本文属于《树莓派瑞士军刀扩展板(SAKS)DIY 教程》系列文章,查看系列文章目录,请访问:http://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials

本文来自:树莓派实验室
链接地址:http://shumeipai.nxez.com/2016/05/30/saks-diy-tutorials-ds1307-rtc-clock-module.html

2 Responses

  1. 老司机 2016年8月18日 / 00:25

    hwclock –s 这个命令 “-“这个符号错了

  2. admin 2016年8月18日 / 12:00

    已修正,谢谢指正

发表评论

电子邮件地址不会被公开。 必填项已用*标注