查看: 3320|回复: 4

[项目] 掌控板~OLED虚拟七段数码管

[复制链接]
本帖最后由 安卓机器人 于 2018-11-3 15:23 编辑

虚拟七段数码管

感谢在中国开源元年收到掌控板!
玩中学、做中学、思中学;
乐学乐玩;
玩无止境!

【小背景】
Python计算机语言
是当今最流行的一门超级语言。
据北京理工大学python大学慕课团队介绍:
小到日常生活小应用,
大到航空航天飞向火星等等不在话下!
这么牛
那么,中国中小学生怎样才能学习这种超级语言?!
终于,有志于影响中国传统教育的教师专家们
联手组建团队,
研发出中国的第一款高性价比的开源硬件~掌控板
掌控-动态.gif

【小功能】
IMG_20181101_214017.jpg
利用掌控板的OLED虚拟3个七段数码管,
利用板载蜂鸣器、RGBLED等,
制作一个有声光提示的教师考试用自定义计时器。


【材料清单】
软件:mPython2
硬件:电脑、掌控板、USB数据线

【思路历程】
目标功能:虚拟数码管显示倒计时数字
依据模型:日常生活常见的七段数码管
注:Python 源代码是用海龟作图体系,
因此必须学习改造以适应掌控板当前的绘图方法
Screenshot_2018-10-30-07-39-58-259_com.netease.ed.png

Screenshot_2018-10-30-07-35-54-579_com.netease.ed.png

Screenshot_2018-10-30-09-48-42-354_com.netease.ed.png

【掌控代码】
[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 [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分钟倒计时
    
注:为拍摄此视频而把程序时间设置为10秒倒计时

【前前后后】
刚从Arduino代码过渡到Python,边学边用,
本可以利用掌控板触摸键来个自定义输入倒计时数值,
试了一天,无果...



rzyzzxw  版主

发表于 2018-11-2 10:29:30

好厉害的许老师,大赞。
回复

使用道具 举报

rzyzzxw  版主

发表于 2018-11-2 10:36:59

您也听了嵩天老师的课,真的很好。
回复

使用道具 举报

安卓机器人  中级技神
 楼主|

发表于 2018-11-2 11:21:41

rzyzzxw 发表于 2018-11-2 10:36
您也听了嵩天老师的课,真的很好。

好!
感觉python比C更加灵活、复杂,当然编程效率超强。主要是陪儿子玩
回复

使用道具 举报

安卓机器人  中级技神
 楼主|

发表于 2018-11-2 11:43:28

rzyzzxw 发表于 2018-11-2 10:29
好厉害的许老师,大赞。

谢谢鼓励,要继续玩下去!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2020 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail