from machine import Pin, PWM
import time
# ========== 硬件初始化 ==========
# 舵机:信号脚GPIO13,PWM频率50Hz(舵机标准)
servo = PWM(Pin(13), freq=50)
# 3个按键:上拉输入,按下为低电平
key_add = Pin(15, Pin.IN, Pin.PULL_UP)
key_sub = Pin(16, Pin.IN, Pin.PULL_UP)
key_switch = Pin(17, Pin.IN, Pin.PULL_UP)
# ========== 全局参数 ==========
angle = 90 # 舵机初始角度
step = 5 # 单次角度变化步长
hold_ms = 300 # 长按判定阈值(毫秒)
# ========== 核心函数:角度转舵机PWM占空比 ==========
def set_angle(x):
# 限制角度区间 0~180,防止越界
x = max(0, min(180, x))
# 课件公式:duty = (x/90 + 0.5) / 20 * 1023
duty = int((x / 90 + 0.5) / 20 * 1023)
servo.duty(duty)
return x
# 上电初始化舵机位置
angle = set_angle(angle)
# ========== 主循环:持续扫描按键 ==========
while True:
# 1. 角度增加按键处理
if not key_add.value():
t0 = time.ticks_ms()
# 按住不放循环
while not key_add.value():
# 长按判定:超过hold_ms持续加角度
if time.ticks_ms() - t0 > hold_ms:
angle = set_angle(angle + step)
time.sleep_ms(50)
# 短按:松开后单次加角度
if time.ticks_ms() - t0 < hold_ms:
angle = set_angle(angle + step)
time.sleep_ms(20)
# 2. 角度减少按键处理
if not key_sub.value():
t0 = time.ticks_ms()
while not key_sub.value():
if time.ticks_ms() - t0 > hold_ms:
angle = set_angle(angle - step)
time.sleep_ms(50)
if time.ticks_ms() - t0 < hold_ms:
angle = set_angle(angle - step)
time.sleep_ms(20)
# 3. 0° / 180° 一键切换按键
if not key_switch.value():
angle = set_angle(0 if angle > 90 else 180)
time.sleep_ms(300) # 长按消抖