Lösung: LED PWM III

Sketch: Quelltext a

// Variablen
int Helligkeit=0;   // Helligkeit in 10 Stufen
int pwm_wert=0;     // PWM-Wert für analogWrite()

void setup() {
  pinMode(8, INPUT_PULLUP);   // + Taster
  pinMode(7, INPUT_PULLUP);   // - Taster
  pinMode(9, OUTPUT);         // interne LED
  digitalWrite(9, LOW);       // interne LED aus

  // ***** serielle Schnittstelle initialisieren *****
  Serial.begin(9600);
  while(!Serial) {}
}

void loop() {
  // ***** Tastaturabfrage *****
  if (digitalRead(8)==LOW){
    if (Helligkeit < 10) {
      Helligkeit = Helligkeit + 1;
    }
  }
  if (digitalRead(7)==LOW){
    if (Helligkeit > 0) {
      Helligkeit = Helligkeit - 1;
    }
  }
  // ***** PWM Berechnung *****
  pwm_wert = (255*Helligkeit)/10;
  analogWrite(9, pwm_wert);

  // ***** serielle Ausgabe
  Serial.println("Tastverhältnis " + String(Helligkeit*10) + " %");
  
  delay(200);                 // Tasten entprellen
  // ***** PWM Ende *****
}

Quelltext a: Serielle Ausgabe in jeder loop-Schleife.

Sketch: Quelltext b

// Variablen
int Helligkeit=0;   // Helligkeit in 10 Stufen
int pwm_wert=0;     // PWM-Wert für analogWrite()

void setup() {
  pinMode(8, INPUT_PULLUP);   // + Taster
  pinMode(7, INPUT_PULLUP);   // - Taster
  pinMode(9, OUTPUT);         // interne LED
  digitalWrite(9, LOW);       // interne LED aus

  // ***** serielle Schnittstelle initialisieren *****
  Serial.begin(9600);
  while(!Serial) {}
}

void loop() {
  // ***** Tastaturabfrage *****
  if (digitalRead(8)==LOW){
    if (Helligkeit < 10) {
      Helligkeit = Helligkeit + 1;
      
      // ***** serielle Ausgabe
      Serial.println("Tastverhältnis " + String(Helligkeit*10) + " %");
    }
  }
  if (digitalRead(7)==LOW){
    if (Helligkeit > 0) {
      Helligkeit = Helligkeit - 1;

      // ***** serielle Ausgabe
      Serial.println("Tastverhältnis " + String(Helligkeit*10) + " %");
    }
  }
  // ***** PWM Berechnung *****
  pwm_wert = (255*Helligkeit)/10;
  analogWrite(9, pwm_wert);
  delay(200);                 // Tasten entprellen
  // ***** PWM Ende *****
}

Quelltext b: Serielle Ausgabe nur bei Änderung der Variablen Helligkeit.

Sketch: Erklärung

Prinzipiell gibt es zwei Möglichkeiten, die serielle Ausgabe zu realisieren.

Quelltext a generiert eine dauernde serielle Ausgabe, während jeder loop-Schleife.

Dies hat einige Nachteile:

  • Unübersichtliche Ausgabe der Werte auf dem seriellen Monitor
  • Die Ausführung des Sketches wird verlangsamt

Diese Nachteile umgeht Quelltext b, der nur eine serielle Ausgabe generiert wenn sich Helligkeit ändert.

Variablen

Die globale Variable Helligkeit wird als int (Integer) definiert und mit 0 initialisiert.

Die globale Variable pwm_wert wird als int (Integer) definiert und mit 0 initialisiert.

Setup

Pin 8 und Pin 7 werden als INPUT_PULLUP definiert.

Pin 9 (externe LED mit Vorwiderstand) als OUTPUT.
Die interne LED wird ausgeschaltet.

Die Serielle Schnittstelle wird initialisiert mit 9600 Baud.

Loop

Wenn der Taster an Pin 8 gedrückt wurde, wird zunächst überprüft, ob der Wert von Helligkeit < 10 ist, damit kein Überlauf stattfindet. Wenn nicht, wird der Wert um 1 erhöht.

Wenn der Taster an Pin 9 gedrückt wurde, wird zunächst überprüft, ob der Wert von Helligkeit > 0 ist, damit kein Überlauf stattfindet. Wenn nicht, wird der Wert um 1 erniedrigt.

Im PWM-Teil wird als erstes der pwm_wert aus der Variablen Helligkeit berechnet. Der pwm_wert muss zwischen 0 und 255 liegen und entspricht dem Tastverhältnis des mit analogWrite(9pwm_wert) ausgegebenen PWM-Signals.

Die Wartezeit von 200 ms dient der Tasten-Entprellung und zur Herabsetzung der Reaktionszeit der Tasten. Ist die Wartezeit zu niedrig, kann der Wert von Helligkeit mit den Tastern nicht mehr vernünftig eingestellt werden.

Die serielle Ausgabe geschieht mit dem Befehl Serial.println(). Der ausgegebene String wird aus mehreren Teilen zusammengesetzt (mit +). Der Zahlenwert des ausgegebenen Tastgrades muss vorher mit String() in einen String umgewandelt werden.

Schaltplan / Layout

Schaltplan

Elektronik / Hardware

Man muss darauf achten, den Taster richtig anzuschließen, ggf. muss man vorher mit einem Durchgangsprüfer die Pinbelegung des Tasters prüfen.

Da Pin 8 und Pin 9 low-active sind, müssen die Taster mit GND verbunden werden.

Die LED muss mit einem passenden Vorwiderstand in Reihe geschaltet werden.
Andernfalls können die LED oder das Arduino-Board beschädigt oder zerstört werden.