#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pico_i2c_lcd import I2cLcd
from machine import Pin, I2C
import time
from easybutton import EasyButton
import json
i2c = I2C(0, scl=Pin(21), sda=Pin(20))
lcd = I2cLcd(i2c, 0x27, 2, 16)
print("Hello")
config={
"PWM":{
"VALUE":5,"MIN":5,"MAX":65535},#PWM 当前值 最小值 最大值
"ACCEL":{
"VALUE":50,"MIN":100,"MAX":6000},#加速度(毫秒) 当前值 最小值 最大值
"DECEL":{
"VALUE":50,"MIN":100,"MAX":6000},#加速度(毫秒) 当前值 最小值 最大值
"FIXED":{
"VALUE":300,"MIN":200,"MAX":60000}, #运行时间(毫秒) 当前值 最小值 最大值
"SLICES":{
"VALUE":50,"MIN":50,"MAX":60000}, #平滑度(切片数) 当前值 最小值 最大值
"DIR":{
"VALUE":True} #旋转方向 True正转 False反转
}
def main():
config=load_config()
UPDATELCD()
BTN_EN.short_func = EN_SHORT_FUNC
BTN_ADD.short_func = ADD_SHORT_FUNC
BTN_SUB.short_func = SUB_SHORT_FUNC
BTN_EN.long_func = EN_LONG_FUNC
while True:
time.sleep_ms(100)
'''
按钮事件
在待机界面->
EN长按进入参数选择界面
ADD,忽略
SUB,忽略
在参数选择界面->
EN短按,进入参数编辑界面
EN长按,返回待机界面
ADD,下一条
SUB,上一条
在参数编辑界面
EN长按,保存返回参数选择界面
EN短按,切换参数倍率
ADD,增加
SUB,减少
'''
SATAE=0 #状态 0待机 1参数选择 2参数设置
CURSOR=0 #焦点
ARGFLOD=1 #倍率
BTN_EN_PIN=Pin(10, Pin.IN, Pin.PULL_UP)
BTN_ADD_PIN=Pin(11, Pin.IN, Pin.PULL_UP)
BTN_SUB_PIN=Pin(12, Pin.IN, Pin.PULL_UP)
BTN_EN = EasyButton(BTN_EN_PIN)
BTN_ADD = EasyButton(BTN_ADD_PIN)
BTN_SUB = EasyButton(BTN_SUB_PIN)
def UPDATELCD():
if SATAE==0:#待机
print('待机界面')
lcd.clear()
lcd.move_to(0,0)
lcd.putstr('PWM:'+str(config['PWM']['VALUE']))
lcd.move_to(8,0)
lcd.putstr('FIX:'+str(config['FIXED']['VALUE']))
lcd.move_to(0,1)
lcd.putstr('ACC:'+str(config['ACCEL']['VALUE']))
lcd.move_to(8,1)
lcd.putstr('DEC:'+str(config['DECEL']['VALUE']))
elif SATAE==1:#参数选择
print('参数选择')
keys=list(config.keys())
#print(keys)
lcd.clear()
lcd.move_to(0,0)
key=keys[CURSOR]
lcd.putstr(key)
lcd.move_to(0,1)
lcd.putstr(str(config[key]["VALUE"]))
elif SATAE==2:#参数设置
print('参数设置')
lcd.clear()
keys=list(config.keys())
#print(keys)
lcd.clear()
lcd.move_to(0,0)
key=keys[CURSOR]
lcd.putstr(key)
lcd.move_to(0,1)
lcd.putstr(str(config[key]["VALUE"]))
lcd.move_to(9,1)
lcd.putstr(f"*{ARGFLOD}")
def EN_LONG_FUNC():
global SATAE
if SATAE==0:#待机
#EN长按,进入参数选择
SATAE=1
UPDATELCD()
elif SATAE==1:#参数选择
#EN长按,返回主菜单并保存
SATAE=0
UPDATELCD()
save_config()
elif SATAE==2:#参数编辑
#EN长按,返回参数选择
SATAE=1
UPDATELCD()
print(SATAE)
def EN_SHORT_FUNC():
global ARGFLOD,SATAE
if SATAE==0:#待机界面
pass
elif SATAE==1:#参数选择
SATAE=2
UPDATELCD()
elif SATAE==2:#编辑状态
#EN短按,切换参数倍率
if ARGFLOD==1:
ARGFLOD=10
elif ARGFLOD==10:
ARGFLOD=100
elif ARGFLOD==100:
ARGFLOD=1000
elif ARGFLOD==1000:
ARGFLOD=1
print(ARGFLOD)
UPDATELCD()
def ADD_SHORT_FUNC():
global CURSOR
if SATAE==0:#待机界面
pass
elif SATAE==1:#参数选择
if CURSOR<len(config)-1:
CURSOR=CURSOR+1
UPDATELCD()
print(CURSOR)
elif SATAE==2:#参数编辑
keys=list(config.keys())
key=keys[CURSOR]
VALUE=config[key]["VALUE"]
if type(VALUE)==int:
MAX=config[key]["MAX"]
config[key]["VALUE"]+=ARGFLOD
if VALUE>MAX:
config[key]["VALUE"]=MAX
elif type(VALUE)==bool:
config[key]["VALUE"]=not config[key]["VALUE"]
UPDATELCD()
def SUB_SHORT_FUNC():
global CURSOR
if SATAE==0:#待机界面
pass
elif SATAE==1:#参数选择
if CURSOR>0:
CURSOR=CURSOR-1
UPDATELCD()
print(CURSOR)
elif SATAE==2:#参数编辑
keys=list(config.keys())
key=keys[CURSOR]
VALUE=config[key]["VALUE"]
if type(VALUE)==int:
MIN=config[key]["MIN"]
config[key]["VALUE"]-=ARGFLOD
if VALUE<MIN:
config[key]["VALUE"]=MIN
elif type(VALUE)==bool:
config[key]["VALUE"]=not config[key]["VALUE"]
UPDATELCD()
# 保存到文件
def save_config(filename="config.json"):
with open(filename, "w") as file:
json.dump(config, file)
print(f"配置已保存到 {filename}")
# 从文件加载配置
def load_config(filename="config.json"):
try:
with open(filename, "r") as file:
config = json.load(file)
print(f"配置已从 {filename} 加载")
return config
except Exception as e:
print(f"加载配置失败: {e}")
return None
if __name__ == '__main__':
main()