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);
      }
    }

    30 Gedanken zu „Lektion 13 – LEDs dimmen mit der analogen Ausgabe“

    1. 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.

      1. Hi Volker,

        der Code sieht gut aus. Welches ESP32-Board nutzt du denn? Ist der Pin D9 denn ausgeführt und ein PWM? Ansonsten versuche mal einen anderen Pin.

        Liebe Grüße Stefan

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

     

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