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(9 , pwm_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
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.
|