Is there a way to trigger a different function with each button that is pressed on runtime without having to use a while loop and constantly check to see if a button is being pressed?
Use an interrupt on each button.
See chapter 6 in Official MicroPython Pico Guide.
Here is a simple example with button and an LED.
# Interrupt example import machine import time pressed = False led = machine.Pin(8, machine.Pin.OUT) button = machine.Pin(14,machine.Pin.IN,machine.Pin.PULL_DOWN) def button_handler(pin): time.sleep(0.05) # debounce global pressed if not pressed: pressed = True led.value(0) else: pressed = False led.value(1) button.irq(trigger = machine.Pin.IRQ_RISING, handler = button_handler) # Main loop c = 0 while True: print(c) c = c + 1
1 keep the interrupt routine very short
2 Do not use time.sleep() in the main loop
I hope this helps.
I really appreciate your response. I understand how to do this using a regular button. The problem that I’m having is that the Pico Display Pack 2 has its own set of buttons that function through one of the pimoroni libraries and I’m not able to use the regular methods that I would use with a button.
Your code shows exactly what I want to do but I need to find a way using the pimoroni Display pack 2 library.
You don’t need the pimoroni libraries to use the buttons, They are wired to usable pins. Check the pinout to see what button uses what pin. Pressing the button grounds that pin.
I know it seems straight forward but this has not worked for me.
It can be frustrating, when things don’t work as planned.
The Buttons on the Display Pack are just “normal buttons”. The Pimoroni Button Library just makes it easier to use them in Micro Python, thats all.
Just be careful you don’t mix up GP number versus the physical pin number.
Button A, SW_A is wired to physical pin 16, which is GP12.
This may help.
It sets up a counter running flat out without any button polling.
You can change the colour of the display and the direction of the count with the buttons. Give it a go.
# Interrupt example using the Pimoroni Display 2 # Tony Goodhew 23 Sept 2023 from machine import Pin import time import gc from picographics import PicoGraphics, DISPLAY_PICO_DISPLAY_2, PEN_RGB332 from pimoroni import RGBLED display = PicoGraphics(display=DISPLAY_PICO_DISPLAY_2, pen_type=PEN_RGB332, rotate=0) display.set_backlight(1.0) display.set_font("bitmap8") led = RGBLED(6, 7, 8) led.set_rgb(0,0,0) #Turn off the RGBLED WHITE = display.create_pen(255, 255, 255) BLACK = display.create_pen(0, 0, 0) RED = display.create_pen(200, 0, 0) BLUE = display.create_pen(0, 0, 200) GREEN = display.create_pen(0, 200, 0) COL = WHITE delta = 1 led = Pin(25, Pin.OUT) swA = Pin(12, Pin.IN, Pin.PULL_UP) swB = Pin(13, Pin.IN, Pin.PULL_UP) swX = Pin(14, Pin.IN, Pin.PULL_UP) swY = Pin(15, Pin.IN, Pin.PULL_UP) def sw_handlerA(pin): time.sleep(0.05) # debounce global COL COL = display.create_pen(200, 0, 0) # RED def sw_handlerB(pin): time.sleep(0.05) # debounce global COL COL = display.create_pen(0, 200, 0) # GREEN def sw_handlerX(pin): time.sleep(0.05) # debounce global COL COL = display.create_pen(0, 0, 200) # BLUE def sw_handlerY(pin): time.sleep(0.05) # debounce global COL global delta COL = display.create_pen(200, 200, 0) # YELLOW delta = delta * -1 # Reverse count direction swA.irq(trigger = machine.Pin.IRQ_FALLING, handler = sw_handlerA) swB.irq(trigger = machine.Pin.IRQ_FALLING, handler = sw_handlerB) swX.irq(trigger = machine.Pin.IRQ_FALLING, handler = sw_handlerX) swY.irq(trigger = machine.Pin.IRQ_FALLING, handler = sw_handlerY) count = 0 # The following loop runs flat out - NO time.sleep() while True: display.set_pen(BLACK) display.clear() count = count + delta display.set_pen(COL) display.text(str(count), 10,10,300,6) display.update()
Hey Tonygo2, this works perfectly! Thank you for taking the time to help with this. Now that I see your code I can see how I was implementing the interrupt in the wrong way. Now I can implement it into my project. Awesome job. Extra brownie points for you. Thanks again!
Glad to help. I hope the project works out.