Creater start-stop-rainbow
This commit is contained in:
parent
a8a8819307
commit
a0adc777c6
1 changed files with 122 additions and 0 deletions
122
start_stop_animation.py
Normal file
122
start_stop_animation.py
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Example Rainbow Animation for Neopixel LED with GPIO Control
|
||||||
|
"""
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
from RPi import GPIO
|
||||||
|
from rpi_ws281x import Adafruit_NeoPixel, Color
|
||||||
|
|
||||||
|
# NeoPixel configuration
|
||||||
|
PIN_NEO_PIXEL = 18
|
||||||
|
NUM_PIXELS = 24
|
||||||
|
DELAY_INTERVAL = 0.0042
|
||||||
|
GPIO_PIN = 16
|
||||||
|
MAX_BRIGHTNESS = 255
|
||||||
|
ANIMATION_TIME = 23
|
||||||
|
TIME_EXTENDED = 10
|
||||||
|
DEBUG_MSG = True
|
||||||
|
|
||||||
|
# Setup GPIO
|
||||||
|
GPIO.setmode(GPIO.BCM)
|
||||||
|
GPIO.setup(GPIO_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
|
||||||
|
|
||||||
|
# Create NeoPixel object
|
||||||
|
NeoPixel = Adafruit_NeoPixel(NUM_PIXELS, PIN_NEO_PIXEL)
|
||||||
|
NeoPixel.begin() # Initialize NeoPixel strip object
|
||||||
|
|
||||||
|
def wheel(pos):
|
||||||
|
"""Generate rainbow colors across 0-255 positions."""
|
||||||
|
pos = pos % 256 # Ensure pos stays within 0-255 range
|
||||||
|
if pos < 85:
|
||||||
|
return Color(pos * 3, 255 - pos * 3, 0)
|
||||||
|
pos -= 85
|
||||||
|
if pos < 85:
|
||||||
|
return Color(255 - pos * 3, 0, pos * 3)
|
||||||
|
pos -= 85
|
||||||
|
return Color(0, pos * 3, 255 - pos * 3)
|
||||||
|
|
||||||
|
def rainbow_animation():
|
||||||
|
"""
|
||||||
|
Running Rainbow animation, defined in wheel
|
||||||
|
"""
|
||||||
|
print("Start animation") if DEBUG_MSG else None
|
||||||
|
start_time = time.time()
|
||||||
|
brightness = 0 # Initial brightness
|
||||||
|
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
# Calculate elapsed time
|
||||||
|
elapsed_time = time.time() - start_time
|
||||||
|
print(f"Time: {int(elapsed_time)}") if DEBUG_MSG else None
|
||||||
|
if elapsed_time >= ANIMATION_TIME:
|
||||||
|
while True:
|
||||||
|
elapsed_time = time.time() - start_time
|
||||||
|
print(f"Time: {int(elapsed_time)} (extended)") if DEBUG_MSG else None
|
||||||
|
if elapsed_time >= int(ANIMATION_TIME + TIME_EXTENDED):
|
||||||
|
break
|
||||||
|
for j in range(255):
|
||||||
|
for pxl in range(NUM_PIXELS):
|
||||||
|
color = Color(255, 255, 255)
|
||||||
|
NeoPixel.setPixelColor(pxl, color)
|
||||||
|
NeoPixel.show()
|
||||||
|
# Check if GPIO16 is grounded to reset animation
|
||||||
|
if GPIO.input(GPIO_PIN) == GPIO.LOW:
|
||||||
|
return
|
||||||
|
break # Exit if time elapsed
|
||||||
|
|
||||||
|
# Increase brightness gradually
|
||||||
|
brightness = int((elapsed_time / ANIMATION_TIME) * MAX_BRIGHTNESS)
|
||||||
|
NeoPixel.setBrightness(brightness)
|
||||||
|
|
||||||
|
# Rainbow cycle animation
|
||||||
|
for j in range(255):
|
||||||
|
for pixel in range(NUM_PIXELS):
|
||||||
|
color = wheel((pixel * 256 // NUM_PIXELS) + j)
|
||||||
|
NeoPixel.setPixelColor(pixel, color)
|
||||||
|
NeoPixel.show()
|
||||||
|
time.sleep(DELAY_INTERVAL)
|
||||||
|
|
||||||
|
# Check if GPIO16 is grounded to reset animation
|
||||||
|
if GPIO.input(GPIO_PIN) == GPIO.LOW and int(elapsed_time) >= 5:
|
||||||
|
return
|
||||||
|
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("exit animation") if DEBUG_MSG else None
|
||||||
|
NeoPixel.setBrightness(0) # Reset brightness
|
||||||
|
for pixel in range(NUM_PIXELS):
|
||||||
|
NeoPixel.setPixelColor(pixel, Color(0, 0, 0))
|
||||||
|
NeoPixel.show()
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
finally:
|
||||||
|
print("end animation") if DEBUG_MSG else None
|
||||||
|
# Clean up code before exiting the script
|
||||||
|
NeoPixel.setBrightness(0) # Reset brightness
|
||||||
|
for pixel in range(NUM_PIXELS):
|
||||||
|
NeoPixel.setPixelColor(pixel, Color(0, 0, 0))
|
||||||
|
NeoPixel.show()
|
||||||
|
|
||||||
|
try:
|
||||||
|
print("waiting input") if DEBUG_MSG else None
|
||||||
|
while True:
|
||||||
|
# Wait for GPIO16 to be grounded
|
||||||
|
GPIO.wait_for_edge(GPIO_PIN, GPIO.FALLING)
|
||||||
|
rainbow_animation()
|
||||||
|
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("exit waiting input") if DEBUG_MSG else None
|
||||||
|
NeoPixel.setBrightness(0) # Reset brightness
|
||||||
|
for pixel in range(NUM_PIXELS):
|
||||||
|
NeoPixel.setPixelColor(pixel, Color(0, 0, 0))
|
||||||
|
NeoPixel.show()
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
finally:
|
||||||
|
NeoPixel.setBrightness(0) # Reset brightness
|
||||||
|
for pixel in range(NUM_PIXELS):
|
||||||
|
NeoPixel.setPixelColor(pixel, Color(0, 0, 0))
|
||||||
|
NeoPixel.show()
|
||||||
|
GPIO.cleanup()
|
||||||
|
sys.exit()
|
Loading…
Reference in a new issue