LED-Helligkeit per PWM und Taster am Arduino Mega steuern
Komponenten und Zubehör
| Komponente | Menge | Hinweise |
|---|---|---|
| Arduino Mega 2560 | 1 | |
| Steckbrett (Breadboard) | 1 | |
| Jumper-Kabel | 11 | Menge kann variieren |
| LED (beliebig) | 3 | Empfohlen: 3 verschiedene Farben |
| Taster 12 mm (SparkFun) | 1 | |
| Widerstand 330 Ω | 4 |
Apps und Online-Dienste
- Arduino IDE
Projektbeschreibung
Dieses Projekt zeigt, wie man LEDs mit Arduino per PWM dimmt. Es ist in drei Stufen unterteilt:
- LEDs faden (automatisch)
- LEDs faden mit Taster
- LEDs faden mit Taster – Verbesserung der Verzögerung (nicht-blockierend)
1. LEDs faden (automatisch)
Am Ende dieses Abschnitts leuchten die LEDs nacheinander wie eine Ampel auf und ab.
Schaltplan

Die LEDs sind an den PWM-Pins 3, 6 und 9 angeschlossen. Andere PWM-Pins sind möglich, müssen aber im Code angepasst werden.
Code
Zuerst die Pin-Definitionen:
int ledRed = 9;
int ledYellow = 6;
int ledGreen = 3;
Im setup() die Pins als Output definieren:
void setup() {
pinMode(ledRed, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledGreen, OUTPUT);
}
Im loop() die PWM-Werte hoch- und runterzählen:
void loop() {
// Rot
for (int i = 0; i <= 255; i++) {
analogWrite(ledRed, i);
delay(30);
}
for (int i = 255; i >= 0; i--) {
analogWrite(ledRed, i);
delay(30);
}
}
Die Variable i läuft von 0 bis 255 (aufhellen) und zurück (abdimmen). delay(30) bestimmt die Geschwindigkeit.
Für alle drei LEDs und einfachere Anpassung der Geschwindigkeit eine Konstante definieren:
const int fade = 10; // Verzögerung in ms
void loop() {
// Rot
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
// Gelb
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
// Grün
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
// Gelb wieder
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
}
2. LEDs faden mit Taster
Der Farbwechsel erfolgt nur bei Tastendruck.
Schaltplan

Taster an Pin 7 (Pull-Down-Widerstand nicht vergessen oder internen Pull-Up nutzen).
Code
Taster-Pin definieren und im setup() als Input setzen, Startzustand (Grün an) festlegen:
int button = 7;
const int fade = 10;
void setup() {
pinMode(ledRed, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledGreen, OUTPUT);
pinMode(button, INPUT);
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, HIGH);
}
Der loop() prüft den Taster (mit einfacher Entprellung) und ruft fadeLights() auf:
void loop() {
if (digitalRead(button) == HIGH) {
delay(15); // Entprellung
if (digitalRead(button) == HIGH) {
fadeLights();
}
} else {
digitalWrite(ledRed, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGreen, HIGH);
}
}
Die Funktion fadeLights() enthält die Fade-Sequenz (beginnend mit Grün ausblenden):
void fadeLights() {
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
}
Falls die Reihenfolge nicht stimmt: Code und Verkabelung prüfen. Wenn LEDs nicht leuchten: Verkabelung, Pin-Nummern und Formel prüfen.
3. LEDs faden mit Taster – Verbesserung (nicht-blockierend)
Problem: Bei loslassen des Tasters läuft die Sequenz weiter. Lösung: In jeder Schleife den Taster prüfen und bei Loslassen return ausführen.
Schaltplan
Unverändert.

Code
Konstante fade entfällt. Im loop() bleibt die Struktur, aber fadeLights() wird geändert:
void fadeLights() {
// Grün ausblenden
for (int i = 255; i >= 0; i--) {
analogWrite(ledGreen, i);
for (int y = 0; y < 1000; y++) {
if (digitalRead(button) == LOW) return;
}
}
// Gelb aufblenden
for (int i = 0; i <= 255; i++) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) {
if (digitalRead(button) == LOW) return;
}
}
// Gelb ausblenden
for (int i = 255; i >= 0; i--) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) {
if (digitalRead(button) == LOW) return;
}
}
// Rot aufblenden
for (int i = 0; i <= 255; i++) {
analogWrite(ledRed, i);
for (int y = 0; y < 1000; y++) {
if (digitalRead(button) == LOW) return;
}
}
// Rot ausblenden
for (int i = 255; i >= 0; i--) {
analogWrite(ledRed, i);
for (int y = 0; y < 1000; y++) {
if (digitalRead(button) == LOW) return;
}
}
// Gelb aufblenden
for (int i = 0; i <= 255; i++) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) {
if (digitalRead(button) == LOW) return;
}
}
// Gelb ausblenden
for (int i = 255; i >= 0; i--) {
analogWrite(ledYellow, i);
for (int y = 0; y < 400; y++) {
if (digitalRead(button) == LOW) return;
}
}
// Grün aufblenden
for (int i = 0; i <= 255; i++) {
analogWrite(ledGreen, i);
for (int y = 0; y < 1000; y++) {
if (digitalRead(button) == LOW) return;
}
}
}
Die inneren for-Schleifen ersetzen delay() und prüfen dabei den Taster. Wird er losgelassen, bricht return die Funktion ab und der else-Zweig im loop() setzt den Startzustand (Grün an). Die Schleifenzähler (1000, 400) bestimmen die Geschwindigkeit – je nach Board anpassen.
Complete Codes
1. Fade Lights
int ledRed = 9; int ledYellow = 6; int ledGreen = 3; const int fade = 10;
void setup() {
pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT);
}
void loop() {
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
}
2. Fade Lights with Push Button
int ledRed = 9; int ledYellow = 6; int ledGreen = 3; int button = 7; const int fade = 10;
void setup() {
pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT);
pinMode(button, INPUT);
digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH);
}
void loop() {
if (digitalRead(button) == HIGH) { delay(15); if (digitalRead(button) == HIGH) fadeLights(); }
else { digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH); }
}
void fadeLights() {
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); delay(fade); }
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); delay(fade); }
}
3. Fade Lights with Push Button (Improvement)
int ledRed = 9; int ledYellow = 6; int ledGreen = 3; int button = 7; const int fade = 10;
void setup() {
pinMode(ledRed, OUTPUT); pinMode(ledYellow, OUTPUT); pinMode(ledGreen, OUTPUT);
pinMode(button, INPUT);
digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH);
}
void loop() {
if (digitalRead(button) == HIGH) { delay(15); if (digitalRead(button) == HIGH) fadeLights(); }
else { digitalWrite(ledRed, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledGreen, HIGH); }
}
void fadeLights() {
for (int i = 255; i >= 0; i--) { analogWrite(ledGreen, i); for (int y = 0; y < 1000; y++) if (digitalRead(button) == LOW) return; }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) if (digitalRead(button) == LOW) return; }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) if (digitalRead(button) == LOW) return; }
for (int i = 0; i <= 255; i++) { analogWrite(ledRed, i); for (int y = 0; y < 1000; y++) if (digitalRead(button) == LOW) return; }
for (int i = 255; i >= 0; i--) { analogWrite(ledRed, i); for (int y = 0; y < 1000; y++) if (digitalRead(button) == LOW) return; }
for (int i = 0; i <= 255; i++) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) if (digitalRead(button) == LOW) return; }
for (int i = 255; i >= 0; i--) { analogWrite(ledYellow, i); for (int y = 0; y < 400; y++) if (digitalRead(button) == LOW) return; }
for (int i = 0; i <= 255; i++) { analogWrite(ledGreen, i); for (int y = 0; y < 1000; y++) if (digitalRead(button) == LOW) return; }
}
Schaltpläne


Herstellungsprozess
- Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
- RFID-Anwesenheitssystem mit Arduino & Python – Daten direkt in phpMyAdmin (XAMPP) speichern
- DHT11 Temperatur- & Feuchtesensor mit LED-Anzeige & Piezo-Summer
- Ultraschall-Schwebegerät mit Arduino bauen – Akustische Levitation Schritt für Schritt
- Unopad: Nahtloser Arduino MIDI-Controller für Ableton Live
- Automatische Pflanzenbewässerung mit Arduino – Sorgenfrei in den Urlaub
- Einfachen Hindernissensor mit Arduino bauen – IR-LED & Photodiode Tutorial
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
- Erdmassen-Messung mit Arduino: Schritt-für-Schritt DIY-Anleitung
- 25-kHz-4-Pin-PWM-Lüftersteuerung mit Arduino Uno – Bau, Code & Test