Closed elektroschule closed 8 years ago
Danke für den Hinweis.
Im Quelltext sehe ich das Problem nicht direkt. Das muss ich mal mit angeschlossener Hardware testen. Vermutlich komme sich die direkte Beschaltung mit GPIO.output()
und die Verwendung des PWM mit pwm.ChangeDutyCycle()
ins Gehege.
Vielleicht kann ich einfach immer PWM nutzen.
Es scheint ein Timing-Problem zu sein. Ich habe für jede LED ein PWM. Dieses wird gestoppt, bevor die LED geschaltet wird.
if 0 <= led_farbe < len(self.__leds):
if an_aus == 1 or an_aus == 0:
# LED ein oder ausschalten
self.__pwms[led_farbe].stop()
# Konvertierung nach int notwendig, falls an_aus = 1.0 oder 0.0
GPIO.output(self.__leds[led_farbe], int(an_aus))
elif isinstance(an_aus, float) and 0 <= an_aus <= 1:
# LED dimmen
pwm = self.__pwms[led_farbe]
pwm.start(an_aus*100)
pwm.ChangeDutyCycle(an_aus*100)
stop() scheint nicht zu blockieren, sondern in einem anderen Thread zu laufen. Der Aufruf output() läuft daher ins Leere.
ea.schalte_led(0, 1) ->klappt nicht ... warten ... ea.schalte_led(0, 1) -> klappt. :-/
Mir fallen zwei mögliche Lösungen ein:
Leider flackert bei Version 2 meine LED auf dem Board immer wieder. Liegt es vielleicht an der Hardware? Kannst du mal folgenden Quelltext testen?
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(33, GPIO.OUT) # rote LED
p = GPIO.PWM(33, 50) # channel=12 frequency=50Hz
p.start(80)
Bei mir flackert die rote LED hierbei alle paar Sekunden kurz. :( Eine Änderung der Frequenz bringt keine besseren Resultate.
Musst den Quelltext nicht testen. Bei mir lief ein wilder lxpanel-Prozess im Hintergrund, der für das Flackern verantwortlich war. :-( Ich werde daher die Variante umsetzen, die komplett auf PWM setzt.
Mit Version 0.3.3 sollte es nun klappen.
Beim Testen ist mir etwas aufgefallen. Wenn ich eine (oder mehrere) LED zunächst auf auf einen Wert zwischen 1-99 dimme und anschließend auf 100 % erhöhe, geht die betreffende LED aus. Beim Schalten von 0 auf 100, geht sie wie gewünscht an.
Getestet habe ich es mit dem client,und folgenden Eingaben: