BPI-Leaf-S3 设计按键中断程序 控制彩灯, ESP32-S3 & MicroPython

BPI-Leaf-S3 有两颗按键,BOOT 与 RST,RST控制芯片硬件复位,而BOOT则与GPIO0相连,其电路如下图所示。

image

可见当开发板正常通电工作时,GPIO0在BOOT按键未按下时,串联一颗电阻接到3.3v,此时为高电位;当BOOT按键按下时,GPIO0将直接接地,此时则为低电位。ESP32-S3芯片通过检测此GPIO管脚的电位即可判断按钮是否被按下。

MicroPython

Micropython 运行环境搭建 - Banana Pi Wiki (banana-pi.org)

MicroPython GPIO中断程序 machine.Pin.irq 文档

在程序中,通过检测 GPIO中断的触发方式,即可设计一套记录按键被按压的次数的中断程序,用判断当前已经按压的次数来控制彩灯的颜色。

from machine import Pin
from neopixel import NeoPixel
from array import array
import time
import micropython

micropython.alloc_emergency_exception_buf(100)

p_48 = Pin(48, Pin.OUT)
np = NeoPixel(p_48, 1,bpp=3, timing=1)

p0 = Pin(0,Pin.IN,Pin.PULL_UP)
trig_locks = array('B',[0])
trig_timeticks_list = array('L',[0,0])
count = array('L',[0])

def p0_irq(pin):
    if pin.value()==0 and trig_locks[0]==0:
        trig_timeticks_list[0]=time.ticks_ms()
        trig_locks[0]=1
    elif pin.value()==1 and trig_locks[0]==1:
        trig_timeticks_list[1]=time.ticks_diff(time.ticks_ms(),trig_timeticks_list[0])
        trig_locks[0]=0
        if trig_timeticks_list[1] >= 20:
            count[0] = count[0] + 1
            if count[0] > 8:
                count[0] = 0

p0.irq(handler=p0_irq,trigger= Pin.IRQ_FALLING | Pin.IRQ_RISING )

RED = (255, 0, 0)
ORANGE = (255, 100, 0)
YELLOW = (255, 255, 0)
GREEN = (0, 255, 0)
CYAN = (0, 255, 255)
BLUE = (0, 0, 255)
PURPLE = (180, 0, 255)
WHITE = (255, 255, 255)
OFF = (0, 0, 0)

color_list = [RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE,WHITE,OFF]
brightness = 0.1

while True:
    print (count)
    i = color_list[count[0]]
    color = (round(i[0]*brightness),round(i[1]*brightness),round(i[2]*brightness))
    np[0] = color
    np.write()
    time.sleep(0.1)

BPI-Leaf-S3 开发板 - Banana Pi Wiki (banana-pi.org)