基于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#

大道至简