linkdfrobot 发表于 2018-11-5 21:58:36

掌控板功能展示菜单制作

初衷:通过菜单调用展示掌控板的基本硬件功能。
掌控板载传感器及相应执行器如下:

[*]三轴加速度计MSA300,测量范围:±2G
[*]光线传感器
[*]麦克风
[*]3 颗全彩ws2812灯珠
[*]1.3英寸OLED显示屏,支持16*16字符显示,分辨率128x64
[*]无源蜂鸣器
[*]支持2个物理按键(A/B)、6个触摸按键
[*]支持1路鳄鱼夹接口,可方便接入各种阻性传感器


设计功能菜单项目有12个,列表如下:

[*]显示环境声音
[*]显示环境光线
[*]显示三轴加速度计各轴值
[*]显示物理按键值
[*]显示触摸按键值
[*]无源蜂鸣器奏乐
[*]oled随机显示点线圆
[*]oled显示你好世界
[*]变色灯
[*]流水灯
[*]呼吸灯
[*]内部文件系统

掌控板oled液晶屏无法一次展示所有项目内容,故需分页展示。

考虑人机关系特点,设计掌控板菜单按键组合如下:

[*]按键A功能下移
[*]按键B功能上移
[*]触摸P开始
[*]触摸N结束
[*]触摸Y功能翻页下移
[*]触摸O功能翻页上移
[*]触摸T选定当前功能展示
[*]触摸H选定当前功能结束

编写烧录程序后效果如图所示:




相关程序代码如下所示(各位同仁可以根据兴趣自行添加修改菜单项目):
from machine import Pin, ADC, PWM, I2C, SPI, Timer, TouchPad
from mpython import *
import time,os,random

def clearScreen():
display.fill(0)
display.show()
def f01():#"显示环境声音"
clearScreen()
display.DispChar(menuitems,0,0)
def f02():#"显示环境光线"
clearScreen()
display.DispChar(menuitems,0,0)
def f03():#"显示三轴加速度计各轴值"
clearScreen()
display.DispChar(menuitems,0,0)
def f04():#"显示物理按键值"
clearScreen()
display.DispChar(menuitems,0,0)
def f05():#"显示触摸按键值"
clearScreen()
display.DispChar(menuitems,0,0)
def f06():#"无源蜂鸣器奏乐"
clearScreen()
display.DispChar(menuitems,0,0)
song =
delaytime =
m =
display.DispChar("触摸H结束当前功能展示",0,48)
display.show()
isContinue = True
while isContinue:
    buzz = PWM(Pin(16), freq=500, duty=0)
    jp=""
    display.fill_rect(0,28,128,16,0)
    for i in range(14):
      buzz.freq(m) #调用数组频率(嵌套音符数组)
      #buzz.pwm.freq(m) #调用数组频率(嵌套音符数组)
      buzz.duty(512) #音量 512
      jp=jp+str(song)
      display.DispChar(jp,14,28)
      display.show()
      time.sleep_ms(delaytime) #时长 250 毫秒
      isContinue=touchPad_H.read()>100
      if not isContinue:
      buzz.duty(0)
      break
def f07():#"oled随机显示点线圆"
clearScreen()
display.DispChar(menuitems,0,0)
def f08():#"oled显示你好世界"
clearScreen()
display.DispChar(menuitems,0,0)
def f09():#"变色灯"
clearScreen()
display.DispChar(menuitems,0,0)
def f10():#"流水灯"
clearScreen()
display.DispChar(menuitems,0,0)
def f11():#"呼吸灯"
clearScreen()
display.DispChar(menuitems,0,0)
def f12():#"内部文件系统"
clearScreen()
display.DispChar(menuitems,0,0)

BTNA = Pin(0, mode=Pin.OPEN_DRAIN,pull=Pin.PULL_UP,value=1)
BTNB = Pin(2, mode=Pin.OPEN_DRAIN,pull=Pin.PULL_UP,value=1)
touchPad_P = TouchPad(Pin(27))
touchPad_Y = TouchPad(Pin(14))
touchPad_T = TouchPad(Pin(12))
touchPad_H = TouchPad(Pin(13))
touchPad_O = TouchPad(Pin(15))
touchPad_N = TouchPad(Pin(4))

display.fill(0)
display.show()
display.DispChar("功能选择按键A下B上",0,0)
display.DispChar("功能翻页触摸Y下O上",0,16)
display.DispChar("全局开始触摸P结束N",0,32)
display.DispChar("当前功能触摸T结束H",0,48)
display.show()
while True:
if touchPad_P.read() < 100:
    break #触摸P开始各种功能尝试

menuitems=["显示环境声音","显示环境光线","显示三轴加速度计各轴值","显示物理按键值","显示触摸按键值","无源蜂鸣器奏乐","oled随机显示点线圆","oled显示你好世界","变色灯","流水灯","呼吸灯","内部文件系统"]
menuselectedchar="★"
menuselectednumthstart=1
menuselectednumth=menuselectednumthstart
menuselectednumth_before=0
menuselectednumthend=12
numperpage=4
pagenumth=1
isTrue=True
while isTrue:
if touchPad_N.read() < 100:    #全局退出
    isTrue=False
if touchPad_T.read() < 100:    #当前功能开始
    print(str(touchPad_T.read())+"///menuselectednumth:"+str(menuselectednumth))
    menuselectednumth_before=0   #当前功能结束后可以重新绘制菜单
    if menuselectednumth==1:
      f01()
    elif menuselectednumth==2:
      f02()
    elif menuselectednumth==3:
      f03()
    elif menuselectednumth==4:
      f04()
    elif menuselectednumth==5:
      f05()
    elif menuselectednumth==6:
      f06()
    elif menuselectednumth==7:
      f07()
    elif menuselectednumth==8:
      f08()
    elif menuselectednumth==9:
      f09()
    elif menuselectednumth==10:
      f10()
    elif menuselectednumth==11:
      f11()
    elif menuselectednumth==12:
      f12()
#按键AB处理menuselectedID开始
if BTNA.value() == 0 andBTNB.value() == 1 :
    menuselectednumth=menuselectednumth+1
elif BTNA.value() == 1 andBTNB.value() == 0 :
    menuselectednumth=menuselectednumth-1
#按键AB处理menuselectedID结束
#触摸YO处理menuselectedID开始,触摸Y功能翻页下移,触摸O功能翻页上移
if touchPad_Y.read() < 100:
    if menuselectednumth/numperpage==menuselectednumth//numperpage:
      menuselectednumth=menuselectednumth+1
    else:
      menuselectednumth=(menuselectednumth//numperpage+1)*numperpage+1
elif touchPad_O.read() < 100:
    if menuselectednumth/numperpage==menuselectednumth//numperpage:
      menuselectednumth=menuselectednumth-numperpage
    else:
      menuselectednumth=(menuselectednumth//numperpage-1)*numperpage+1
#触摸YO处理menuselectedID结束
#处理过界开始
if menuselectednumth<menuselectednumthstart:
    menuselectednumth=menuselectednumthstart
elif menuselectednumth>menuselectednumthend:
    menuselectednumth=menuselectednumthend
#处理过界结束
#显示开始
if menuselectednumth_before!=menuselectednumth:
    display.fill(0)
    display.show()
    pagenumth=(menuselectednumth-1)//numperpage+1
    print("menuselectednumth:"+str(menuselectednumth)+"///pagenumth:"+str(pagenumth))
    for menuid in range(menuselectednumthend):
      if (menuid+1)>=(pagenumth-1)*numperpage+1 and (menuid+1)<=pagenumth*numperpage:
      if (menuid+1)%numperpage==0:
          if (menuid+1)==menuselectednumth:
            display.DispChar(menuselectedchar,0,(numperpage-1)*16)
          display.DispChar(menuitems,10,(numperpage-1)*16)
      else:
          if (menuid+1)==menuselectednumth:
            display.DispChar(menuselectedchar,0,((menuid+1)%numperpage-1)*16)
          display.DispChar(menuitems,10,((menuid+1)%numperpage-1)*16)
    menuselectednumth_before=menuselectednumth
    display.show()
#显示结束
time.sleep_ms(200)
else:
display.fill(0)
display.DispChar("end.",56,28)
display.show()

rzyzzxw 发表于 2018-11-5 22:21:27

好棒的项目帖子啊,感谢分享。{:5_148:}
页: [1]
查看完整版本: 掌控板功能展示菜单制作