Hallo,
bei meinen weiteren Tests, für meine Uhr, wo ich auch das Threading benötigte habe ich gerade festgestellt dass bei
- 255, 0, 0 grün leuchtet
- 0, 255, 0 rot leuchtet
- 0, 0, 255 blau leuchtet
Was somit in meinen Augen GRB LED sind
Ich geh jetzt mal davon aus dass dies Hardwarebedingt ist?
Gekauft wurde hier
Auch ist ein Kondensator 1000µF, Widerstand 330 Ohm und Level Shifter verbaut.
Bis hierhin sollte der Thread wohl fast in den Hardwarebereich.
Eigener Code: (Endfassung wird dann nochmals im Threading Thema gepostet wo ja auch schon kunstruktive Kritiken zum Code exisitieren)
#!/usr/bin/python3
#
# # # # # # # # # #
#Imports
# # # # # # # # # #
from datetime import datetime
import sys
sys.path.append("/home/pi/rpi_ws281x")
from neopixel import *
import time
import subprocess
import toml
import os
import threading
# # # # # # # # # #
# LED strip configuration:
# # # # # # # # # #
LED_COUNT = 60 # Number of LED pixels.
LED_PIN = 18 # GPIO pin connected to the pixels (must support PWM!).
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz)
LED_DMA = 5 # DMA channel to use for generating signal (try 5)
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
#LED Mapping
std0 = [0, 1, 58, 59]
std1 = [3, 4, 5, 6]
std2 = [8, 9, 10, 11]
std3 = [13, 14, 15, 16]
std4 = [18, 19, 20, 21]
std5 = [23, 24, 25, 26]
std6 = [28, 29, 30, 31]
std7 = [33, 34, 35, 36]
std8 = [38, 39, 40, 41]
std9 = [43, 44, 45, 46]
std10 = [48, 49, 50, 51]
std11 = [53, 54, 55, 56]
stdliste = [std0, std1, std2, std3, std4, std5, std6, std7, std8, std9, std10, std11]
# # # # # # # # # #
#Funktionen
# # # # # # # # # #
#Farbkonfiguration
def rgb_standard():
rgb_leer = [0, 0, 255]
rgb_s = [0, 0, 255]
rgb_min = [0, 0, 255]
rgb_std = [0, 0, 255]
rgbconf = {"rgb_leer" : rgb_leer, "rgb_s" : rgb_s, "rgb_min" : rgb_min, "rgb_std" : rgb_std}
return rgbconf
def alle_led(r, g, b, strip):
for pos in range(strip.numPixels()):
strip.setPixelColorRGB(pos, r, g, b)
strip.show()
def led_calc(zeit, stdliste, rgbdict, led_gesetzt, strip):
if zeit.hour > 11:
index = zeit.hour - 12
else:
index = zeit.hour
hour = stdliste[index]
minute = zeit.minute
second = zeit.second
#Schnittfarben berechnen falls "Zeiger" übereinander liegen
#Stunde mit Minute vergleichen
if bool(set(hour) & {minute}):
for counter in range(0, 3):
rgbdict["rgb_min"][counter] = int((rgbdict["rgb_std"][counter] + rgbdict["rgb_min"][counter]) / 2)
#Stunde mit Sekunde vergleichen
if set(hour) & {second}:
for counter in range(0, 3):
rgbdict["rgb_s"][counter] = int((rgbdict["rgb_std"][counter] + rgbdict["rgb_s"][counter]) / 2)
#Minute mit Sekunde vergleichen
if {minute} & {second}:
for counter in range(0, 3):
rgbdict["rgb_s"][counter] = int((rgbdict["rgb_min"][counter] + rgbdict["rgb_s"][counter]) / 2)
led_gesetzt = led_setzen(hour, minute, second, rgbdict, led_gesetzt, strip)
return zeit.second, led_gesetzt
def led_setzen(hour, minute, second, rgbdict, led_gesetzt, strip):
if not isinstance(led_gesetzt, list):
led_gesetzt = [led_gesetzt]
#Stunden setzen
for stunde in hour:
strip.setPixelColorRGB(stunde, rgbdict["rgb_std"][0], rgbdict["rgb_std"][1], rgbdict["rgb_std"][2])
print("Stunden setzen")
print(stunde, rgbdict["rgb_std"][0], rgbdict["rgb_std"][1], rgbdict["rgb_std"][2])
#Minute setzen
strip.setPixelColorRGB(minute, rgbdict["rgb_min"][0], rgbdict["rgb_min"][1], rgbdict["rgb_min"][2])
print("Minute setzen")
print(minute, rgbdict["rgb_min"][0], rgbdict["rgb_min"][1], rgbdict["rgb_min"][2])
#Sekunde setzen
strip.setPixelColorRGB(second, rgbdict["rgb_s"][0], rgbdict["rgb_s"][1], rgbdict["rgb_s"][2])
print("Sekunde setzen")
print(second, rgbdict["rgb_s"][0], rgbdict["rgb_s"][1], rgbdict["rgb_s"][2])
#Neue Leere LED berechnen
led_gesetzt_neu = set(hour) | {minute} | {second}
leerliste = list(set(led_gesetzt) - led_gesetzt_neu)
for leer in leerliste:
strip.setPixelColorRGB(leer, rgbdict["rgb_leer"][0], rgbdict["rgb_leer"][1], rgbdict["rgb_leer"][2]),
print("Leer setzen")
print(leer, rgbdict["rgb_leer"][0], rgbdict["rgb_leer"][1], rgbdict["rgb_leer"][2])
strip.show()
return list(led_gesetzt_neu)
def check_wlan(strip):
"""Funktion, welche als eigener Thread laeuft, um selbststaendig in einem gewissenen Intervall alle Geraete in der Toml Liste zu pingen
arg: Objekt des neopixel LED Ringes
toml File: status "anwesend", ist kein Geraet von "anwesend" oder "dimmen" erreichbar, LED Helligkeit auf 0
sobald eine Adresse von status "dimmen" erreichbar ist, wird die Helligkeit verringert"""
def ping_wlan(ip):
"""pingt die IP 2x an
return (0 | !0) 0 wenn erreichbar"""
return subprocess.call(["ping", "-c 2", ip])
#Tomlfile mit den IP Adressen einlesen
pfad = os.path.abspath(os.path.dirname(__file__))
configfile = os.path.join(pfad, "wlan.toml")
with open(configfile) as conffile:
wlanliste = toml.loads(conffile.read())
status_anwesend_liste = []
last = datetime.now()
status = {}
helligkeit = 255 #Standarddefinition, (0 - 255)
while True:
now = datetime.now()
#Status der IP Adressen ermitteln
if (now - last).seconds > 10:
for key in wlanliste.keys():
for ip in wlanliste[key]:
if not ping_wlan(ip):
status[key] = True
break
else:
status[key] = False
if status["anwesend"]:
status_anwesend_liste = status["anwesend"] #Geraet von anwesend erreichbar
helligkeit = 255
elif not status["anwesend"] and not status["dimmen"]: #Wenn kein Geraet erreichbar ist
status_anwesend_liste.append(status["anwesend"])
print("Nichts los daheim die ", len(status_anwesend_liste), ".")
if len(status_anwesend_liste) > 12:
helligkeit = 0
if status["dimmen"]:
helligkeit = 100
print("Helligkeit: ", helligkeit)
strip.setBrightness(helligkeit)
last = datetime.now()
time.sleep(5)
#Init
last = datetime.now()
lastsecond = None
led_gesetzt = 0
rgbconf = rgb_standard()
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT)
strip.begin()
strip.setBrightness(255)
#for n in range(60):
# strip.setPixelColor(n,8393856)
#strip.show()
time.sleep(10)
thread_check_wlan = threading.Thread(target=check_wlan, args=(strip,))
thread_check_wlan.start()
alle_led(rgbconf["rgb_leer"][0], rgbconf["rgb_leer"][1], rgbconf["rgb_leer"][2], strip)
while True:
try:
rgbconf = rgb_standard()
now = datetime.now()
if lastsecond != now.second:
lastsecond, led_gesetzt = led_calc(now, stdliste, rgbconf, led_gesetzt, strip)
time.sleep(0.5)
except KeyboardInterrupt:
print("KeyboardInterrupt")
strip.setBrightness(0)
alle_led(0, 0, 0, strip)
sys.exit()
Alles anzeigen
Jetzt dachte ich mir wenn ich die Funktion Color umschreibe, könnte ich das Problem umgehen, aber bisher ohne Erfolg:
Orginal
def Color(red, green, blue, white = 0):
"""Convert the provided red, green, blue color to a 24-bit color value.
Each color component should be a value 0-255 where 0 is the lowest intensity
and 255 is the highest intensity.
"""
return (white << 24) | (red << 16)| (green << 8) | blue
Änderung
def Color(red, green, blue, white = 0):
"""Convert the provided red, green, blue color to a 24-bit color value.
Each color component should be a value 0-255 where 0 is the lowest intensity
and 255 is the highest intensity.
"""
return (white << 24) | (green << 16)| (red << 8) | blue
Libary auf das Neopixel basiert
Kann mir jemand sagen wo ich bei dem Problem ansetzen muss?
EDIT: Gerade auf Github von der Libary ein Issue gefunden der das selbe Problem beschreibt, aber ich kann mit dem Lösungsansatz nichts anfangen: hier
Aber vielleicht ja einer von euch