

Die Fernbedienung steuert verschiedene Lauflichter. Sie leuchten jeweils solange, bis eine beliebige andere Taste auf der Fernbedienung gedrückt wird.
Taste 1 ⇒ die LEDs leuchten nacheinander für 100 ms,
Taste 2 ⇒ die LEDs leuchten nacheinander für 100 ms vor und zurück
Taste 3 ⇒ LEDs blinken zufällig oft nacheinander
So sieht es aus:
Benötigte Bauteile:
- 5 LEDs
- 3 Widerstände 220 Ω (gelbe, rote und grüne LED)
- 2 Widerstände 100 Ω (blaue und weiße LED)
- Infrarot-Empfänger
- Keyes-Fernbedienung
- Leitungsdrähte

Beachte die ⇒Vorwiderstände verschiedener LEDs
Baue die Schaltung auf.
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Achte auf die Pinbelegung der Infrarotempfänger.


Achte darauf, dass die Batterie richtig eingelegt wurde. Der Minus-Pol liegt oben.
Benötigte Bibliothek:
Suche die Bibliothek IRremote ...

… klicke auf Installieren.
Die Fernbedienung sendet beim Druck auf die Tasten einen Zahlencode.
Tastencodes Keyes-Fernbedienung
| Pfeil oben | ||
| 70 (0x46) | ||
| Pfeil links | Taste OK | Pfeil rechts |
| 68 (0x44) | 64 (0x40) | 67 (0x43) |
| Pfeil unten | ||
| 21 (0x15) | ||
| Taste 1 | Taste 2 | Taste 3 |
| 22 (0x16) | 25 (0x19) | 13 (0xD) |
| Taste 4 | Taste 5 | Taste 6 |
| 12 (0xC) | 24 (0x18) | 94 (0x5E) |
| Taste 7 | Taste 8 | Taste 9 |
| 8 (0xB) | 28 (0x1C) | 90 (0x5A) |
| Taste * | Taste 0 | Taste # |
| 66 (0x42) | 82 (0x52) | 74 (0x4A) |

⇒Tastencodes OpenSmart Fernbedienung

⇒Testprogramm beliebige Fernbedienung
Die Tastencodes kannst du mit folgendem Programm herausfinden. Sie werden im Seriellen Monitor angezeigt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | // benötigte Bibliothek einbinden #include "IRremote.hpp" // der Pin, an dem der Infrarot-Empfänger angeschlossen ist int EmpfaengerPin = 2; void setup() { // Seriellen Monitor starten Serial.begin(9600); // Infrarot-Empfänger starten IrReceiver.begin(EmpfaengerPin); } void loop() { // decode() -> Daten lesen if (IrReceiver.decode()) { // kurzes delay, damit nur ein Tastendruck gelesen wird delay(200); // resume -> nächsten Wert lesen IrReceiver.resume(); /* der Empfänger empfängt zwischendurch Signale, die nicht ausgewertet werden können es sollen deshalb nur die korrekt erkannten Tasten ausgewertet werden die Dezimalwerte der korrekten erkannten Tasten liegen zwischen > 0 und < 95 es wird abgefragt, ob das empfangene Kommando decodedIRData.command zwischen 0 und (&&) 95 liegt */ if (IrReceiver.decodedIRData.command > 0 && IrReceiver.decodedIRData.command < 95) { Serial.print("Dezimalwert: "); // IrReceiver.decodedIRData.command = Wert der gedrückten Taste Serial.print(IrReceiver.decodedIRData.command); Serial.print(" -> "); // Werte abfragen und anzeigen if (IrReceiver.decodedIRData.command == 22) Serial.println("Taste 1"); if (IrReceiver.decodedIRData.command == 25) Serial.println("Taste 2"); if (IrReceiver.decodedIRData.command == 13) Serial.println("Taste 3"); if (IrReceiver.decodedIRData.command == 12) Serial.println("Taste 4"); if (IrReceiver.decodedIRData.command == 24) Serial.println("Taste 5"); if (IrReceiver.decodedIRData.command == 94) Serial.println("Taste 6"); if (IrReceiver.decodedIRData.command == 8) Serial.println("Taste 7"); if (IrReceiver.decodedIRData.command == 28) Serial.println("Taste 8"); if (IrReceiver.decodedIRData.command == 90) Serial.println("Taste 9"); if (IrReceiver.decodedIRData.command == 82) Serial.println("Taste 0"); if (IrReceiver.decodedIRData.command == 66) Serial.println("Taste *"); if (IrReceiver.decodedIRData.command == 74) Serial.println("Taste #"); if (IrReceiver.decodedIRData.command == 68) Serial.println("Pfeil links"); if (IrReceiver.decodedIRData.command == 67) Serial.println("Pfeil rechts"); if (IrReceiver.decodedIRData.command == 70) Serial.println("Pfeil oben"); if (IrReceiver.decodedIRData.command == 21) Serial.println("Pfeil unten"); if (IrReceiver.decodedIRData.command == 64) Serial.println("OK"); } } } |


