Tastenkombination arduino?
Ich möchte auf einer Fernbedienung eine tastenkombination eingeben können und nur wenn diese Kombination gedrückt wurde soll eine bestimmte Farbe an der Led aufleuchten
Kann mir bitte jemand erklären oder nen Link geben wie das möglich ist ? 😅
Vielen Dank im vorraus
Als Eingabe wird eine IR Fernbedienung dienen
3 Antworten
Dann musst Du erst mal alle Eingaben der Fernbedienung auslesen, welchen Code sie je Taste sendet... Wenn die Codes bekannt sind, musst Du eine Abfrage programmieren... ersten Wert einlesen, wenn dieser Wert der ersten Taste entspricht, zweiten Wert einlesen und auswerten, dann dritten Wert ect... Nur wenn die Reihenfolge stimmt, dann die gewählte Aktion ausführen, sonst abbrechen... Würde noch einen Timer als zetlichen Abbruch laufen lassen, damit die Eingabe nach z.B. 5sek automatisch wieder abbricht...
Welche Library nutzt Du denn? Zumindest mit dem entsprechendem Befehl lesen und in eine variable speichern... Dazu noch einen Zähler für den aktuell zu prüfenden Code...
dann eben mit
if(Code == 1 && IRcode == 11111111){
Code = 2;
Delay(200);
}
if(Code == 2 && IRcode == 22222222){
Code = 3;
Delay(200);
}
else{
Code = 1
}
usw...
Sowas in der Art... zuerst wird der erste Code geprüft, wenn der gestimmt hat, dann wird auf Code 2 gesetzt... Dann der 2. Code geprüft, bei richtiger Eingabe wird dann auf Code 3 gestzt, sonst zurück gesetzt... Delay ist wegen der Tasterbedienung.. Wenn Du zu lange drückst, wird ggf der falsche Code geprüft.. Müsste man ausprobieren, wie das ganze sich genau verhält.. Ist nur eine Idee. Hab das noch nie ausprobiert...
Okay werden das dann bald Mal ausprobieren danke schon Mal
Hab mal was gestrickt... 3 Eingaben hintereinander (beliebig erweiterbar... Codes musst Du auf deine Fernbedienung anpassen). 1sek Laufzeitüberwachung nach der letzten Eingabe bricht die Eingabe ab... Falscher Tastendruck bricht ebenfalls ab... Gehaltene Taste wird berücksichtigt und führt nicht zur Fehleingabe, Laufzeit wird dabei zurück gesetzt... Mit kommentaren der jeweiligen Zeile... IRremotelibrary von Ken Shirriff wird genutzt... (Nach Beispielcode von "Funduino" aus SirKermit*s Link...
/*
IRremote: IRrecvDemo - demonstrates
receiving IR codes with IRrecv
An IR detector/demodulator must be
connected to the input RECV_PIN.
Version 0.1 July, 2009
Copyright 2009 Ken Shirriff
http://arcfn.com
*/
//Infromationen über das ursprüngliche Programm „IrrecvDemo“.
#include <IRremote.h> // Das Programm greift an dieser Stelle auf eine „Library“ zurück. Das erleichtert einem viel Arbeit. Denn das Infrarotlicht wird mit einem Code verschlüsselt gesendet. Um diesen Code selber auszulesen und in passende Werte umzuwandeln, wären sehr viele Zeilen Code erforderlich.
int RECV_PIN = 11; // Der Kontakt der am Infrarotsensor die Daten ausgibt, wird mit Pin 11 des Arduinoboards verbunden.
IRrecv irrecv(RECV_PIN); // An dieser Stelle wird ein Objekt definiert, dass den Infrarotsensor an Pin 11 ausliest.
decode_results results; // Dieser Befehl sorgt dafür, dass die Daten, die per Infrarot eingelesen werden unter „results“ abgespeichert werden.
int Code = 1;
unsigned long IRcode = 0;
unsigned long Time = 0;
void setup()
{
Serial.begin(9600); //Im Setup wird die Serielle Verbindung gestartet, damit man sich die Empfangenen Daten der Fernbedienung per seriellen Monitor ansehen kann.
pinMode (13, OUTPUT);
irrecv.enableIRIn(); //Dieser Befehl initialisiert den Infrarotempfänger.
}
void loop()
{ //Der loop-Teil fällt durch den Rückgriff auf die „library“ sehr kurz aus.
if (irrecv.decode(&results)) { //Wenn Daten empfangen wurden,
IRcode = results.value, DEC;
Serial.print(IRcode); //werden sie als Dezimalzahl (DEC) an den Serial-Monitor ausgegeben. (Zum einlesen der Codes und Debug)
irrecv.resume(); //Der nächste Wert soll vom IR-Empfänger eingelesen werden
/* Codes meiner Fernbedienung
4294967295 Wird gesendet, wenn eine Taste gedrückt gehalten wird
1587632295 lauter
1587664935 leiser
*/
if (IRcode == 4294967295) { // Prüft, ob eine Taste gedrückt bleibt und verhindert ein zurücksetzen, da die Bedingung als 1. erfüllt ist
Serial.println(" Dauerdruck"); // Debugausgabe: Gibt nur aus, ob die Taste gedrückt gehalten wird
Time = millis(); // Setzt den Timer nach, damit die Zeit nicht abläuft
}
else if (IRcode == 1587632295 && Code == 1) { // Prüfung auf erste Eingabe
Code = 2; // setzt den Codezähler für die 2. Eingabe
Serial.println(" Code 1 erkannt"); // Debug-Ausgabe zum Testen
Time = millis(); // setzt den Timer zur Laufzeitüberwachung
}
else if (IRcode == 1587632295 && Code == 2) { // Prüfung auf 2. Eingabe, wenn die erste Eingabe ok war
Code = 3; // setzt den Codezähler für die 3. Eingabe
Serial.println(" Code 2 erkannt"); // Debug zum testen
Time = millis(); //setzt die Laufzeitüberwachung zurück
}
else if (IRcode == 1587664935 && Code == 3) { // Prüfung auf 3. Eingabe (meine letzte, da ich nur 3 Tastenfolgen geprüft habe
Code = 1; // Codezähler auf Start zurückgesetzt...
Serial.println(" Code 3 erkannt"); // Debug zum testen
Serial.println("Befehlsausgabe & zurückgesetzt"); // Debug für Test
// Hier könnte jetzt noch ein Befehl sein, der z.B. einen Ausgang schaltet
}
else { // Diese Zeile wird nur aktiv, wenn keine Vorbedingung erfüllt ist, also falscher Code getippt wird
Code = 1; // setzt den Codezähler zurück und alle Schritte werden ungültig
Serial.println(" Zurückgesetzt"); // Debug zum testen
}
// Bis hierhin wird der Code nur abgearbeitet, wenn eine Eingabe über IR angekommen ist.
// Alles nachfolgende wird immer zyklisch abgearbeitet
}
if (Code != 1 && (Time + 1000) < millis()) { // Prüft ob eine Codeeingabe läuft und Zeit nach letztem Druck länger wie 1000ms her ist
Code = 1; // Wenn Zeit abgelaufen, wird der Codezähler zurück gesetzt...
Serial.println("Zeitüberlauf, zurückgesetzt"); // Debug zum testen
}
}
Google hat auch heute nicht frei. ;-)
Lesetipp: https://funduino.de/nr-11-fernbedienung
Meinst du eine ir Fernbedienung?
Soweit bin ich auch schon aber wie sieht könnte das im Code aussehen hab aktuell leider 0 Vorstellung wie das aussehen könnte 😅