Zum Inhalt springen
Arduino LED Fading PWM

Lektion 13 – LEDs dimmen mit der analogen Ausgabe

Du kannst LEDs jetzt schon ein- und ausschalten. Nun wollen wir versuchen, ob wir sie auch dimmen, also weniger stark leuchten lassen können.

Dein Zimmerlichtschalter kann das Licht ein- und ausschalten. Alles, was genau zwei Zustände kennt, nennt Arduino digital. Du hast das mit den Befehlen digitalWrite() und digitalRead() schon kennengelernt. An manchen Lampen hat man aber auch ein Drehrädchen oder einen Schieber, mit dem man die Lampe dimmen kann. Die Leuchtstärke kennt dann nicht nur An und Aus, sondern auch Zustände dazwischen. Das nennt Arduino analog.

Um eine LED zu dimmen, können wir den Befehl analogWrite() benutzen.

analogWrite(ledPin, leuchtstaerke);

Auch hier übergeben wir zwei Parameter. Der erste Parameter ist wie bei digitalWrite() die Pinnummer. Der zweite Parameter ist nun nicht HIGH oder LOW, sondern ein Wert zwischen 0 und 255. Damit können wir die Leuchtstärke der LED in 256 Stufen beeinflussen.


Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


Benötigte Teile

Bauteile

Schaltung

Bauplen Analoge Ausgabe

Die Schaltung kennst du ja schon. Es handelt sich um eine LED, die über einen Vorwiderstand mit dem Minus-Pol (GND) und direkt mit dem Pin 9 verbunden ist.

So könnte ein Programmtext zum Testen aussehen:

int ledPin = 9;

void setup(){

}

void loop(){
  analogWrite(ledPin, 200);
}

Ist dir aufgefallen, dass im Setup gar nichts steht? Wenn wir die analoge Ausgabe verwenden, müssen wir – im Gegensatz zur digitalen Ausgabe – keine Grundeinstellungen im Arduino vornehmen.
Probier jetzt einfach ein paar andere Werte anstelle der 200 aus (z.B. 50, 250, 0, 100) und sieh, was passiert.

Info: PWM

Um LEDs zu dimmen, benutzt Arduino einen Trick. Normalerweise müsste man dafür nämlich die Spannung reduzieren. Arduino kann das nicht. Es ist nur in der Lage, Pins an- und auszuschalten. Das kann es dafür aber sehr schnell. Das Verhältnis der Zeit zwischen An und Aus entscheidet darüber, wie hell die LED leuchtet. Wenn sie lange an und nur kurz ausgeschaltet wird, dann leuchtet sie heller, als wenn sie lange aus und nur kurz angeschaltet wird. Dieses Verfahren wird Pulsweitenmodulation (PWM) genannt. Arduino kann die Pulsweitenmodulation aber nicht an jedem Pin ausführen, sondern nur an denen, die mit einer Wellenlinie gekennzeichnet sind. Das sind die Pins 3, 5, 6, 9, 10 und 11.

Dimmen mit der for-Schleife

Im Kapitel 10 haben wir uns die for-Schleife angesehen. Lass uns diese jetzt benutzen, um die LED automatisch zu dimmen. Bei der for-Schleife können wir eine Variable pro Schleifendurchlauf verändern. Ich schlage vor, wir benutzen sie für die Helligkeit der LED. Die Variable soll bei 0 anfangen und bis 255 zählen. Das sieht dann so aus:

for (int helligkeit=0; helligkeit <=255; helligkeit = helligkeit +1){

}

Wenn man nicht so viel schreiben möchte, kann man statt

helligkeit = helligkeit + 1

auch

helligkeit++

schreiben. Das erhöht die Variable auch um 1. Der Klarheit halber bleiben wir aber bei der ausgeschriebenen Variante. Der Code könnte dann so aussehen:

int ledPin = 9;

void setup(){

}

void loop(){
  for (int helligkeit =1; helligkeit <= 255; helligkeit = helligkeit +1){
    analogWrite(ledPin, helligkeit);
    delay(20);
  }
}

Ein kleines delay ist nötig, damit wir die Änderung wahrnehmen können. Lade das Programm nun auf das Arduino.

