Ich nutze pi-blaster und ein Python-Script um meinen LED-Strip anzusteuern.
Wenn ich das Script in IDLE ausführe läuft alles wunderbar.
Wenn ich das Script jedoch in der Konsole (egal ob lokal oder via PUTTY) starte, wird der LED-Strip nur sporadisch geschaltet (Ich meine immer wenn eine Konsolenausgabe erfolgt, bin mir da aber nicht ganz sicher)
Das Script enthält im Wesentlichen Schleifen mit
und
War die ganze Arbeit jetzt umsonst? =(
lg, couka
Falls sich jemand das ganze Script antun möchte
Code
#!/usr/bin/env python
# coding: utf8
#========================================
#KONFIGURATION
pinred = 23 #GPIO-Pin für rot
pingreen = 24 #GPIO-Pin für grün
pinblue = 25 #GPIO-Pin für blau
timeoffset = 2.7 #Anfangs-Zeit-Korrektur in s für fades (Standard 2.7), wird im laufenden Betrieb automatisch angepasst
timeoffsetadd = 0.25 #zusätzliche Korrektur falls automatische Zeit-Korrektur daneben liegt (Standard 0.21)
#ENDE DER KONFIGURATION
#AB HIER NICHTS ÄNDERN!!!
#========================================
import os
import time
import math
global lumred
global lumgreen
global lumblue
lumred = 0
lumgreen = 0
lumblue = 0
def setcolor(color, lum):
global lumred
global lumgreen
global lumblue
round(lum, 3)
if(lum > 1):
lum = 1
if (lum < 0.001):
lum = 0
if (color == "red"):
pin = pinred
lumred = lum
if (color == "green"):
pin = pingreen
lumgreen = lum
if (color == "blue"):
pin = pinblue
lumblue = lum
resultcode = os.system("echo '" + str(pin) + "=" + str(lum) + "' > /dev/pi-blaster")
def setcolors(red, green, blue):
global lumred
global lumgreen
global lumblue
round(red, 3)
round(green, 3)
round(blue, 3)
if(red > 1):
red = 1
if (red < 0.001):
red = 0
if(green > 1):
green = 1
if (green < 0.001):
green = 0
if(blue > 1):
blue = 1
if (blue < 0.001):
blue = 0
lumred = red
lumgreen = green
lumblue = blue
resultcode = os.system("echo '" + str(pinred) + "=" + str(red) + "' > /dev/pi-blaster && echo '" + str(pingreen) + "=" + str(green) + "' > /dev/pi-blaster && echo '" + str(pinblue) + "=" + str(blue) + "' > /dev/pi-blaster")
def fade(redstart, greenstart, bluestart, redend, greenend, blueend, duration):
startzeit = time.time()
global timeoffset
global timeoffsetadd
if(duration > timeoffset):
for i in range(101):
setcolors((redstart+(i*(redend - redstart)/100)), (greenstart+(i*(greenend - greenstart)/100)), (bluestart+(i*(blueend - bluestart)/100)))
time.sleep((duration-timeoffset)/100)
else: #Bei schnellen fades gröbere Abstufung wegen Performance
if(duration > (timeoffset/3)):
for i in range(26):
setcolors((redstart+(i*(redend - redstart)/25)), (greenstart+(i*(greenend - greenstart)/25)), (bluestart+(i*(blueend - bluestart)/25)))
time.sleep((duration-(timeoffset/4))/25)
else:
for i in range(6):
setcolors((redstart+(i*(redend - redstart)/5)), (greenstart+(i*(greenend - greenstart)/5)), (bluestart+(i*(blueend - bluestart)/5)))
#time.sleep(duration/5)
delay = (time.time() - startzeit) - duration
timeoffset = timeoffset + ((delay+timeoffsetadd)/2)
print("fade: " + str(round(delay, 3)) + "s Delay. Offset auf " + str(round(timeoffset, 2)) + " Sekunden korrigiert.")
def fadeto(redend, greenend, blueend, duration):
startzeit = time.time()
global timeoffset
global timeoffsetadd
global lumred
global lumgreen
global lumblue
redstart = lumred
greenstart = lumgreen
bluestart = lumblue
if(duration > timeoffset):
for i in range(101):
setcolors((redstart+(i*(redend - redstart)/100)), (greenstart+(i*(greenend - greenstart)/100)), (bluestart+(i*(blueend - bluestart)/100)))
time.sleep((duration-timeoffset)/100)
else: #Bei schnellen fades gröbere Abstufung wegen Performance
if(duration > (timeoffset/3)):
for i in range(26):
setcolors((redstart+(i*(redend - redstart)/25)), (greenstart+(i*(greenend - greenstart)/25)), (bluestart+(i*(blueend - bluestart)/25)))
time.sleep((duration-(timeoffset/4))/25)
else:
for i in range(6):
setcolors((redstart+(i*(redend - redstart)/5)), (greenstart+(i*(greenend - greenstart)/5)), (bluestart+(i*(blueend - bluestart)/5)))
#time.sleep(duration/5)
delay = (time.time() - startzeit) - duration
timeoffset = timeoffset + ((delay+timeoffsetadd)/2)
print("fadeto: " + str(round(delay, 3)) + "s Delay. Offset auf " + str(round(timeoffset, 2)) + " Sekunden korrigiert.")
def loopfade(redstart, greenstart, bluestart, redend, greenend, blueend, duration, iterations):
global timeoffset
for i in range(iterations):
startzeit = time.time()
fade(redstart, greenstart, bluestart, redend, greenend, blueend, (duration/2))
fade(redend, greenend, blueend, redstart, greenstart, bluestart, (duration/2))
delay = (time.time() - startzeit) - duration
timeoffset = timeoffset + ((delay+timeoffsetadd)/1.5)
print("Loopfade: " + str(round(delay, 3)) + "s Delay. Offset auf " + str(round(timeoffset, 2)) + " Sekunden korrigiert.")
def flash(red, green, blue, duration):
global lumred
global lumgreen
global lumblue
global timeoffset
startzeit = time.time()
redorig = lumred
greenorig = lumgreen
blueorig = lumblue
setcolors(red, green, blue)
if (duration > (timeoffset/100)):
time.sleep(duration-(timeoffset/100))
else:
time.sleep(duration)
setcolors(red, green, blue)
delay = (time.time() - startzeit) - duration
timeoffset = timeoffset + ((delay+timeoffsetadd)/1.5)
print("Flash: " + str(round(delay, 3)) + "s Delay. Offset auf " + str(round(timeoffset, 2)) + " Sekunden korrigiert.")
def strobo(red, green, blue, ontime, offtime, duration):
startzeit = time.time()
global timeoffset
while ((time.time() - startzeit) < duration):
setcolors(red, green, blue)
time.sleep(ontime)
setcolors(0, 0, 0)
time.sleep(offtime)
delay = (time.time() - startzeit) - duration
timeoffset = timeoffset + ((delay+timeoffsetadd)/1.5)
print("Strobo: " + str(round(delay, 3)) + "s Delay. Offset auf " + str(round(timeoffset, 2)) + " Sekunden korrigiert.")
def rainbow(duration, lum):
global timeoffset
global timeoffsetadd
startzeit = time.time()
fadeto(lum, 0, 0, (duration/7))
fadeto(lum, lum, 0, (duration/7))
fadeto(0, lum, 0, (duration/7))
fadeto(0, lum, lum, (duration/7))
fadeto(0, 0, lum, (duration/7))
fadeto(lum, 0, lum, (duration/7))
fadeto(lum, 0, 0, (duration/7))
delay = (time.time() - startzeit) - duration
timeoffset = timeoffset + ((delay+timeoffsetadd)/1.5)
print("Rainbow: " + str(round(delay, 3)) + "s Delay. Offset auf " + str(round(timeoffset, 2)) + " Sekunden korrigiert.")
def Setup():
setcolors(0, 0, 0)
fadeto(1, 1, 1, 5)
rainbow(10, 1)
strobo(1, 1, 1, 0.1, 1, 5)
rainbow(15, 1)
strobo(0, 1, 0, 0.1, 1, 10)
rainbow(25, 1)
loopfade(1, 0, 0, 0, 0, 0, 5, 2)
loopfade(1, 0, 0, 0, 0, 0, 10, 2)
flash(1, 1, 1, 1.1)
rainbow(10, 1)
rainbow(2, 1)
def benchmark(iterations):
global timeoffset
for i in range(iterations):
startzeit = time.time()
fadeto(1, 1, 1, 5)
rainbow(10, 1)
delay = (time.time() - startzeit) - 15
print("Zwischenergebnis: " + str(delay) + " Sekunden Verzögerung bei " + str(timeoffset) + " Sekunden Offset. (Durchgang " + str(i+1) + ")")
timeoffset = timeoffset + (delay/3)
print("Benchmarkergebnis: " + str(timeoffset) + " Sekunden Offset.")
def Demo():
setcolor("red", 1)
time.sleep(0.5)
setcolor("green", 1)
setcolor("red", 0)
time.sleep(0.5)
setcolor("blue", 1)
setcolor("green", 0)
time.sleep(0.5)
setcolor("blue", 0)
time.sleep(1)
for i in range(0):
loopfade(0, 0, 0, 0.5, 0.2, 0, 1, 1)
time.sleep(2)
for i in range(0):
loopfade(0, 0, 0, 0.5, 0.2, 0, 1, 1)
time.sleep(1)
loopfade(0, 0, 0, 0, 0, 0.5, 1, 1)
time.sleep(1)
for i in range(0):
loopfade(0, 0, 0, 0.5, 0.2, 0, 1, 1)
time.sleep(0.6)
loopfade(0, 0, 0, 0.2, 0, 0.5, 1, 1)
time.sleep(0.6)
loopfade(0, 0, 0, 0.5, 0, 0.5, 1, 1)
time.sleep(0.6)
rainbow(25, 1)
fadeto(0, 0, 0, 5)
gotime = time.time()
Setup()
print("Dauer: " + str(time.time() - gotime) + " Sekunden.")
#benchmark(7)
#Demo()
Alles anzeigen