Ich habe keine Ahnung was das ist
Das soll die LED's beim Herunterfahren ausschalten. Das script ansich wird beendet, aber die LED's bleiben an.
Ich habe keine Ahnung was das ist
Das soll die LED's beim Herunterfahren ausschalten. Das script ansich wird beendet, aber die LED's bleiben an.
Problem mit ws281x? Schau mal ob du hier fündig wirst!
Das script ist ja so ausgelegt, daß man mit "Strg-C" beendet und die LED's ausgehen (der colorWipe Befehl am Ende). Ich bräuchte jetzt aber einen Befehl, wo das auf "sudo poweroff" reagiert. Zeile 99-101 hab ich ausgeblendet, weil ich die Ausgabe nicht sehen muß.
#!/usr/bin/env python3
# NeoPixel library strandtest example
# Author: Tony DiCola (tony@tonydicola.com)
#
# Direct port of the Arduino NeoPixel library strandtest example. Showcases
# various animations on a strip of NeoPixels.
import time
from rpi_ws281x import PixelStrip, Color
import argparse
# LED strip configuration:
LED_COUNT = 16 # Number of LED pixels.
LED_PIN = 18 # GPIO pin connected to the pixels (18 uses PWM!).
# LED_PIN = 10 # GPIO pin connected to the pixels (10 uses SPI /dev/spidev0.0).
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz)
LED_DMA = 10 # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53
# Define functions which animate LEDs in various ways.
def colorWipe(strip, color, wait_ms=50):
"""Wipe color across display a pixel at a time."""
for i in range(strip.numPixels()):
strip.setPixelColor(i, color)
strip.show()
time.sleep(wait_ms / 1000.0)
def theaterChase(strip, color, wait_ms=50, iterations=10):
"""Movie theater light style chaser animation."""
for j in range(iterations):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, color)
strip.show()
time.sleep(wait_ms / 1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, 0)
def wheel(pos):
"""Generate rainbow colors across 0-255 positions."""
if pos < 85:
return Color(pos * 3, 255 - pos * 3, 0)
elif pos < 170:
pos -= 85
return Color(255 - pos * 3, 0, pos * 3)
else:
pos -= 170
return Color(0, pos * 3, 255 - pos * 3)
def rainbow(strip, wait_ms=20, iterations=1):
"""Draw rainbow that fades across all pixels at once."""
for j in range(256 * iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((i + j) & 255))
strip.show()
time.sleep(wait_ms / 1000.0)
def rainbowCycle(strip, wait_ms=20, iterations=5):
"""Draw rainbow that uniformly distributes itself across all pixels."""
for j in range(256 * iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel(
(int(i * 256 / strip.numPixels()) + j) & 255))
strip.show()
time.sleep(wait_ms / 1000.0)
def theaterChaseRainbow(strip, wait_ms=50):
"""Rainbow movie theater light style chaser animation."""
for j in range(256):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, wheel((i + j) % 255))
strip.show()
time.sleep(wait_ms / 1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, 0)
# Main program logic follows:
if __name__ == '__main__':
# Process arguments
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--clear', action='store_true', help='clear the display on exit')
args = parser.parse_args()
# Create NeoPixel object with appropriate configuration.
strip = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
# Intialize the library (must be called once before other functions).
strip.begin()
#print('Press Ctrl-C to quit.')
#if not args.clear:
#print('Use "-c" argument to clear LEDs on exit')
try:
while True:
print('Color wipe animations.')
colorWipe(strip, Color(255, 0, 0)) # Red wipe
colorWipe(strip, Color(0, 255, 0)) # Green wipe
colorWipe(strip, Color(0, 0, 255)) # Blue wipe
print('Theater chase animations.')
theaterChase(strip, Color(127, 127, 127)) # White theater chase
theaterChase(strip, Color(127, 0, 0)) # Red theater chase
theaterChase(strip, Color(0, 0, 127)) # Blue theater chase
print('Rainbow animations.')
rainbow(strip)
rainbowCycle(strip)
theaterChaseRainbow(strip)
except KeyboardInterrupt:
if args.clear:
colorWipe(strip, Color(0, 0, 0), 10)
Alles anzeigen
alle Beispiele drehen im Uhrzeigersinn, nur der Rainbow.Cycle nicht. Kann man bei dem die Richtung tauschen?
ja ...
du willst ja 'rumspielen' ... mal aus einer '255' eine '0' machen oder aus einem '+' ein '-', keine ahnung ...
Häng mal ans Ende des Skripts noch
dran, also:
#!/usr/bin/env python3
# NeoPixel library strandtest example
# Author: Tony DiCola (tony@tonydicola.com)
#
# Direct port of the Arduino NeoPixel library strandtest example. Showcases
# various animations on a strip of NeoPixels.
import time
from rpi_ws281x import PixelStrip, Color
import argparse
# LED strip configuration:
LED_COUNT = 16 # Number of LED pixels.
LED_PIN = 18 # GPIO pin connected to the pixels (18 uses PWM!).
# LED_PIN = 10 # GPIO pin connected to the pixels (10 uses SPI /dev/spidev0.0).
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz)
LED_DMA = 10 # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53
# Define functions which animate LEDs in various ways.
def colorWipe(strip, color, wait_ms=50):
"""Wipe color across display a pixel at a time."""
for i in range(strip.numPixels()):
strip.setPixelColor(i, color)
strip.show()
time.sleep(wait_ms / 1000.0)
def theaterChase(strip, color, wait_ms=50, iterations=10):
"""Movie theater light style chaser animation."""
for j in range(iterations):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, color)
strip.show()
time.sleep(wait_ms / 1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, 0)
def wheel(pos):
"""Generate rainbow colors across 0-255 positions."""
if pos < 85:
return Color(pos * 3, 255 - pos * 3, 0)
elif pos < 170:
pos -= 85
return Color(255 - pos * 3, 0, pos * 3)
else:
pos -= 170
return Color(0, pos * 3, 255 - pos * 3)
def rainbow(strip, wait_ms=20, iterations=1):
"""Draw rainbow that fades across all pixels at once."""
for j in range(256 * iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((i + j) & 255))
strip.show()
time.sleep(wait_ms / 1000.0)
def rainbowCycle(strip, wait_ms=20, iterations=5):
"""Draw rainbow that uniformly distributes itself across all pixels."""
for j in range(256 * iterations):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel(
(int(i * 256 / strip.numPixels()) + j) & 255))
strip.show()
time.sleep(wait_ms / 1000.0)
def theaterChaseRainbow(strip, wait_ms=50):
"""Rainbow movie theater light style chaser animation."""
for j in range(256):
for q in range(3):
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, wheel((i + j) % 255))
strip.show()
time.sleep(wait_ms / 1000.0)
for i in range(0, strip.numPixels(), 3):
strip.setPixelColor(i + q, 0)
# Main program logic follows:
if __name__ == '__main__':
# Process arguments
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--clear', action='store_true', help='clear the display on exit')
args = parser.parse_args()
# Create NeoPixel object with appropriate configuration.
strip = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
# Intialize the library (must be called once before other functions).
strip.begin()
#print('Press Ctrl-C to quit.')
#if not args.clear:
#print('Use "-c" argument to clear LEDs on exit')
try:
while True:
print('Color wipe animations.')
colorWipe(strip, Color(255, 0, 0)) # Red wipe
colorWipe(strip, Color(0, 255, 0)) # Green wipe
colorWipe(strip, Color(0, 0, 255)) # Blue wipe
print('Theater chase animations.')
theaterChase(strip, Color(127, 127, 127)) # White theater chase
theaterChase(strip, Color(127, 0, 0)) # Red theater chase
theaterChase(strip, Color(0, 0, 127)) # Blue theater chase
print('Rainbow animations.')
rainbow(strip)
rainbowCycle(strip)
theaterChaseRainbow(strip)
except KeyboardInterrupt:
if args.clear:
colorWipe(strip, Color(0, 0, 0), 10)
finally:
colorWipe(strip, Color(0, 0, 0), 10)
Alles anzeigen
und teste das damit mal!
Funzt nicht. Hab die Zeilen auch genauso eingerückt, wie im Code oben. Über cron startet es garnicht mehr, wenn ich es händisch starte kommt:
"inconsistent use of tabs and spaces in indentation"
Ich denke, ich laß das erstmal so, wie es jetzt funktioniert. Vielleicht findet sich irgendwann ne Lösung.
Danke hyle für deine Hilfe.
"inconsistent use of tabs and spaces in indentation"
Du hast da irgendwo die Tab-Taste statt der 4 Leerzeichen bei den Einrückungen verwendet!
Einrückungen macht man immer mit 4 Leerzeichen pro Ebene. Die Tab-Taste kann man übrigens in vielen Editoren auch so einstellen, dass damit 4 Leerzeichen geschrieben werden.
Dann vielleicht so
?
Wenn ich das script händisch starte, macht ein "-c" am Ende des Befehls, daß die LED's bei "Strg-C" ausgehen.
Wie genau meinst Du das und wann und wo gibst Du diesen Befehl ein?
Ich starte das script im Terminal: sudo python3 rpi_ws281x/examples/strandtest.py -c
Jetzt macht das "-c" genau das gleiche, wie "finally" im script.
Ich stell mir das so vor, das im script bei "poweroff" oder "shutdown" dieses colorWipe ausgeführt wird. Sowas sollte es doch geben, oder?
Ich verstehe nicht was Du meinst! Kannst Du das bitte etwas ausführlicher beschreiben?
Wichtig ist ja was beim runterfahren passiert, wenn das Skript per Autostart gestartet wird und wie dann die LED reagieren. Dann sollte eigentlich das finally ohne der Abfrage (if args.clear) greifen. Dann könnte diese Abfrage ggf. sogar stören.
Ich versuchs.
strandtest.py ist das script. Angenommen das script ist jetzt in cron ausgeblendet (also nicht im Autostart) dann starte ich das strandtest.py-script per Befehl "sudo python3 rpi_ws281x/examples/strandtest.py -c", wenn ich z.B. etwas im script geändert hab. Wenn ich dort das "-c" weglasse, bleiben die LED's auch an, wenn da script beendet wird. Jetzt hatte ich aber dein "finally" "colorWipe (strip ...)" im script noch drin und es hatte die gleiche Wirkung, wie das "-c" in der Befehlszeile, LED's erlischen nach Beenden des script.
Ah ok! Und was passiert jetzt mit den LEDs, wenn Du das Skript in der Crontab aktiviertst, den RPi neu startest und dann herunterfährst?
Bis jetzt klappt Starten perfekt, Herunterfahren beendet das script (also z.B. die rainbowCycle Animation, alles andere ist ausgeblendet), aber die LED's bleiben an.
Ist da die Abfrage if args.clear noch im finally-Block oder nur colorWipe(strip, Color(0, 0, 0), 10)?
Hallo,
mal etwas Abwechslung für Zwischendurch
Alle Beispiele drehen im Uhrzeigersinn, nur der Rainbow.Cycle nicht. Kann man bei dem die Richtung tauschen?
Was passiert damit wenn du die Funktion so änderst:
def rainbowCycle(strip, wait_ms=20, iterations=5):
"""Draw rainbow that uniformly distributes itself across all pixels."""
for j in range(255 * iterations, 0, -1):
for i in range(strip.numPixels(), 0, -1):
strip.setPixelColor(i, wheel(
(int(i * 256 / strip.numPixels()) + j) & 255))
strip.show()
time.sleep(wait_ms / 1000.0)
Ich habe sowas noch nie angesteuert, aber das wäre mal meine erste Idee.
Grüße
Dennis
Dennis89 :
ein minus für eine richtungs ä n d e r u n g ... ist keine schlechte idee ...
Es ist ja nicht nur ein Minus. Jetzt wird nicht mehr von 0 aufwärts gezählt, sondern von 255 abwärts.
ich weiß ... mir brauchst du das nicht erzählen ... ich hatte mich vor einiger zeit mal mit led-stripes auseinandergesetzt, und ziemlich viel 'rumgespielt' - codetechnisch ... auch mit micropython auf nem esp8266 ...
mit dem 'minus' habe ich nur auf ein füheren post von mir bezogen (für te) ...
Super Dennis89 , das hat den gewünschten Effekt erzielt. Warum hast du noch die 256 in 255 geändert? Ich sehe da keine Änderung, ob da 254, 255 oder 256 steht. Wahrscheinlich erst, wenn man den Wert viel kleiner macht. Das ist doch bestimmt für die Farben.
Da muß ich nochmal nachfragen. Muß die gesamte if-Zeile weg? Das hatte ich eigentlich schon probiert. Das bringt einen Fehler. Oben drüber "except KeyboardInterrupt" macht dann was? Gehört das zur if-Zeile?
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!