From f6d1f4c3991fe0c9ac00183a70a85f32cef05448 Mon Sep 17 00:00:00 2001 From: JonOfUs Date: Fri, 9 Aug 2024 00:46:46 +0200 Subject: [PATCH] Button interrupt and parallelize blinker --- main.py | 347 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 190 insertions(+), 157 deletions(-) diff --git a/main.py b/main.py index b04994e..828e3b0 100644 --- a/main.py +++ b/main.py @@ -22,7 +22,7 @@ segment = 4 delay = 0.15 brightness = 100 anzahl_animationen = 5 -global animation_NR + #setup strip_blinker = Neopixel(numpix, 0, 28, "RGB") strip_animation = Neopixel(numpix, 0, 28, "RGB") @@ -32,6 +32,17 @@ button = Pin(18, Pin.IN, Pin.PULL_UP) toggle_switch_left = Pin(15, Pin.IN, Pin.PULL_DOWN) toggle_switch_right = Pin(14, Pin.IN, Pin.PULL_DOWN) +blinker_links = False +blinker_rechts = False + +animation_NR = 0 +# Define the debounce timer +debounce_timer = Timer() + +# Flag to indicate if the button is being debounced +debouncing = False + +reset_animation = False #Farben definnieren @@ -56,38 +67,60 @@ colors = [red, orange, yellow, lime, green, teal, cyan, sky_blue, blue, indigo, ############ Blinker Links ################### def blink_links(): + global blinker_links while True: + if blinker_links == False: + break strip_blinker.show() for x in reversed(range(segment)): + if blinker_links == False: + break strip_blinker.set_pixel(x, yellow) strip_blinker.show() utime.sleep(delay) + + if blinker_links == False: + break utime.sleep(2 * delay) for y in range(segment): strip_blinker.set_pixel(y, blank) strip_blinker.show() - return + + for y in range(segment): + strip_blinker.set_pixel(y, blank) + strip_blinker.show() + return ################################################## ############ Blinker Rechts ################## def blink_rechts(): + global blinker_rechts startpoint = numpix - segment while True: + if blinker_rechts == False: + break strip_blinker.show() - for x in range(segment): + if blinker_rechts == False: + break strip_blinker.set_pixel(startpoint + x, yellow) strip_blinker.show() utime.sleep(delay) + if blinker_rechts == False: + break utime.sleep(2 * delay) for y in range(segment): strip_blinker.set_pixel(startpoint + y, blank) strip_blinker.show() - return + + for y in range(segment): + strip_blinker.set_pixel(startpoint + y, blank) + strip_blinker.show() + return ################################################## @@ -95,128 +128,137 @@ def blink_rechts(): # ----------------Animationen------------------# ############ 0.Animation Licht aus ################ - def licht_aus(): + global reset_animation for i in range(numpix - segment): if i >= segment: strip_animation.set_pixel(i, blank) strip_animation.show() + while reset_animation == False: + utime.sleep(delay) -################################################## - ############### 1.Animation Licht an ############### def fernlicht_an(): + global reset_animation for i in range(numpix - segment): if i >= segment: strip_animation.set_pixel(i, white) strip_animation.show() + while reset_animation == False: + utime.sleep(delay) + licht_aus() ############### 2.Animation Rainbow ############### def rainbow(): - + global reset_animation for i in range(len(colors)): for j in range(numpix - segment): if j >= segment: strip_animation.set_pixel(j, colors[i]) strip_animation.show() utime.sleep(delay) + if reset_animation == True: + licht_aus() + return -################################################## - ############### 3.Animation Police ############### - - def police(): - while True: + global reset_animation - strip_animation.set_pixel(4, blue) - strip_animation.set_pixel(5, blue) - strip_animation.set_pixel(6, blue) + strip_animation.set_pixel(4, blue) + strip_animation.set_pixel(5, blue) + strip_animation.set_pixel(6, blue) - strip_animation.set_pixel(7, red) - strip_animation.set_pixel(8, red) - strip_animation.set_pixel(9, red) + strip_animation.set_pixel(7, red) + strip_animation.set_pixel(8, red) + strip_animation.set_pixel(9, red) - strip_animation.set_pixel(10, blue) - strip_animation.set_pixel(11, blue) - strip_animation.set_pixel(12, blue) + strip_animation.set_pixel(10, blue) + strip_animation.set_pixel(11, blue) + strip_animation.set_pixel(12, blue) - strip_animation.set_pixel(13, red) - strip_animation.set_pixel(14, red) - strip_animation.set_pixel(15, red) - strip_animation.show() + strip_animation.set_pixel(13, red) + strip_animation.set_pixel(14, red) + strip_animation.set_pixel(15, red) + strip_animation.show() - utime.sleep(delay * 2) - strip_animation.set_pixel(4, red) - strip_animation.set_pixel(5, red) - strip_animation.set_pixel(6, red) - - strip_animation.set_pixel(7, blue) - strip_animation.set_pixel(8, blue) - strip_animation.set_pixel(9, blue) - - strip_animation.set_pixel(10, red) - strip_animation.set_pixel(11, red) - strip_animation.set_pixel(12, red) - - strip_animation.set_pixel(13, blue) - strip_animation.set_pixel(14, blue) - strip_animation.set_pixel(15, blue) - strip_animation.show() - - utime.sleep(delay * 2) + utime.sleep(delay * 2) + if reset_animation == True: + licht_aus() return + + strip_animation.set_pixel(4, red) + strip_animation.set_pixel(5, red) + strip_animation.set_pixel(6, red) + strip_animation.set_pixel(7, blue) + strip_animation.set_pixel(8, blue) + strip_animation.set_pixel(9, blue) + + strip_animation.set_pixel(10, red) + strip_animation.set_pixel(11, red) + strip_animation.set_pixel(12, red) + + strip_animation.set_pixel(13, blue) + strip_animation.set_pixel(14, blue) + strip_animation.set_pixel(15, blue) + strip_animation.show() + + utime.sleep(delay * 2) -################################################## ############### 4.Animation Kit ############### def kit(): + global reset_animation delay = 0.01 - while True: - strip_animation.show() - ############### Left to Right ############### - for x in range(numpix - segment - 2): - if x >= segment: - strip_animation.set_pixel(x + 1, red) - utime.sleep(delay) - strip_animation.show() - strip_animation.set_pixel(x, red) - utime.sleep(delay) - strip_animation.show() - strip_animation.set_pixel(x + 2, red) - utime.sleep(delay) - strip_animation.show() - strip_animation.set_pixel(x, blank) - utime.sleep(delay) - strip_animation.set_pixel(x + 1, blank) - utime.sleep(delay) - strip_animation.set_pixel(x + 2, blank) - strip_animation.show() + strip_animation.show() + ############### Left to Right ############### + for x in range(numpix - segment - 2): + if x >= segment: + strip_animation.set_pixel(x + 1, red) + utime.sleep(delay) + strip_animation.show() + strip_animation.set_pixel(x, red) + utime.sleep(delay) + strip_animation.show() + strip_animation.set_pixel(x + 2, red) + utime.sleep(delay) + strip_animation.show() + strip_animation.set_pixel(x, blank) + utime.sleep(delay) + strip_animation.set_pixel(x + 1, blank) + utime.sleep(delay) + strip_animation.set_pixel(x + 2, blank) + strip_animation.show() + if reset_animation == True: + licht_aus() + return - ############### Left to Right ############### - for x in reversed(range(numpix - segment - 2)): - if x > segment: - strip_animation.set_pixel(x + 1, red) - utime.sleep(delay) - strip_animation.show() - strip_animation.set_pixel(x, red) - utime.sleep(delay) - strip_animation.show() - strip_animation.set_pixel(x + 2, red) - utime.sleep(delay) - strip_animation.show() - strip_animation.set_pixel(x, blank) - utime.sleep(delay) - strip_animation.set_pixel(x + 1, blank) - utime.sleep(delay) - strip_animation.set_pixel(x + 2, blank) - strip_animation.show() - return + ############### Left to Right ############### + for x in reversed(range(numpix - segment - 2)): + if x > segment: + strip_animation.set_pixel(x + 1, red) + utime.sleep(delay) + strip_animation.show() + strip_animation.set_pixel(x, red) + utime.sleep(delay) + strip_animation.show() + strip_animation.set_pixel(x + 2, red) + utime.sleep(delay) + strip_animation.show() + strip_animation.set_pixel(x, blank) + utime.sleep(delay) + strip_animation.set_pixel(x + 1, blank) + utime.sleep(delay) + strip_animation.set_pixel(x + 2, blank) + strip_animation.show() + if reset_animation == True: + licht_aus() + return ################################################## @@ -225,92 +267,89 @@ def kit(): button = Pin(18, Pin.IN, Pin.PULL_UP) -############### Schalterstellung ############### - -def get_switch_left(): - global status_links - - if toggle_switch_left.value() == 1: - status_links = 1 - elif toggle_switch_left.value() == 0: - status_links = 0 - return status_links - - - - -def get_switch_right(): - global status_rechts - - if toggle_switch_right.value() == 1: - status_rechts = 1 - elif toggle_switch_right.value() == 0: - status_rechts = 0 - return - ########################################################################### # INTERRUPT HANDLER -def switch_left(pin): - pass +# Blinker Links +def switch_left_up(pin): + global blinker_links, blinker_rechts + # stop blinker rechts if running + if blinker_rechts == True: + blinker_rechts = False -def switch_left_debouncer(pin): - Timer().init(mode=Timer.ONE_SHOT, period=200, callback=switch_left) + # do nothing if blinker links is already running + if blinker_links == True: + return + + blinker_links = True -toggle_switch_left.irq(handler=switch_left_debouncer, trigger=Pin.IRQ_RISING) + # start blinker links + + _thread.start_new_thread(blink_links, ()) -def switch_right(pin): - pass - -def switch_right_debouncer(pin): - Timer().init(mode=Timer.ONE_SHOT, period=200, callback=switch_right) - -toggle_switch_right.irq(handler=switch_right_debouncer, trigger=Pin.IRQ_RISING) +def switch_left_down(pin): + global blinker_links + blinker_links = False + +toggle_switch_left.irq(handler=switch_left_up, trigger=Pin.IRQ_RISING) +toggle_switch_left.irq(handler=switch_left_down, trigger=Pin.IRQ_FALLING) +# Blinker Rechts +def switch_right_up(pin): + global blinker_rechts, blinker_links + # stop blinker links if running + if blinker_links == True: + blinker_links = False + + # do nothing if blinker rechts is already running + if blinker_rechts == True: + return + + blinker_rechts = True + + # start blinker rechts + + _thread.start_new_thread(blink_rechts, ()) + + +def switch_right_down(pin): + global blinker_rechts + blinker_rechts = False + +toggle_switch_right.irq(handler=switch_right_up, trigger=Pin.IRQ_RISING) +toggle_switch_right.irq(handler=switch_right_down, trigger=Pin.IRQ_FALLING) + + +# Button Interrupt def button_pressed(pin): - pass + global debouncing, animation_NR, reset_animation + # Handle the button press event + animation_NR = (animation_NR + 1) % anzahl_animationen + # Reset the debouncing flag + debouncing = False + reset_animation = True def button_debouncer(pin): - Timer().init(mode=Timer.ONE_SHOT, period=200, callback=button_pressed) + global debouncing + if not debouncing: + debouncing = True + debounce_timer.init(mode=Timer.ONE_SHOT, period=200, callback=lambda t: button_pressed(pin)) +# Set up the button interrupt with the debouncer button.irq(handler=button_debouncer, trigger=Pin.IRQ_RISING) ########################################################################### # MAIN LOOPS - -def blinker_loop(): - - while True: - get_switch_left() - get_switch_right() - - if status_rechts == 1: - blink_rechts() - if status_links == 1: - blink_links() - - utime.sleep(0.1) - - def animation_loop(): - animation_NR = 0 + global animation_NR, reset_animation while True: - - if button.value() == 1: - print(animation_NR) - elif button.value() == 0: - if animation_NR < anzahl_animationen - 1: - animation_NR = animation_NR + 1 - else: - animation_NR = 0 - print(animation_NR) - utime.sleep(delay) + reset_animation = False if animation_NR == 0: licht_aus() elif animation_NR == 1: @@ -323,12 +362,6 @@ def animation_loop(): kit() -def test_loop2(): - while True: - utime.sleep(0.5) - print('thread2') - - def test_loop(): while True: @@ -346,8 +379,8 @@ def test_loop(): # start blinker_loop on second core -_thread.start_new_thread(test_loop2, ()) +#_thread.start_new_thread(animation_loop, ()) #blinker_loop() -#animation_loop() -test_loop() +animation_loop() +#test_loop()