Tastenkombination arduino?


15.02.2020, 21:03

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...


LeSliQw 
Beitragsersteller
 16.02.2020, 16:41

Soweit bin ich auch schon aber wie sieht könnte das im Code aussehen hab aktuell leider 0 Vorstellung wie das aussehen könnte 😅

0
RareDevil  16.02.2020, 18:14
@LeSliQw

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...

1
LeSliQw 
Beitragsersteller
 16.02.2020, 18:40
@RareDevil

Okay werden das dann bald Mal ausprobieren danke schon Mal

0
RareDevil  17.02.2020, 15:41
@LeSliQw

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
  }
}
1

Meinst du eine ir Fernbedienung?

Woher ich das weiß:Studium / Ausbildung – Informatikstudent

LeSliQw 
Beitragsersteller
 15.02.2020, 20:45

Ja genau

0