From fcca0c49726650673a95c938d320e22bd89194b3 Mon Sep 17 00:00:00 2001 From: JonOfUs Date: Wed, 21 Aug 2024 14:32:40 +0200 Subject: [PATCH] Switch to normal Python --- main.py | 424 +++++++++++++++++++------------------------------------- 1 file changed, 139 insertions(+), 285 deletions(-) diff --git a/main.py b/main.py index 828e3b0..a81724a 100644 --- a/main.py +++ b/main.py @@ -1,386 +1,240 @@ -from neopixel import Neopixel -import utime -from machine import Pin, Timer -import _thread - - +import time +import threading +from rpi_ws281x import PixelStrip, Color +import RPi.GPIO as GPIO ####################TO DO´s########################## -# 1. Multithread für trennung von blinker und animation -# 2. buttoninterrupt für längere animationen (rainbow/police) -# - https://www.elektronik-kompendium.de/sites/raspberry-pi/2612181.htm -# 3. animation Police optimieren -# -# -# -# -# -######################################################## +# 1. Multithread for separating blinker and animation +# 2. Button interrupt for longer animations (rainbow/police) +# 3. Optimize Police animation +#################################################### +# LED strip configuration: numpix = 20 segment = 4 delay = 0.15 brightness = 100 anzahl_animationen = 5 +LED_PIN = 18 -#setup -strip_blinker = Neopixel(numpix, 0, 28, "RGB") -strip_animation = Neopixel(numpix, 0, 28, "RGB") -strip_animation.brightness(brightness) -strip_blinker.brightness(brightness) -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) +# Setup +strip_blinker = PixelStrip(numpix, LED_PIN, brightness=brightness) +strip_animation = PixelStrip(numpix, LED_PIN, brightness=brightness) +strip_blinker.begin() +strip_animation.begin() + +# Button and switch GPIO setup +button_pin = 18 +toggle_switch_left_pin = 15 +toggle_switch_right_pin = 14 + +GPIO.setmode(GPIO.BCM) +GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) +GPIO.setup(toggle_switch_left_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) +GPIO.setup(toggle_switch_right_pin, GPIO.IN, pull_up_down=GPIO.PUD_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 -blank = (0, 0, 0) -white = (255, 255, 255) - -red = (0, 255, 0) -orange = (127, 255, 0) -yellow = (255, 255, 0) -lime = (255, 127, 0) -green = (255, 0, 0) -teal = (255, 0, 127) -cyan = (255, 0, 255) -sky_blue = (127, 0, 255) -blue = (0, 0, 255) -indigo = (0, 127, 255) -magenta = (0, 255, 255) -pink = (0, 255, 127) +# Define colors +blank = Color(0, 0, 0) +white = Color(255, 255, 255) +red = Color(255, 0, 0) +orange = Color(255, 127, 0) +yellow = Color(255, 255, 0) +lime = Color(127, 255, 0) +green = Color(0, 255, 0) +teal = Color(0, 255, 127) +cyan = Color(0, 255, 255) +sky_blue = Color(0, 127, 255) +blue = Color(0, 0, 255) +indigo = Color(127, 0, 255) +magenta = Color(255, 0, 255) +pink = Color(255, 0, 127) colors = [red, orange, yellow, lime, green, teal, cyan, sky_blue, blue, indigo, magenta, pink] - ############ Blinker Links ################### def blink_links(): global blinker_links - while True: - if blinker_links == False: - break - strip_blinker.show() - + while blinker_links: + print('BLINKER LINKS') for x in reversed(range(segment)): - if blinker_links == False: + if not blinker_links: break - strip_blinker.set_pixel(x, yellow) + strip_blinker.setPixelColor(x, yellow) strip_blinker.show() - utime.sleep(delay) - - if blinker_links == False: + time.sleep(delay) + if not blinker_links: break - utime.sleep(2 * delay) + time.sleep(2 * delay) for y in range(segment): - strip_blinker.set_pixel(y, blank) + strip_blinker.setPixelColor(y, blank) strip_blinker.show() for y in range(segment): - strip_blinker.set_pixel(y, blank) + strip_blinker.setPixelColor(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() + while blinker_rechts: + print('BLINKER RECHTS') for x in range(segment): - if blinker_rechts == False: + if not blinker_rechts: break - strip_blinker.set_pixel(startpoint + x, yellow) + strip_blinker.setPixelColor(startpoint + x, yellow) strip_blinker.show() - utime.sleep(delay) - if blinker_rechts == False: + time.sleep(delay) + if not blinker_rechts: break - utime.sleep(2 * delay) + time.sleep(2 * delay) for y in range(segment): - strip_blinker.set_pixel(startpoint + y, blank) + strip_blinker.setPixelColor(startpoint + y, blank) strip_blinker.show() for y in range(segment): - strip_blinker.set_pixel(startpoint + y, blank) - strip_blinker.show() - return - - -################################################## - -# ----------------Animationen------------------# + strip_blinker.setPixelColor(startpoint + y, blank) + strip_blinker.show() ############ 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) - + for i in range(segment, numpix): + strip_animation.setPixelColor(i, blank) + strip_animation.show() + while not reset_animation: + time.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) + for i in range(segment, numpix): + strip_animation.setPixelColor(i, white) + strip_animation.show() + while not reset_animation: + time.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 - + for j in range(segment, numpix): + strip_animation.setPixelColor(j, colors[i]) + strip_animation.show() + time.sleep(delay) + if reset_animation: + licht_aus() + return ############### 3.Animation Police ############### def police(): global reset_animation + blue_segment = [4, 5, 6, 10, 11, 12] + red_segment = [7, 8, 9, 13, 14, 15] + for segment, color in [(blue_segment, blue), (red_segment, red)]: + for i in segment: + strip_animation.setPixelColor(i, color) + strip_animation.show() - 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(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() - - utime.sleep(delay * 2) - if reset_animation == True: + time.sleep(delay * 2) + if reset_animation: 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 - + kit_delay = 0.01 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: + + # Left to Right + for x in range(segment, numpix - 2): + strip_animation.setPixelColor(x + 1, red) + time.sleep(kit_delay) + strip_animation.show() + strip_animation.setPixelColor(x, red) + time.sleep(kit_delay) + strip_animation.show() + strip_animation.setPixelColor(x + 2, red) + time.sleep(kit_delay) + strip_animation.show() + strip_animation.setPixelColor(x, blank) + time.sleep(kit_delay) + strip_animation.setPixelColor(x + 1, blank) + time.sleep(kit_delay) + strip_animation.setPixelColor(x + 2, blank) + strip_animation.show() + if reset_animation: 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() - if reset_animation == True: + # Right to Left + for x in reversed(range(segment + 1, numpix - 2)): + strip_animation.setPixelColor(x + 1, red) + time.sleep(kit_delay) + strip_animation.show() + strip_animation.setPixelColor(x, red) + time.sleep(kit_delay) + strip_animation.show() + strip_animation.setPixelColor(x + 2, red) + time.sleep(kit_delay) + strip_animation.show() + strip_animation.setPixelColor(x, blank) + time.sleep(kit_delay) + strip_animation.setPixelColor(x + 1, blank) + time.sleep(kit_delay) + strip_animation.setPixelColor(x + 2, blank) + strip_animation.show() + if reset_animation: licht_aus() return - -################################################## -# -----------------------------------------------# - - -button = Pin(18, Pin.IN, Pin.PULL_UP) - - -########################################################################### - -# INTERRUPT HANDLER +# INTERRUPT HANDLERS # Blinker Links -def switch_left_up(pin): +def switch_left_up(channel): global blinker_links, blinker_rechts - # stop blinker rechts if running - if blinker_rechts == True: + if blinker_rechts: blinker_rechts = False - - # do nothing if blinker links is already running - if blinker_links == True: + if blinker_links: return - blinker_links = True + threading.Thread(target=blink_links).start() - # start blinker links - - _thread.start_new_thread(blink_links, ()) - - -def switch_left_down(pin): +def switch_left_down(channel): 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) +GPIO.add_event_detect(toggle_switch_left_pin, GPIO.RISING, callback=switch_left_up) +GPIO.add_event_detect(toggle_switch_left_pin, GPIO.FALLING, callback=switch_left_down) # Blinker Rechts -def switch_right_up(pin): +def switch_right_up(channel): global blinker_rechts, blinker_links - # stop blinker links if running - if blinker_links == True: + if blinker_links: blinker_links = False - - # do nothing if blinker rechts is already running - if blinker_rechts == True: + if blinker_rechts: return - blinker_rechts = True + threading.Thread(target=blink_rechts).start() - # start blinker rechts - - _thread.start_new_thread(blink_rechts, ()) - - -def switch_right_down(pin): +def switch_right_down(channel): 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) - +GPIO.add_event_detect(toggle_switch_right_pin, GPIO.RISING, callback=switch_right_up) +GPIO.add_event_detect(toggle_switch_right_pin, GPIO.FALLING, callback=switch_right_down) # Button Interrupt -def button_pressed(pin): +def button_pressed(channel): 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): - 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 animation_loop(): - global animation_NR, reset_animation - while True: - reset_animation = False - if animation_NR == 0: - licht_aus() - elif animation_NR == 1: - fernlicht_an() - elif animation_NR == 2: - rainbow() - elif animation_NR == 3: - police() - elif animation_NR == 4: - kit() - - -def test_loop(): - while True: - - #rainbow() - # kit() - # fernlicht_an() - utime.sleep(0.5) - # licht_aus() - # utime.sleep(0.5) - # police() - print('thread1') - - blink_rechts() - blink_links() - - -# start blinker_loop on second core -#_thread.start_new_thread(animation_loop, ()) - -#blinker_loop() -animation_loop() -#test_loop() +GPIO.add_event_detect