Aufgabe:  Es soll eine LED erst heller und dann wieder dunkler leuchten, im sogenannten Pulsieren oder "Faden" (auch auf Englisch als "fade" bekannt).

Mikrocontroller kennen nur "5 Volt an" oder "5V aus" an ihren Ausgängen. Um die Helligkeit einer LED zu ändern, müsste man theoretisch die Spannung variieren können, beispielsweise 5V für helles Leuchten und 4 Volt für ein etwas dunkleres Licht. Das funktioniert jedoch nicht an digitalen Pins. Es gibt jedoch eine Alternative namens Pulsweitenmodulation (PWM). PWM lässt die 5V-Spannung pulsieren, also im Millisekundenbereich ein- und ausschalten. Bei hoher PWM liegt das 5V-Signal praktisch durchgehend am Pin an, während es bei geringer PWM kaum vorhanden ist. Dies ermöglicht es, mit PWM einen ähnlichen Effekt wie die Variation der Spannung zu erzielen.

1.Schaltpläne

1.1. Arduino UNO



1.2.ESP32-Wroom



2.Die Programmcode

2.1.Arduino UNO

2.1.1. Arduino UNO PWM-Pins

alle Pins, die mit ~ gekennzeichnet sind 3, 5, 6, 9, 10 und 11



 

int LED = 6;  // Das Wort "LED" steht jetzt für den Pin 6

// Fadeschritte: bestimmt die Geschwindigkeit des „Fadens“.
int Fadeschritte = 5;

// Das Wort "Helligkeit" steht nun für den Wert, der bei der PWM ausgegeben wird.
// Die Zahl 0 ist dabei nur ein beliebiger Startwert.
int Helligkeit = 0;

void setup()  // Hier beginnt das Setup.
{
  // Bei analogWrite ist kein Setup notwendig.
}

void loop() 
{
  /*
    Mit der Funktion analogWrite wird hier an der LED die PWM-Funktion aktiviert.
    Der PWM-Wert ist der Wert, der unter dem Namen „Helligkeit“ gespeichert ist,
    in diesem Fall „0“ (siehe ersten Programmabschnitt).
  */  
  analogWrite(LED, Helligkeit);

  /*
    Nun wird der Wert für die PWM-Ausgabe verändert. Zum Wert „Helligkeit“ 
    wird jetzt zum vorherigen Helligkeit der Wert für die Fadeschritte addiert. 
    In diesem Fall: Helligkeit = 0 + 5. Der neue Wert für "Helligkeit" ist also nicht mehr 0, sondern 5. 
    Sobald der loop-Teil einmal durchgelaufen ist, wiederholt er sich. 
    Dann beträgt der Wert für die Helligkeit 10, im nächsten Durchlauf 15 usw. usw…
  */
  Helligkeit = Helligkeit + Fadeschritte;    

  // Die LED soll für 25 ms (Millisekunden), also nur ganz kurz die Helligkeit beibehalten. 
  // Verringert man diesen Wert, wird das Pulsieren ebenfalls schneller.
  delay(25);
  
  /*
    Wenn die Helligkeit den Wert 0 oder (||) 255 erreicht hat, 
    wechselt der Wert für die "Fadeschritte" von positiv zu negativ bzw. umgekehrt. 
    Die LED wird zunächst bei jedem Durchlauf des loop-Teils immer ein bisschen heller. 
    Allerdings ist irgendwann der Maximalwert für die PWM-Ausgabe mit dem Wert 255 erreicht. 
    Die LED soll dann wieder Schritt für Schritt dunkler werden. 
    Also wird dem Wert für die "Fadeschritte" an dieser Stelle ein Minuszeichen davor gesetzt.
    Solange der Wert kleiner als 255 ist, wird zu "Fadeschritte" jeweils 5 addiert,
    Ist der Wert größer als 255, wird solange 5 rückwärts gezählt, bis der Wert 0 erreicht ist.   
  */
  if (Helligkeit == 0 || Helligkeit == 255) 
  {
    Fadeschritte = -Fadeschritte;  
  }

}  // Mit dieser letzten Klammer wird der loop-Teil geschlossen.

2.2.ESP32 Wroom

Der ESP32-Wroom hat eine Besonderheit: Anstelle des Befehls "analogWrite" müssen die Pins 25 und 26 mit "dacWrite" verwendet werden.




int LEDPin = 26;  // Hier steht jetzt "LEDPin" für den Pin 26.

// Fadeschritte: Bestimmt die Geschwindigkeit des Helligkeitswechsels, auch als "Faden" bekannt.
int Fadeschritte = 5;  
// "Helligkeit" steht jetzt für den Wert, der bei der PWM (Pulsweitenmodulation) verwendet wird. 
// Die Zahl 0 ist dabei nur ein Startwert.
int Helligkeit = 0;  

void setup()  // Hier startet die Einrichtung.
{
  // Bei "analogWrite" ist im Setup-Teil keine spezielle Einrichtung erforderlich.
}

void loop() 
{
  /*
    Mit der Funktion "dacWrite" wird hier am LEDPin die PWM-Funktion aktiviert.
    Der PWM-Wert ist der Wert, der unter dem Namen „Helligkeit“ gespeichert ist,
    in diesem Fall „0“ (siehe ersten Abschnitt des Programms).
  */  
  dacWrite(LEDPin, Helligkeit);

  /*
    Jetzt wird der Wert für die PWM-Ausgabe verändert. Zum Wert „Helligkeit“ 
    wird jetzt der Wert für die Fadeschritte addiert. 
    In diesem Fall: Helligkeit = 0 + 5. Der neue Wert für "Helligkeit“ ist also nicht mehr 0, sondern 5. 
    Sobald der loop-Teil einmal durchgelaufen ist, wiederholt er sich. 
    Dann beträgt der Wert für die Helligkeit 10, im nächsten Durchlauf 15 usw. usw…
  */
  Helligkeit = Helligkeit + Fadeschritte;    

  // Die LED behält die Helligkeit für 25 Millisekunden bei. 
  // Wenn man diesen Wert verringert, wird der Helligkeitswechsel schneller.
  delay(25);
  /*
    Wenn die Helligkeit den Wert 0 oder (||) 255 erreicht hat, 
    ändert sich der Wert für "Fadeschritte“ von positiv zu negativ bzw. umgekehrt. 
    Die LED wird zunächst bei jedem Durchlauf des loop-Teils immer ein bisschen heller. 
    Irgendwann ist jedoch der Maximalwert für die PWM-Ausgabe (255) erreicht. 
    Die LED soll dann wieder Schritt für Schritt dunkler werden. 
    Also wird dem Wert für "Fadeschritte“ an dieser Stelle ein Minuszeichen vorangestellt.
    Solange der Wert kleiner als 255 ist, wird zu "Fadeschritte" jeweils 5 addiert,
    Ist der Wert größer als 255, wird solange 5 rückwärts gezählt, bis der Wert 0 erreicht ist.   
  */
  if (Helligkeit == 0 || Helligkeit == 255) 
  {  Fadeschritte = -Fadeschritte;  
  }

}  // Hiermit wird der loop-Teil abgeschlossen.