本文所介绍的内容基于树莓派瑞士军刀扩展板(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 教程》系列文章,查看系列文章目录,请访问:https://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials