掌控板~OLED虚拟七段数码管
本帖最后由 安卓机器人 于 2018-11-3 15:23 编辑虚拟七段数码管
感谢在中国开源元年收到掌控板!玩中学、做中学、思中学;乐学乐玩;玩无止境!
【小背景】Python计算机语言是当今最流行的一门超级语言。据北京理工大学python大学慕课团队介绍:小到日常生活小应用,大到航空航天飞向火星等等不在话下!这么牛{:5_142:}!那么,中国中小学生怎样才能学习这种超级语言?!终于,有志于影响中国传统教育的教师专家们联手组建团队,研发出中国的第一款高性价比的开源硬件~掌控板{:5_148:}!详情:https://mpython.readthedocs.io/zh/latest/index.html
【小功能】利用掌控板的OLED虚拟3个七段数码管,利用板载蜂鸣器、RGBLED等,制作一个有声光提示的教师考试用自定义计时器。https://v.youku.com/v_show/id_XMzg5ODU3NzkyOA==.html
【材料清单】软件:mPython2硬件:电脑、掌控板、USB数据线
【思路历程】目标功能:虚拟数码管显示倒计时数字依据模型:日常生活常见的七段数码管注:Python 源代码是用海龟作图体系,因此必须学习改造以适应掌控板当前的绘图方法
【掌控代码】'''
时间:10/29-11/03/2018
功能:虚拟数码管显示倒计时数字
模型:七段数码管
制作:DFID:安卓机器人
感谢:北京理工大学慕课团队;
在其桌面 python 源代码基础上消化移植到 microPython(掌控板)
'''
##########################################################
from machine import Pin, PWM
from mpython import *
import time
##########################################################
buzz = PWM(Pin(16), freq=500, duty=0)# 定义蜂鸣器引脚
##########################################################
def drawHLine(x,y,draw): # 依据掌控板OLED绘制/擦除虚拟数码管七段中的横线
display.fill_rect(x,y,26,4,1) if draw else display.fill_rect(x,y,26,4,0)
display.show()
##########################################################
def drawVLine(x,y,draw): # 依据掌控板OLED绘制/擦除虚拟数码管七段中的竖线
display.fill_rect(x,y,4,26,1) if draw else display.fill_rect(x,y,4,26,0)
display.show()
##########################################################
def drawDigit(digit,newLocation): #根据所给数字及对应位置绘制一个位置上的虚拟数码管
drawHLine(3+newLocation,29,True) if digit in else drawHLine(3+newLocation,29,False) # 绘段1
drawVLine(3+26+newLocation,29+4,True) if digit in else drawVLine(3+26+newLocation,29+4,False) # 绘段2
drawHLine(3+newLocation,29+30,True) if digit in else drawHLine(3+newLocation,29+30,False) # 绘段3
drawVLine(0+newLocation,29+4,True) if digit in else drawVLine(0+newLocation,29+4,False) # 绘段4
drawVLine(0+newLocation,3,True) if digit in else drawVLine(0+newLocation,3,False) # 绘段5
drawHLine(3+newLocation,0,True) if digit in else drawHLine(3+newLocation,0,False) # 绘段6
drawVLine(29+newLocation,3,True) if digit in else drawVLine(29+newLocation,3,False) # 绘段7
##########################################################
def doMain(TestTime,waitTime):# 考试测试时间主函数,参数分别是倒计时测试时间及OLED显示补尝时间【毫秒】
rgb=(0, 30, 0) # 开始计时绿光提示
rgb=(0, 30, 0)
rgb=(0, 30, 0)
rgb.write()
newLocation0 = 0 # 第一个数码管位置
newLocation1 = 47 # 第二个数码管位置
newLocation2 = 94 # 第三个数码管位置
display.fill(0)
for ini in range(TestTime,-1,-1):
if ini == 15: # 考试时间剩余 15 分(演示为秒)亮黄灯
rgb=(30, 30, 0)
rgb=(30, 30, 0)
rgb=(30, 30, 0)
rgb.write()
i = int(ini / 10 / 10 % 10)
j = int(ini / 10 % 10)
k = int(ini % 10)
drawDigit(i,newLocation0)
drawDigit(j,newLocation1)
drawDigit(k,newLocation2)
# time.sleep_ms(60000-400) # 等待60s;经测试此处绘图内部运行时400ms
time.sleep_ms(waitTime) # 等待1s;(waitTime==600)经测试此处绘图内部运行时400ms
for i in range(10):# 声音+红光闪烁警示倒计时时间已为 000了
rgb=(255, 0, 0)
rgb=(255, 0, 0)
rgb=(255, 0, 0)
rgb.write()
buzz.freq(999)
buzz.duty(512)
time.sleep_ms(400)
buzz.duty(0)
rgb=(0, 0, 0)
rgb=(0, 0, 0)
rgb=(0, 0, 0)
rgb.write()
time.sleep_ms(100)
##########################################################
def start():# 启动时文字提示
display.fill(0)
display.DispChar('考试倒计时', 34, 0)
display.DispChar(': 启动 120 秒钟', 14, 26)
display.DispChar(': 启动 120 分钟', 13, 40)
display.show()
##########################################################
def myCallBackA(_):# 倒计时20秒,每秒递减一次(可自定义)
doMain(20, 600)
##########################################################
def myCallBackB(_):# 倒计时20分钟,每分钟递减一次
doMain(20, 60000-400)# (时间可自定义)
##########################################################
start()
button_a.irq(trigger=Pin.IRQ_FALLING, handler=myCallBackA) # 按 A 键启动120秒钟倒计时
button_b.irq(trigger=Pin.IRQ_FALLING, handler=myCallBackB) # 按 B 键启动120分钟倒计时
注:为拍摄此视频而把程序时间设置为10秒倒计时https://v.youku.com/v_show/id_XMzg5ODY1ODcyOA==.html
【前前后后】刚从Arduino代码过渡到Python,边学边用,本可以利用掌控板触摸键来个自定义输入倒计时数值,试了一天,无果...
好厉害的许老师,大赞。{:5_148:} 您也听了嵩天老师的课,真的很好。{:5_132:} rzyzzxw 发表于 2018-11-2 10:36
您也听了嵩天老师的课,真的很好。
好!
感觉python比C更加灵活、复杂,当然编程效率超强。主要是陪儿子玩 rzyzzxw 发表于 2018-11-2 10:29
好厉害的许老师,大赞。
谢谢鼓励,要继续玩下去!{:5_148:}
页:
[1]