Zwei LEDs mit unterschiedlichen Frequenzen auf Arduino blinken lassen – ohne delay()
Benötigte Komponenten
| Arduino UNO | × | 1 |
| 5 mm LED: Rot | × | 2 |
Projektbeschreibung
Dieses Projekt entstand aus häufigen Fragen in Online-Foren: Wie lassen sich zwei LEDs mit unterschiedlichen Blinkraten steuern, ohne die delay()-Funktion zu verwenden?
Das Problem mit delay()
Wenn wir eine LED alle 1000 ms und eine zweite alle 500 ms blinken lassen wollen, können wir delay() noch verwenden, indem wir die 1000 ms Wartezeit der ersten LED in zwei 500 ms Intervalle für die zweite LED aufteilen. Sobald jedoch die Intervalle nicht mehr ganzzahlig teilbar sind – beispielsweise 1000 ms und 300 ms – wird die Lösung mit delay() extrem komplex oder unmöglich.
Die Lösung: BlinkWithoutDelay
Die Arduino IDE enthält bereits ein Beispiel namens BlinkWithoutDelay, das zeigt, wie man Zeitintervalle mit millis() statt delay() verwaltet. Der Trick: Wir speichern den Zeitpunkt des letzten Wechsels für jede LED und prüfen in jedem Schleifendurchlauf, ob das Intervall verstrichen ist.
Im Beispielcode werden zwei unabhängige Timer für die beiden LEDs geführt. Jede LED hat ihren eigenen previousMillis-Wert und ihr eigenes interval. So können beliebig viele LEDs mit völlig unterschiedlichen Frequenzen gesteuert werden, ohne sich gegenseitig zu blockieren.
Code
const int ledPin = LED_BUILTIN;
int ledState = LOW;
unsigned long previousMillis = 0;
const long interval = 1000;
const int ledPin2 = 12;
int ledState2 = LOW;
unsigned long previousMillis2 = 0;
const long interval2 = 300;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
ledState = (ledState == LOW) ? HIGH : LOW;
digitalWrite(ledPin, ledState);
}
if (currentMillis - previousMillis2 >= interval2) {
previousMillis2 = currentMillis;
ledState2 = (ledState2 == LOW) ? HIGH : LOW;
digitalWrite(ledPin2, ledState2);
}
}
Schaltplan
Die auf dem Bild gezeigte Schaltung verbindet die eingebaute LED (Pin 13) und eine externe LED an Pin 12 jeweils über Vorwiderstände mit GND.
Fazit
Wer delay() vermeidet, gewinnt volle Kontrolle über parallele Abläufe. Das Prinzip lässt sich beliebig erweitern – für mehrere LEDs, Sensoren, Motoren oder Kommunikationsaufgaben. Der Code ist bewusst einfach gehalten, um Einsteigern den Einstieg in nicht-blockierende Programmierung zu erleichtern.
Herstellungsprozess
- Aluminium vor Korrosion schützen: Expertenstrategien für langfristige Haltbarkeit
- Cloud Computing von Grund auf meistern: Praktischer Guide für Einsteiger
- Warum der Wechsel von C zu C++ Embedded Development boosten kann
- Echtzeit-Temperatur- & Feuchtigkeitsmonitoring via Web auf Raspberry Pi 4
- Einsteiger IoT Tutorial: Temperaturdaten vom Raspberry Pi streamen
- Echtzeit-Temperaturdaten vom ppDAQC Pi‑Plate zu InitialState streamen – Headless Raspberry Pi
- WLAN-gesteuerter Roboter mit Raspberry Pi & Android Smartphone bauen
- Verilog Delay Control verstehen: Timing-Techniken und Best Practices
- Ursprünge des Sägekonzepts: Von antiken Werkzeugen zu modernen Maschinen
- Grauguss verstehen: Eigenschaften, Herstellung und Automobilanwendungen