树莓派 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


坐沙发

发表评论

你的邮件地址不会公开


*