Jetzt dimmt sich die LED langsam an. Was müssen wir jetzt machen, wenn sie sich danach wieder ausdimmen soll? Wir müssen eine zweite for-Schleife schreiben, bei der die Variable „helligkeit“ bei 255 anfängt und sich pro Durchlauf um 1 reduziert. Das soll so lange durchgeführt werden, wie Helligkeit größer 0 ist.

Probier es einmal selber zu schreiben. Ansonsten findest du hier die Lösung:

int ledPin = 9;

void setup(){

}

void loop(){
  for (int helligkeit =1; helligkeit <= 255; helligkeit = helligkeit +1){
    analogWrite(ledPin, helligkeit);
    delay(20);
  }
  for (int helligkeit =255; helligkeit >= 0; helligkeit = helligkeit -1){
    analogWrite(ledPin, helligkeit);
    delay(20);
  }
}
5 1 vote
Article Rating
Abonnieren
Benachrichtige mich bei

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.

33 Comments
Newest
Oldest Most Voted
Inline Feedbacks
Alle Kommentare anzeigen
marc
3 Jahre zuvor

Hallo,
bei Lektion 13 wird mir folgender Fehler angezeigt:
expected unqualifid-id befor ‚for‘
exit status 1

mfg
marc

rainer
Antworte an  marc
2 Jahre zuvor

mit STRG+T kannst du den code neu formatieren & dann wirst du wahrscheinlich sehen, dass die for-schleife ausserhalb des loop platziert ist

Volker Hoffmann
3 Jahre zuvor

Wenn ich dieses einfache Programm mit meinem Ardurio ESP32 sterten will:

int ledPin = 9;
void setup(){
}
void loop(){
analogWrite(ledPin, 200);
}

kommt immer die Fehlermeldung: ‚analogWrite‘ was not declared in this scope

Was mache ich falsch?
Vielen Dank.

Rainer
Antworte an  Volker Hoffmann
2 Jahre zuvor

der esp32 kann ein wenig mehr & ist komplexer, daher funktioniert der code leider nicht.
hier ist eine mögliche lösung sehr gut beschrieben :: https://randomnerdtutorials.com/esp32-pwm-arduino-ide/

fhet
Antworte an  Volker Hoffmann
2 Jahre zuvor

du musst analogWrite(9; HIGH);

Jonas
3 Jahre zuvor

Hallo, erstmal Danke für die ausführliche Erklärung.
Wie funktioniert das ganze wenn man einen LDR mit in die Schalten packt, also dass je mehr Licht auf den Sensor trifft, die LED dunkler wird und umgekehrt.
Vielen Dank schonmal im Voraus.

Alexander
3 Jahre zuvor

Hallo und vielen Dank für die ausführliche Erklärung!
Beim Dimmen mit der for-Schleife schaltet sich meine LED allerdings bei PWM-Werten von 128-255 ganz an und von 0-127 komplett aus. Ich habe mir die Werte über die Serial.print() Funktion ausgeben lassen und sie steigen/fallen wie erwartet in 1er Schritten an/ab.

Achim Nieder-Vahrenholz
Antworte an  Alexander
3 Jahre zuvor

Hallo Alexander,

das liegt daran, dass diese LED an ihrem aktuellen pin nur digital (also „ganz aus“ oder „ganz an“) angesteuert werden kann.

VG

Achim

Alex E.
3 Jahre zuvor

Hallo und vielen Dank für die ausführliche Erklärung!
Beim Dimmen mit der for-Schleife schaltet sich meine LED allerdings bei PWM-Werten von 128-255 ganz an und von 0-127 komplett aus. Ich habe mir die Werte über die Serial.print() Funktion ausgeben lassen und sie steigen/fallen wie erwartet in 1er Schritten an/ab.

Tom Blumberg
5 Jahre zuvor

Hallo,
wie kann man dem Arduino mitteilen, dass die LED erst nach Tastendruck sich langsam aufdimmt und bei erreichten 255 dass er diesen Wert beibehält. Ein anderer Taster soll diesen wieder langsam abdimmen und bei 0 bleiben bis der erste Taster wieder gedrückt wird. Haben Sie eine Idee und könnten mir helfen?
LG

Adil
Antworte an  Stefan Hermann
3 Jahre zuvor

