grillator/main.py
2024-08-21 14:32:40 +02:00

240 lines
7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import time
import threading
from rpi_ws281x import PixelStrip, Color
import RPi.GPIO as GPIO
####################TO DO´s##########################
# 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 = 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
reset_animation = False
# 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 blinker_links:
print('BLINKER LINKS')
for x in reversed(range(segment)):
if not blinker_links:
break
strip_blinker.setPixelColor(x, yellow)
strip_blinker.show()
time.sleep(delay)
if not blinker_links:
break
time.sleep(2 * delay)
for y in range(segment):
strip_blinker.setPixelColor(y, blank)
strip_blinker.show()
for y in range(segment):
strip_blinker.setPixelColor(y, blank)
strip_blinker.show()
############ Blinker Rechts ##################
def blink_rechts():
global blinker_rechts
startpoint = numpix - segment
while blinker_rechts:
print('BLINKER RECHTS')
for x in range(segment):
if not blinker_rechts:
break
strip_blinker.setPixelColor(startpoint + x, yellow)
strip_blinker.show()
time.sleep(delay)
if not blinker_rechts:
break
time.sleep(2 * delay)
for y in range(segment):
strip_blinker.setPixelColor(startpoint + y, blank)
strip_blinker.show()
for y in range(segment):
strip_blinker.setPixelColor(startpoint + y, blank)
strip_blinker.show()
############ 0.Animation Licht aus ################
def licht_aus():
global reset_animation
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(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(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()
time.sleep(delay * 2)
if reset_animation:
licht_aus()
return
############### 4.Animation Kit ###############
def kit():
global reset_animation
kit_delay = 0.01
strip_animation.show()
# 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
# 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
# INTERRUPT HANDLERS
# Blinker Links
def switch_left_up(channel):
global blinker_links, blinker_rechts
if blinker_rechts:
blinker_rechts = False
if blinker_links:
return
blinker_links = True
threading.Thread(target=blink_links).start()
def switch_left_down(channel):
global blinker_links
blinker_links = False
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(channel):
global blinker_rechts, blinker_links
if blinker_links:
blinker_links = False
if blinker_rechts:
return
blinker_rechts = True
threading.Thread(target=blink_rechts).start()
def switch_right_down(channel):
global blinker_rechts
blinker_rechts = False
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(channel):
global debouncing, animation_NR, reset_animation
animation_NR = (animation_NR + 1) % anzahl_animationen
reset_animation = True
GPIO.add_event_detect