8061| 4
|
[项目] 掌控板~OLED虚拟七段数码管 |
本帖最后由 安卓机器人 于 2018-11-3 15:23 编辑 虚拟七段数码管 感谢在中国开源元年收到掌控板! 玩中学、做中学、思中学; 乐学乐玩; 玩无止境! 【小背景】 Python计算机语言 是当今最流行的一门超级语言。 据北京理工大学python大学慕课团队介绍: 小到日常生活小应用, 大到航空航天飞向火星等等不在话下! 这么牛 ![]() 那么,中国中小学生怎样才能学习这种超级语言?! 终于,有志于影响中国传统教育的教师专家们 联手组建团队, 研发出中国的第一款高性价比的开源硬件~掌控板 ![]() ![]() 【小功能】 ![]() 利用掌控板的OLED虚拟3个七段数码管, 利用板载蜂鸣器、RGBLED等, 制作一个有声光提示的教师考试用自定义计时器。 【材料清单】 软件:mPython2 硬件:电脑、掌控板、USB数据线 【思路历程】 目标功能:虚拟数码管显示倒计时数字 依据模型:日常生活常见的七段数码管 注:Python 源代码是用海龟作图体系, 因此必须学习改造以适应掌控板当前的绘图方法 ![]() ![]() ![]() 【掌控代码】 [mw_shl_code=python,true]''' 时间: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 [2,3,4,5,6,8,9] else drawHLine(3+newLocation,29,False) # 绘段1 drawVLine(3+26+newLocation,29+4,True) if digit in [0,1,3,4,5,6,7,8,9] else drawVLine(3+26+newLocation,29+4,False) # 绘段2 drawHLine(3+newLocation,29+30,True) if digit in [0,2,3,5,6,8,9] else drawHLine(3+newLocation,29+30,False) # 绘段3 drawVLine(0+newLocation,29+4,True) if digit in [0,2,6,8] else drawVLine(0+newLocation,29+4,False) # 绘段4 drawVLine(0+newLocation,3,True) if digit in [0,4,5,6,8,9] else drawVLine(0+newLocation,3,False) # 绘段5 drawHLine(3+newLocation,0,True) if digit in [0,2,3,5,6,7,8,9] else drawHLine(3+newLocation,0,False) # 绘段6 drawVLine(29+newLocation,3,True) if digit in [0,1,2,3,4,7,8,9] else drawVLine(29+newLocation,3,False) # 绘段7 ########################################################## def doMain(TestTime,waitTime): # 考试测试时间主函数,参数分别是倒计时测试时间及OLED显示补尝时间【毫秒】 rgb[0]=(0, 30, 0) # 开始计时绿光提示 rgb[1]=(0, 30, 0) rgb[2]=(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[0]=(30, 30, 0) rgb[1]=(30, 30, 0) rgb[2]=(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[0]=(255, 0, 0) rgb[1]=(255, 0, 0) rgb[2]=(255, 0, 0) rgb.write() buzz.freq(999) buzz.duty(512) time.sleep_ms(400) buzz.duty(0) rgb[0]=(0, 0, 0) rgb[1]=(0, 0, 0) rgb[2]=(0, 0, 0) rgb.write() time.sleep_ms(100) ########################################################## def start(): # 启动时文字提示 display.fill(0) display.DispChar('考试倒计时', 34, 0) display.DispChar('[A]: 启动 120 秒钟', 14, 26) display.DispChar('[B]: 启动 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分钟倒计时 [/mw_shl_code] 注:为拍摄此视频而把程序时间设置为10秒倒计时 【前前后后】 刚从Arduino代码过渡到Python,边学边用, 本可以利用掌控板触摸键来个自定义输入倒计时数值, 试了一天,无果... |
© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed