树莓派:光阴的故事

作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载。

对于电子设备来说,时间都是基础性的功能,也很容易被人忽视。上世纪的“千年虫”问题,就是时间方面设计缺陷造成的。对于网络连接的多设备来说,保持时间同步又是一个新的问题。对于树莓派的众多应用情景来说,时间的准确性都至关重要。

NTP服务

树莓派中内置了NTP服务,所以连上网之后就可以自动调整时间。NTP是网络时间协议(Network Time Protocol)的简称,主要用于网络时间的同步。NTP协议早在80年代就已经诞生,至今还是互联网的基础性协议之一。NTP通信分为服务器和客户端两方。客户端发出的数据包中,包含有发出时客户端的时间。服务器收到数据包并回复。回复的数据包中,附加了服务器收到和发出数据包的时间。客户端收到回复后,就可以获得网络延迟时间,以及自己和服务器的时间差。客户端据此调整自己的时钟,就可以与服务器时间保持同步。

NTU客户与服务器

你可以通过下面命令来查询当前使用的NTP服务器:

sudo ntpq -pn

命令返回:

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 203.135.184.123 .GPS.            1 u  322   64   20  365.136   -7.571  15.792
 223.112.179.133 .INIT.          16 u    - 1024    0    0.000    0.000   0.000
*202.112.29.82   202.118.1.46     2 u  122   64  276   53.148    0.766   0.868

行首加*号的是当前服务器。此外,还列出了网络延迟时间(delay)、与服务器时间差(offset)等关键的NTP时间数据。单位是milliseconds。

如果NTP服务出现问题,造成树莓派时间错误,可以强制要求NTP对表:

sudo service ntp stop
sudo ntpd -gq
sudo service ntp start

上面的第一句和第三句分别用于停止和启动NTP服务。

不使用NTP,你也可以手动调整系统时间:

sudo date -s "1 Jan 2017 00:00:00"

即把系统时间调整为2017年1月1日00:00:00。

然后用date命令来显示系统当前时间:

date

时区设置

地球自西向东转到。所以,全球不同经度地点的日出日落以及正午的时间不同。人们又习惯于用同样的12点来代表正午,这意味着不同经度的人要用不一样的表。可是,如果人每时每刻都要根据经度调表,就会非常麻烦。因此,地球以15度的经度来划分时区,一个时区内的表用统一的时间,向东跨过一个时区,就需要把表调快1小时。当然,时区的划分不是严格的按照15度。比如说,一些地跨多个时区的国家有可能用统一一个时区,例如中国。下面是地球上时区分布的地图。

对于不同地区的用户来说,往往需要把树莓派调整成当地的时区。你可以用raspi-config进入到树莓派的设置页面,在"4 Localisation Options"->"I2 Change Timezone"中修改时区。

当然,你也可以用下面的命令手动修改:

sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

注意到,/user/share/zoneinfo中有多个以各大洲名字命令的文件夹,里面的文件以该州的主要城市命名。把对应城市的文件复制到/etc/localtime,就可以把系统的时区设成该城市所用的时区。这里我把时区修改为"Shanghai",也就是上海。修改之后,用date命令查看时间,可以看到时区简写变成CST,也就是“上海时间”的缩写:

Tue  3 Jan 20:42:24 CST 2017

用date命令查看UTC时间:

date -u

显示的时间正好相差8个小时:

Tue  3 Jan 12:42:24 UTC 2017

实时时钟

大多数电脑在主板上包含了一个实时时钟(RTC,Real Time Clock)。实时时钟是一个有电源的表,能在电脑断电时继续计时。因此,电脑断电后一天再开机,你会发现电脑的时钟也往前走了一天。但树莓派并不包含一个实时时钟。因此,如果树莓派断电一天再开机,在NTP服务校正时间之前,你会发现树莓派的时间还停留在一天前。为了克服这一问题,你可以给树莓派附加一个实时时钟,比如PiFace专门为树莓派设计的实时时钟。

这个实时时钟设计成一个使用纽扣电池的电路板。把PiFace电路板的孔对准树莓派的GPIO针脚插入,就可以使用了。插入位置如下图所示。插入正确的情况下,电池正好在树莓派CPU的上方。网上也有人诟病这一设计,认为电池的发热会影响树莓派CPU的散热。不过我在使用中并没有太大问题。

为了使用这款实时时钟,我还需要进行一些设置。首先,这块电路板是通过I2C接口与树莓派通信的,所以要在raspi-config的页面中打开I2C接口。然后,安装所需的工具包:

sudo apt-get install i2c-toolssudo apt-get install python-smbus

接下来,赋予用户pi使用I2C接口的权限:

sudo usermod -aG i2c pi

打开文件/etc/modules,这里面列出了系统可以加载的模块。检查是否有如下两行。如果没有的话请添加:

i2c-dev
i2c-bcm2708

下面一段程序修改自官网程序,用来让树莓派在开机时自动加载实时时钟。把下面程序保存为rtc.bash,并运行:

#!/bin/bash

#=======================================================================
# NAME: set_revision_var
# DESCRIPTION: Stores the revision number of this Raspberry Pi into
#              $RPI_REVISION
#=======================================================================
set_revision_var() {
    revision=$(grep "Revision" /proc/cpuinfo | sed -e "s/Revision\t: //")
    RPI2_REVISION=$((16#a01041))
    RPI3_REVISION=$((16#a02082))
    if [ "$((16#$revision))" -ge "$RPI3_REVISION" ]; then
        RPI_REVISION="3"
    elif [ "$((16#$revision))" -ge "$RPI2_REVISION" ]; then
        RPI_REVISION="2"
    else
        RPI_REVISION="1"
    fi
}

#=======================================================================
# NAME: start_on_boot
# DESCRIPTION: Load the I2C modules and send magic number to RTC, on boot.
#=======================================================================
start_on_boot() {
    echo "[info]Create a new pifacertc init script to load time from PiFace RTC."
    echo "[info]Adding /etc/init.d/pifacertc ."

    if [[ $RPI_REVISION == "3" ]]; then
        i=1  # i2c-1
    elif [[ $RPI_REVISION == "2" ]]; then
        i=1  # i2c-1
    else
        i=0  # i2c-0
    fi

    cat > /etc/init.d/pifacertc  << EOF
#!/bin/sh
### BEGIN INIT INFO
# Provides:          pifacertc
# Required-Start:    udev mountkernfs \$remote_fs raspi-config
# Required-Stop:
# Default-Start:     S
# Default-Stop:
# Short-Description: Add the PiFace RTC
# Description:       Add the PiFace RTC
### END INIT INFO

. /lib/lsb/init-functions

case "\$1" in
  start)
    log_success_msg "Probe the i2c-dev"
    modprobe i2c-dev
    # Calibrate the clock (default: 0x47). See datasheet for MCP7940N
    log_success_msg "Calibrate the clock"
    i2cset -y $i 0x6f 0x08 0x47
    log_success_msg "Probe the mcp7941x driver"
    modprobe i2c:mcp7941x
    log_success_msg "Add the mcp7941x device in the sys filesystem"
    # https://www.kernel.org/doc/Documentation/i2c/instantiating-devices
    echo mcp7941x 0x6f > /sys/class/i2c-dev/i2c-$i/device/new_device
    log_success_msg "Synchronise the system clock and hardware RTC"
    hwclock --hctosys
    ;;
  stop)
    ;;
  restart)
    ;;
  force-reload)
    ;;
  *)
    echo "Usage: \$0 start" >&2
    exit 3
    ;;
esac
EOF
    chmod +x /etc/init.d/pifacertc

    echo "[info]Install the pifacertc init script"
    update-rc.d pifacertc  defaults
}

set_revision_var &&
start_on_boot

完成后重启电脑。此时树莓派应该已经自动通过I2C接口加载了实时时钟。你可以通过下面命令来检查实时时钟是否就位:

sudo i2cdetect -y 1

如果就位,那么60开头的行会有一个"UU"的标准位。你可以通过下面的命令,读出实时时钟的时间:

sudo hwclock -r 

你可以通过下面的命令,把当前系统时间写入实时时钟:

sudo hwclock --systohc

有了实时时钟,你就可以在无网环境下保持时间的连续性。PiFace的产品卖得有一些贵。淘宝上还有一些便宜的实时时钟可以选购。

date用例

文章中多处使用了date命令。date是UNIX系统下常用的时间命令工具,能提供非常丰富的时间功能,比如以特定格式显示时间:

date +"%Y year %m month %d day"

+号后面的字符串代表了时间显示格式。%开头的标识符会用时间信息填充。%Y代表了年,%m代表了month,%d代表了日期。所以上面命令返回:

2017 year 01 month 01 day

更多的标识符可以通过man date来查询文档。

date不一定只显示当前时间,它还可以用来显示一个用户输入的时间:

date --date="2017/01/03 12:00:00"

这个功能看起来有些鸡肋,但实际上可以用于时间推算。比如说下面的命令就可以用于推算2016年11月12日之前1个月的时间:

date --date="2016/11/12 -1 month"

除了"-1 month",还可以是"+1 second"、"-2 day"等多种时间差,能满足各种各样的时间推算需求。

date的功能极为丰富,这里只列出了一些常见用例。其他使用可以参考man date的文档。

总结

树莓派提供了NTP服务,通过网络来校正时间。即使在断网情况下,也可以物理计时实施来校正时间。而树莓派使用的Linux系统,也提供了date这样便利的时间工具。

欢迎阅读“骑着企鹅采树莓”系列文章

时间: 2024-12-18 02:47:32

树莓派:光阴的故事的相关文章

光阴的故事 (Live) ...分享时光

光阴的故事 (Live) - 罗大佑 春天的花开秋天的风以及冬天的落阳忧郁的青春年少的我曾经无知的这么想风车在四季轮回的歌里它天天的流转风花雪月的诗句里我在年年的成长流水它带走光阴的故事改变了一个人就在那多愁善感而初次等待的青春遥远的路程昨日的梦以及远去的笑声再次的见面我们又历经了多少的路程不再是旧日熟悉的我有着旧日狂热的梦也不是旧日熟悉的你有着依然的笑容流水它带走光阴的故事改变了我们就在那多愁善感而初次回忆的青春流水它带走光阴的故事改变了我们就在那多愁善感而初次回忆的青春 原文地址:https