Hallo Stefan,
habe deinen Beitrag gelesen, finde sehr hilfreich. Auch ich bin ein Anfänger in Sachen Arduino-Programmierung.
Ich möchte auch gerne meine Idee realisieren, weiß ich aber nicht, ob diesen Code dafür verwenden kann. Ich arbeite mit einem Arduion UNO.
Ich möchte zB: eine Led stufenlos auf und abdimmen, indem ich eine Taste drücke zum Aufhellen und eine zweite taste zum Abdunkeln. Die Tasten sollen aber solange gedrückt gehalten werden, bis max. Helligkeit bzw. Abdunkeln erreicht werden.
Die max. Zeit zum Aufhellen und Abdunkeln könnte zB. jeweils 5sek. betragen. Das bedeutet dann nach 2,5sek. hat die Led 50% ihrer Helligkeit erreicht und wenn ich die Taste weitere 2,5 sek. drücke, erreiche ich nach insgesamt 5sek. die max. Helligkeit. und umgekehrt natürlich auch.

Ich wäre dir sehr dankbar, wenn du mir bei meinem Projekt auch helfen könntest.
Beste Grüße, Adil

Jonas
Antworte an  Stefan Hermann
3 Jahre zuvor

Hallo Stefan, wie würde eine mögliche Lösung aussehen wenn man die LED mit einem LDR über pwm dimmen wollen würde.

Falk
5 Jahre zuvor

Hallo Stefan,

Ich bin heute den ersten Tag mit dem Arduino am Start und finde Deine angebotenen Lösungen echt klasse.

Ich hab folgende Herausforderung:

Eine LED soll pulsieren (also an- und ausfaden) und vor dem nächsten Durchgang 5 Sekunden pausieren.
Gleichzeitig sollen 2 andere Ausgänge blinkende LEDs erzeugen.

Für einen Lösungsansatz (oder einen Sketch) wär ich sehr dankbar.

Viele Grüße
Falk

Sophie
Antworte an  Stefan Hermann
5 Jahre zuvor

Ich hätte da ein konkretes Projekt im Kopf. ;)
Möchte mit einem ESP 8266 über einen TOF Sensor LEDs (Streifen) steuern. Wenn jemand eine gewisse Zeit lang (zb 10secs) in einem gewissen Abstand (zb 20-50cm) vor dem Sensor steht, sollen die LEDs gedimmt angehen und anbleiben. Danach wieder gedimmt ausgehen. Die Einzelteile anzusteuern (TOF distanz auslesen, leds dimmen..) hat geklappt, alles zu einem funktionierenden Code zusammenzuführen… nicht. Freue mich über jeden Input :D

Falk
Antworte an  Stefan Hermann
5 Jahre zuvor

Hi Stefan,

absolut großartig! Ich hab mit meinen „2 Tage Arduino Kenntnissen“ auch eine Lösung gebastelt, welche, so leidlich, funktioniert.

Aber verglichen mit Deiner Lösung ist das Kreisklasse vs. Champions League.
Funktioniert absolut top und macht genau, was es soll.

Jetzt werde ich Deinen Sketch nutzen, um weiter praxisorientiert zu lernen.
Also, nochmals vielen Dank und macht mit Eurer Seite so weiter,
Daumen hoch.

Viele Grüße und
bleib gesund
Falk

Thomas
5 Jahre zuvor

Hallo kann ich die for schleife auch in eine methode packen habs versucht aber krieg es nicht hin will eine led dimmen und in eine methode packen
MfG. Tom

Thomas
Antworte an  Stefan Hermann
5 Jahre zuvor

super danke dir mach weiter so

Peter
6 Jahre zuvor

Gute Info für Anfänger! Ich möchte eine LED für eine gewisse Zeit, ca. 10 sec., gedimmt einschalten. Danach soll sie wieder ausgehen. Wie würde der Code dann aussehen?

peter
6 Jahre zuvor

super LED dimmen ! einfach erklärt !

ich möchte aber das die LED nach dem hochfahren an bleibt !
und
nach dem runterfahren aus bleibt.

das Programm wird ja immer neu gestartet !!!!!

Bobby
Antworte an  peter
6 Jahre zuvor

dann schreibe den Sectch nur in die Void Setup und nicht in die Loop. Dann wird das Programm nur einmal ausgeführt.

33
0
Ich würde mich über deine Meinung freuen.x