基于Micropython编写的GOIP 4的状态变更示例,用于快捷测试。
# ESP32 MicroPython GPIO状态变更测试示例
# 在ESP32开发板上,通过中断(IRQ)获取GPIO电平的变化,并打印日志。
# 默认将输入引脚GPIO4上拉,建议接一个按钮到GND以测试。
# 可选:用GPIO2作为LED输出,同步反映输入状态。
from machine import Pin
import utime
import micropython
# ====== 配置区域 ======
INPUT_PIN_NUMBER = 4 # 输入引脚,默认使用GPIO4(安全通用)。可按需修改,如 5、18 等。
LED_PIN_NUMBER = 2 # 有些ESP32开发板板载LED在GPIO2;若没有LED可保留或修改。
DEBOUNCE_MS = 50 # 消抖时间窗口(毫秒)。
# 注意:ESP32的GPIO34-39为输入专用且不具备内部上拉/下拉,若使用这些引脚请外接电阻。
# ====== 初始化引脚 ======
# 使用内部上拉电阻,按钮按下接地(GND)时电平从1变为0。
pin_in = Pin(INPUT_PIN_NUMBER, Pin.IN, Pin.PULL_UP)
led = Pin(LED_PIN_NUMBER, Pin.OUT)
# 初始状态记录
last_state = pin_in.value()
last_ms = utime.ticks_ms()
print("启动GPIO状态监测: GPIO{} 初始值={}".format(INPUT_PIN_NUMBER, last_state))
# LED同步显示当前输入状态(可按需反转或移除)
try:
led.value(last_state)
except Exception:
pass
# ====== 事件处理 ======
def _scheduled_handler(_):
"""
在主上下文执行的处理函数(由IRQ调度),做消抖、读取状态并打印日志。
"""
global last_ms, last_state
now = utime.ticks_ms()
# 消抖:若在窗口内重复触发,直接忽略
if utime.ticks_diff(now, last_ms) < DEBOUNCE_MS:
return
last_ms = now
s = pin_in.value()
if s != last_state:
last_state = s
try:
led.value(s)
except Exception:
pass
# s: 1为高电平,0为低电平
print("[{} ms] GPIO{} 状态变更为: {}".format(now, INPUT_PIN_NUMBER, s))
def _irq_handler(pin):
"""
硬件中断回调。在中断上下文中尽量不做耗时操作,使用micropython.schedule调度到主线程。
若schedule不可用或失败,则降级为直接调用。
"""
try:
micropython.schedule(_scheduled_handler, 0)
except Exception:
_scheduled_handler(0)
# 监听上升沿与下降沿
pin_in.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=_irq_handler)
# 主循环保持运行(IRQ在后台触发处理)
while True:
utime.sleep_ms(250)
自用固件版本
https://github.com/hanfp520/MicropythonVersion#