Beispiel:
Durch Drücken der Taste Pfeil nach oben wird eine LED eingeschaltet, Pfeil nach unten schaltet sie wieder aus.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include "IRremote.hpp" int EmpfaengerPin = 2; int LED = 3; void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} // Empfänger starten IrReceiver.begin(EmpfaengerPin); pinMode(LED, OUTPUT); } void loop() { // Daten lesen if (IrReceiver.decode()) { // oben if (IrReceiver.decodedIRData.command == 70 ) { digitalWrite(LED, HIGH); } // unten else if (IrReceiver.decodedIRData.command == 21) { digitalWrite(LED, LOW); } delay(200); // nächsten Wert lesen IrReceiver.resume(); } } |
Binde die benötigte Bibliothek ein und definiere die Variablen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include "IRremote.hpp" // Pin für den Auslöser des Interrupts int InterruptPin = 2; // Array mit 5 Elementen und den zugehörigen Ports int LED[5] = {3, 4, 5, 6, 7}; // Anzahl der LEDs feststellen int LEDMax = sizeof(LED) / sizeof(LED[0]); // Variable im Flash-Speicher ablegen volatile bool Status = true; int Leuchtdauer = 100; |
Der setup-Teil. Beachte die Kommentare
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} // Zufallsgenerator starten randomSeed(analogRead(A0)); // Empfänger starten IrReceiver.begin(InterruptPin); for (int i = 0; i < LEDMax; i++) { pinMode(LED[i], OUTPUT); } // Funktion Schalten() dem Interrupt-Pin zuordnen attachInterrupt(digitalPinToInterrupt(InterruptPin), Schalten, FALLING); } |

Im loop-Teil musst du zunächst die Tastencodes abfragen und anschließend die Tastencodes mit ⇒switch ... case auswerten:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | void loop() { // Daten lesen if (IrReceiver.decodedIRData.address == 0) { if (IrReceiver.decode()) { delay(200); // nächsten Wert lesen IrReceiver.resume(); Status = true; /* solange der Status true ist, wird die jeweilige while-Schleife ausgeführt, ein weiterer Druck auf eine Taste der Fernbedienung löst den Interrupt aus -> Status wird zu false, die while-Schleife wird nicht erneut ausgeführt */ switch (IrReceiver.decodedIRData.command) { // Taste 1: Lauflicht vor case 22: while (Status) LauflichtHin(); break; // Taste 2: LEDs leuchten vor und zurück case 25: while (Status) LauflichtHinUndHer(); break; // Taste 3: LEDs blinken nacheinander case 13: while (Status) LauflichtMitBlinken(); break; } } } } |
Beginne mit der Programmierung für die Lauflichter.
Schreibe ⇒Funktionen für die den Tasten der Fernbedienung zugeordneten Ereignisse:
LEDBlinken()
LauflichtHin()
LauflichtHinUndHer()
LauflichtMitBlinken()
und die durch den Interrupt ausgelöste Funktion Schalten(). Sie ändert den Zustand von Status auf false.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | void LEDBlinken(int LEDNummer, int Anzahl) { for (int i = 0; i <= Anzahl; i++) { digitalWrite(LEDNummer, HIGH); delay(Leuchtdauer); digitalWrite(LEDNummer, LOW); delay(Leuchtdauer); } } void LauflichtHin() { for (int i = 0; i < LEDMax; i++) { digitalWrite(LED[i], HIGH); delay(Leuchtdauer); digitalWrite(LED[i], LOW); } } void LauflichtMitBlinken() { for (int i = 0; i < LEDMax; i++) { int Anzahl = random(1, 5); /* aktuelle LED i einschalten ⇒ Funktion LEDBlinken aufrufen */ LEDBlinken(LED[i], Anzahl); } } void LauflichtHinUndHer() { for (int i = 0; i < LEDMax; i++) { digitalWrite(LED[i], HIGH); delay(Leuchtdauer); digitalWrite(LED[i], LOW); } // und wieder zurück for (int i = LEDMax - 1; i >= 0; i--) { digitalWrite(LED[i], HIGH); delay(Leuchtdauer); digitalWrite(LED[i], LOW); } } void Schalten() { Status = false; } |
Verwandte Anleitungen:
Letzte Aktualisierung:






