安卓机器人 发表于 2018-11-1 19:10:28

掌控板~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,边学边用,本可以利用掌控板触摸键来个自定义输入倒计时数值,试了一天,无果...


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

好厉害的许老师,大赞。{:5_148:}

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

您也听了嵩天老师的课,真的很好。{:5_132:}

安卓机器人 发表于 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
好厉害的许老师,大赞。

谢谢鼓励,要继续玩下去!{:5_148:}
页: [1]
查看完整版本: 掌控板~OLED虚拟七段数码管