树莓派 SAKS 扩展板进阶例程 之 数字闹钟

20151128194143967-0
本文所介绍的内容基于树莓派瑞士军刀扩展板(SAKS),由于 SAKS 基于树莓派通用的 GPIO 设计,文中的原理和代码也适用于其他情况。
本文由爱折腾树莓派创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。
本节将介绍如何通过 SAKS 扩展板 DIY 一个具有闹钟功能的数字时钟。
由于我们已经开始基于 SAKS SDK 开发(了解 SAKS SDK 发布的信息请阅读这里),本例程中涉及到的 SAKS 扩展板引脚编号我们根本不需要再关心。
要将 SAKS 扩展板的数码管改造成数字时钟,首先要了解数码管的使用方法。在 SAKS SDK 中,已经对数码管做了封装,如下:

将显示“1234”4位数字,并且每一位右下角的小点点亮

SAKS.digital_display.show("1.2.3.4.")

将显示“1234”4位数字,并且数字2后面的小点点亮

SAKS.digital_display.show("12.34")

在第4位数码管显示“1”,其他3位数码管不显示

SAKS.digital_display.show("###1")

一、显示时间
要让 SAKS 扩展板上的4位数码管,每一位都显示不一样的数字,需要采用动态扫描的方法。同 LED 一样,用低电平进行段选和位选。由于动态扫描程序涉及到编码等逻辑,较为复杂。有了以上SDK封装的通用方法为基础,让数码管按照固定的格式显示时间就很容易了。程序代码如下:

SAKS.digital_display.show(("%02d%02d" % (h, m)))

其中“%02d”表示一个2位数字,当h、m不足2位时前面补0,例如3会显示03。h表示小时,m表示分钟,整体效果是显示“hhmm”。
二、实现闹钟
实现闹钟需要的是在程序中设定好时间,类似整点报时,当时间一到,就调用蜂鸣器哔声鸣叫、黄色LED闪烁。
当然,还需要加入一个轻触开关,来取消闹铃。而如果30秒依然没有手动取消闹铃,则自动终止闹铃。这里需要有几个关键变量:

闹钟当前状态

__alarm_beep_status = False

当前哔鸣次数

__alarm_beep_times = 0

在这里设定闹钟定时时间

__alarm_time = "18:10:00"

结合之前本系列对 SAKS 轻触开关的使用介绍,我们的闹钟完整的程序逻辑如下:

#!/usr/bin/env python

-- coding: utf-8 --

from sakshat import SAKSHAT
import time

#Declare the SAKS Board
SAKS = SAKSHAT()

__dp = True
__alarm_beep_status = False
__alarm_beep_times = 0

在这里设定闹钟定时时间

__alarm_time = "18:10:00"

#在检测到轻触开关触发时自动执行此函数
def tact_event_handler(pin, status):
'''
called while the status of tacts changed
:param pin: pin number which stauts of tact is changed
:param status: current status
:return: void
'''
global __alarm_beep_status
global __alarm_beep_times
# 停止闹钟响铃(按下任何轻触开关均可触发)
__alarm_beep_status = False
__alarm_beep_times = 0
SAKS.buzzer.off()
SAKS.ledrow.items[6].off()

if name == "main":
#设定轻触开关回调函数
SAKS.tact_event_handler = tact_event_handler
SAKS.buzzer.off()
SAKS.ledrow.items[6].off()
while True:
# 以下代码获取系统时间、时、分、秒、星期的数值
t = time.localtime()
h = t.tm_hour
m = t.tm_min
s = t.tm_sec
w = time.strftime('%w',t)
#print h,m,s,w
print "%02d:%02d:%02d" % (h, m, s)

    if ("%02d:%02d:%02d" % (h, m, s)) == __alarm_time:
        __alarm_beep_status = True
        __alarm_beep_times = 0

    if __dp:
        # 数码管显示小时和分,最后一位的小点每秒闪烁一次
        SAKS.digital_display.show(("%02d%02d." % (h, m)))
        # 判断是否应该响起闹钟
        if __alarm_beep_status:
            SAKS.buzzer.on()
            SAKS.ledrow.items[6].on()
            __alarm_beep_times = __alarm_beep_times + 1
            # 30次没按下停止键则自动停止闹铃
            if __alarm_beep_times > 30:
                __alarm_beep_status = False
                __alarm_beep_times = 0
    else:
        SAKS.digital_display.show(("%02d%02d" % (h, m)))
        if __alarm_beep_status:
            SAKS.buzzer.off()
            SAKS.ledrow.items[6].off()
    __dp = not __dp

    time.sleep(0.5)
input("Enter any keys to exit...")

将上面的程序源码保存为 main.py 接下来如果要运行,请注意程序开头的 from sakshat import SAKSHAT,需要导入 SAKS SDK 模块。为此我们需要将 SAKS SDK 模块的相关文件和 main.py 放在一起才能正确执行 main.py 程序。我们准备了一个包含 main.py 和 SAKS SDK 的包并在 Github 上提供下载:https://github.com/spoonysonny/SAKS-tutorials/tree/master/digital-clock
接下来在终端运行:

git clone https://github.com/spoonysonny/SAKS-tutorials.git
cd SAKS-tutorials
cd digital-clock
sudo python main.py

由于显示算法基于动态扫描的方式,所以在树莓派CPU占用波动较大时会出现一定程度的闪烁,属于正常现象。如果你觉得你对闹钟的需求比较复杂,甚至需要一个配置文件来对闹钟进行配置。也可以在本程序基础上稍加完善,通过读取配置文件的方式动态加载闹钟设定。
20151128194143884-0
后面我们后面将开始介绍如何基于 SAKS 扩展板 DIY 各种有趣、实用的东西,欢迎持续关注!
本文属于《树莓派瑞士军刀扩展板(SAKS)DIY 教程》系列文章,查看系列文章目录,请访问:http://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials

标签: 树莓派教程