碎碎的光阴(湖北荆门一考生)

流水它带走光阴的故事/改变了我们/就在那多愁善感/而初次回忆的青春 ——题记 微风轻轻吹过,留下了一些淡淡芬芳在灼热的阳光里,把几片小小的叶子衔在齿间,慢慢地就扯出一些味道,比如牛奶味的冰淇淋,又比如女孩枣红色的格子裙和男孩的白衬衫…… 这一切的一切,只是因为——盛夏六月,我要毕业了. 教室里试卷的油墨味道伴着安静的书写声,在空气中缓慢而沉重地浮动着. 前面的男女生,桌子间还是拉开了那一点距离,彼此不说话. 后面的两个女生,依旧小声讨论着问题,却总得不出答案. 我突然想起来,这样的日子已快三年了

《吉他自学三月通》学习指导

——风华艺校韩永健 <吉他自学三月通>包含的知识很丰富.很全面,是一本名副其实的自学大全.可能有些自学的朋友开始学时会觉得无从下手.下面我帮大家拟定两套学习方案:         A方案(以书为依托来学习): 以单纯的书本顺序来学. 第一步:(用时30——60分钟) 了解持琴姿势(P16)——认识六线谱的记谱方法(P36)——左右手的指法记号(P39),——认识和弦图(P41) 如果上面某些部分你会了,可以跳过去.但这四个内容是一定要全部掌握的. 第二步:(用时3——7天) 从C大调的和弦开始

岁月留声的2015-F班破冰晚会

正如其名,身在F中,"福"是与生惧来的,汇聚全国各路精英的清华2015-F班,在历经长达一月之久的精心筹备的班会即将精彩上演,就请跟随我们编辑镜头,直达演播现场,晒晒精英们的动情表演,一起分享这顿耄耋盛宴. 随着晚会时间的临近,同学们或三五一群,或七八一伙,一路上谈笑风生地迈步进入晚会现场,签到处的班委早已忙得不亦乐乎,既要快速引导安置大家的坐席与物品摆放,同时还得引导大家签到与组织各类POS秀拍照留念,快闪之中的热点就是我们辛劳的院系老师.班委成员,这当中自然少不了老套热点 - 美女

非常酷的拖动分页(JS+CSS)

<html><head><title>拖动分页</title><meta http-equiv=content-type content="text/html; charset=gb2312"><style>body{ border:0px; margin:0px; overflow:hidden; background-color:transparent;} .page{ position:absolute; w

在我关掉手机一周里的

两周前,我失恋了,不少朋友来安慰我,通常接到电话,就听到对面一声吼——“来,出来喝酒.” 连续喝了一个礼拜,喝到麻木. 席间我一句话都没有,倒酒,碰杯,面无表情,一饮而尽. 朋友问我,你没事儿吧?我说挺好的.他们说,得了吧,难受你就说出来.我说,真没多么剧烈的难受,就是有点儿懵. 有些孤独. 那是一种怎样的感觉呢? 就算我身边坐着好多人,但我仍感觉自己孤身一人.与周围的世界格格不入,只有自己. 在一个晚上,我与一位堪称知己的朋友通话,在经历了二十分钟死一般的安静之后,我挂断了电话. 我突然觉得,

致流逝的岁月 致青春

致青春 春天的花开秋天的风以及冬天的落阳 忧郁的青春年少的我曾经无知的这么想 风车在四季轮回的歌里它天天地流转 风花雪月的诗句里我在年年的成长 流水它带走光阴的故事改变了一个人 就在那多愁善感而初次等待的青春 发黄的相片古老的信以及褪色的圣诞卡 年轻时为你写的歌恐怕你早已忘了吧 过去的誓言就象那课本里缤纷的书签 刻划着多少美丽的诗可是终究是一阵烟 生命与告别光阴的故事改变了两个人 就在那多愁善感而初次流泪的青春 遥远的路程昨日的梦以及远去的笑声 再次的见面我们又历经了多少的路程 不再是旧日熟悉的

JS打造的拖拽翻页效果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

缅甸维加斯开户咨询13378795299韶华静好,心清几度

文/零夜.本名(宋凯壮) 如今快节奏的生活,丢失了太多的美好,我们需要的只是一份流水潺潺般的宁静.百转千回,缕缕余香,时光留下一道道刻痕,那些属于我们年轻的记忆,斑驳了繁华.光阴的故事里,我们的心灵需要感悟一份久违的纯真.好好珍惜现在,将生命的沉淀铭记于心,找到属于自己的幸福,不要执迷于失去的曾经. 那些拦不住的四季轮回,流淌着美丽的过往,翻过一页一页的时光,向往一份平淡,追随一份安然.磨平了棱角的岁月,释然繁华之后的孤独的心,不去希望亘古无绵,忧伤的曾经,也只是过往的风景. 岁月染尽了秋叶,点