本文所介绍的内容基于树莓派瑞士军刀扩展板(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
选择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 教程》系列文章,查看系列文章目录,请访问:../../../swiss-army-knife-shield-for-raspberry-pi-diy-tutorials
hwclock –s 这个命令 “-“这个符号错了
已修正,谢谢指正