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