PWM LED wird langsam heller, aber danach dunkel

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rubberdog
User
Beiträge: 3
Registriert: Montag 1. Februar 2016, 17:45

Hallo Community!

mit dem Raspberry Pi möchte ich einen LED-Strip von dunkel langsam auf hell dimmen und nach Erreichen der vollen Helligkeit soll diese so bleiben.
Leider fadet das Programm zwar (etwas bockig, aber akzeptabel) von 0% auf 100%, danach aber wird die LED wieder finster.
Ich habe schon verschiedene Varianten durchprobiert, aber leider ohne Erfolg.

Eigentlich sollte nach pwm.stop() die LED mit dem folgenden Befehl GPIO.output(ledport, 1) voll hell leuchten. Tut sie aber nicht und wird einfach finster und bleibt so. :K

Hier das Programm:

[Codebox=python file=Unbenannt.py]
#!usr/bin/env python
import RPi.GPIO as GPIO
import time

ledport = 10
GPIO.setwarnings(0)
GPIO.setmode(GPIO.BCM)
GPIO.setup(ledport, GPIO.OUT)

pwm = GPIO.PWM(ledport, 100) # GPIO=10, frequency=100Hz
pwm.start(0)

for dc in range(0, 50, 1):
pwm.ChangeDutyCycle(dc)
time.sleep(0.5)

pwm.stop()

GPIO.output(ledport, 1)
[/Codebox]

Habt Ihr eine Idee? Könnt Ihr mir helfen? Wäre sehr froh darüber!
Vielen Dank schon vorab für Eure Postings! :D

Rudi
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte formatiere deinen Code richtig mit dem dazu angebotenen Code-Tag. Sonst ist der gerade bei einer Einrueckungs-basierenden Sprache wie Python unleserlich.

Zum Verhalten deines Skriptes fallen mir eine Reihe Dinge ein:

- du beendest das Programm nach dem setzen der LED auf 1. Das kann durchaus dazu fuehren, dass der GPIO-Pin wieder auf einen Standard-Zustand geht. Was passiert, wenn du eine Endlosschleife einfuehrst?

Code: Alles auswählen

while True:
    time.sleep(0.1)
-es ist voellig unnoetig, die PWM auszuschalten. Stattdessen ein PWM-Level von 100 setzen ist besser, denn dann kannst du auch wieder runterdimmen.

- bezueglich der Bockigkeit: PWMs sind oft nicht linear, sprich: ein PWM-Wert von 20 ist nicht halb so hell wie der einer 40. Da kann man verschiedene Dinge probieren, aber mindestens mal solltest du einen minimalen Startwert benutzen, der eben groesser 0 ist - eben da, wo die LEDs so sehr glimmen, wie du sie brauchst.

- der PI und sein Timing sind eher so mau. Code, der wie deinen eine bestimmte Anzahl Sekunden wartet, um dann davon auszugehen, dass das auch wirklich genau 0.5s waren, ist zum scheitern verurteilt. Besser ist, sich eine Startzeit zu merken, und nach dem warten die tatsaechlich vergangene zeit zu messen: time.time() - Startzeit. Dann kann man genauer einstellen, was passieren soll.
BlackJack

@__deets__: Der OP hat ja die richtigen Tags gesetzt, nur das die jetzt auch für Python nicht mehr funktionieren. :-(
rubberdog
User
Beiträge: 3
Registriert: Montag 1. Februar 2016, 17:45

Hallo __deets__,

vielen Dank für Deine Hilfe! Jetzt funktioniert es und die LED bleibt nach Erreichung des Endwertes hell :D
Die Schleife sieht jetzt so aus:

[Codebox=python file=Unbenannt.py]
for dc in range(1, 90, 1):
----pwm.ChangeDutyCycle(dc)
----time.sleep(0.5)
----print ("PWM = ", dc, "%\n")

print ("Fertig")

while True:
----time.sleep(0.1)

[/Codebox]

Ein kleines Problem hab' ich noch als Python-Neuling:
Der 'print ("PWM = ", dc, "%\n")'-Befehl erzeugt einen Laufzeitfehler 'IndentationError: unexpected indent' :cry:
Da seh' ich aber keinen Fehler!? Vielleicht hast Du da auch noch einen Tipp?

Übrigens läuft die PWM-Geschichte wirklich ziemlich unrund; am Oszi gesehen gibts da einige Ausreisser :?

Rudi

ps: die Codebox funktioniert offensichtlich wirklich nicht, die Einrückungen werden nicht übernommen, deshalb die Bindestriche zu Zeilenbeginn
BlackJack

@rubberdog: Da das ja durch die Bindestriche nicht mehr der Quelltext ist, den Du da tatsächlich hast, kann man nur raten: Tabulatorzeichen und Leerzeichen gemischt verwendet? Einrücken am besten nach dem Style Guide for Python Code, also mit vier Leerzeichen pro Ebene, keine Tabulatorzeichen verwenden.

Solange die Codebox nicht funktioniert, am besten den `code`-Button verwenden. Dann gibt's zwar keine Syntaxhervorhebung, aber die Einrückung bleibt zumindest erhalten.
rubberdog
User
Beiträge: 3
Registriert: Montag 1. Februar 2016, 17:45

@ BlackJack:
Jetzt funktioniert auch der print-Befehl in der Schleife! Hab' wahrscheinlich Tabs und Spaces gemischt. Die Webseite dazu ist ja ziemlich umfangreich :roll:
Vielen Dank für den Hinweis und noch einen schönen Tag!

Rudi
Antworten