掌控板功能展示菜单制作
初衷:通过菜单调用展示掌控板的基本硬件功能。掌控板载传感器及相应执行器如下:
[*]三轴加速度计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()
好棒的项目帖子啊,感谢分享。{:5_148:}
页:
[1]