Mehrstellige Zahlen per IR-Fernbedienung eingeben

Hallo zusammen,

ich stehe vor folgendem Problem bzw. ich benötige einen Lösungsansatz von euch. :slight_smile:

Ich möchte mit einer IR-Fernbedienung über die Zifferntasten zwei verschiedene zweistellige Variablen einspeichern. Das bedeutet: Ich drücke Taste x. Dann kann ich Ziffer 1 und Ziffer 2 drücken, die zu einer zweistelligen Zahl "zusammenschmelzen". Dann drücke ich Taste y. Danach kann ich dann Ziffer 3 und Ziffer 4 eingeben, die zu einer zweiten zweistelligen Zahl "zusammenschmelzen".

Ein Beispiel:

  1. Ich drücke Taste x
  2. Ich drücke die Zifferntaste 0
  3. Ich drücke die Zifferntaste 7
  4. Ich drücke Taste y
  5. Ich drücke die Zifferntaste 4
  6. Ich drücke die Zifferntaste 8
  7. Ich drücke Taste z, um den "Programmiervorgang" zu beenden

Nun soll die erste Variable mit dem Wert 07 und die zweite Variable mit dem Wert 48 eingespeichert werden, sodass ich diese weiterverwenden kann.

Letztendlich möchte ich über die Tasten einer IR-Fernbedienung eine Uhrzeit eingeben, zu der etwas passieren soll...

Viele Grüße und besten Dank vorab

Noah

PS: Habe schon viel recherchiert, jedoch nichts wirklich hilfreiches gefunden...

(deleted)

Du musst einfach über ein char Array deiner IR-Codes eine Auswertung zu deinen gewünschten Zahlen aufbauen. Das geht dann über eine swicht/case-Auswertung.

Peter-CAD-HST:
Moin Maker1212

guck dir mal die IR-Beispiele im IDE an.

Gruss Peter

und gesund bleiben

Habe ich schon, habe jedoch kein wirklich passendes Beispiel gefunden...

HotSystems:
Du musst einfach über ein char Array deiner IR-Codes eine Auswertung zu deinen gewünschten Zahlen aufbauen. Das geht dann über eine swicht/case-Auswertung.

So etwas habe ich auch schon gelesen, aber habe keine Ahnung, wie das geht... Kannst du mir das eventuell an einem kleinen Beispiel zeigen, das ich dann ergänzen kann?

Viele Grüße

Noah

(deleted)

Maker1212:
Habe ich schon, habe jedoch kein wirklich passendes Beispiel gefunden...

So etwas habe ich auch schon gelesen, aber habe keine Ahnung, wie das geht... Kannst du mir das eventuell an einem kleinen Beispiel zeigen, das ich dann ergänzen kann?

Viele Grüße

Noah

Du wirst nur selten etwas genau passendes finden.
In der IDE findest du Beispiele für switch/case und in der Library findest du Beispiel zu Auswertung der IR-Codes.
Beides kannst du entsprechend kombinieren.

Wenn du dann was aufgebaut hast darfst du gern bei Problemen wieder fragen.

Peter-CAD-HST:
Moin Noah,

dann fang mal an was zu programmieren.

Hier sind genügend nette Menschen, die dir bei der Umsetzung helfen werden.

Gruss Peter

Ehrlich gesagt verstehe ich dieses char array nicht und wie ich das umsetzen kann.

Ich habe jetzt erstmal nur den Sketch, jedoch keine Ahnung, wie ich meinem Ziel näher kommen kann…

#include <IRremote.h>
int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results results;

int ziffer[] = {2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057};

/*
 * Die erste Zahl ist die IR-Zahl der jeweiligen Taste, die zweite Zahl (nach dem "=") ist die jeweilige Tastenziffer
 * 2048=0
 * 2049=1
 * 2050=2
 * 2051=3
 * 2052=4
 * 2053=5
 * 2054=6
 * 2055=7
 * 2056=8
 * 2057=9
 */

void setup(){
Serial.begin(9600);
irrecv.enableIRIn();
}

void loop() {
  Serial.print(ziffer[1]);
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);

    if (results.value == 2060) {
    }

    if (results.value == 12) {
    }

    irrecv.resume();
  }
}

Grüße

Noah

Sorry, das mit char Array war ein Fehler, sollte nur Array heißen.

So wie du es jetzt verwendest, ist es ungünstig und du solltest du es umbauen und mit switch/case verwenden.

Jetzt habe ich folgendes:

#include <IRremote.h>
int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results results;

//int ziffer[] = {2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057};

/*
 * Die erste Zahl ist die IR-Zahl der jeweiligen Taste, die zweite Zahl (nach dem "=") ist die jeweilige Tastenziffer
 * 2048=0
 * 2049=1
 * 2050=2
 * 2051=3
 * 2052=4
 * 2053=5
 * 2054=6
 * 2055=7
 * 2056=8
 * 2057=9
 */

void setup(){
Serial.begin(9600);
irrecv.enableIRIn();
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
    switch(results.value) {
      case 2048:
      Serial.println("0");
      break;
      case 2049:
      Serial.println("1");
      break;
      case 2050:
      Serial.println("2");
      break;
      case 2051:
      Serial.println("3");
      break;
      case 2052:
      Serial.println("4");
      break;
      case 2053:
      Serial.println("5");
      break;
      case 2054:
      Serial.println("6");
      break;
      case 2055:
      Serial.println("7");
      break;
      case 2056:
      Serial.println("8");
      break;
      case 2057:
      Serial.println("9");
      break;
    }

    irrecv.resume();
  }
}

Wie bekomme ich jetzt einzelne Ziffern zu einer Zahl?

Hi

Warum so kompliziert?
Wie war Das gleich in der Grundschule?
Wir fangen bei 0 an
Dann kommt eine 8, wir haben 8.
Nun kommt eine 5, wir haben 85.
Jetzt eine 3, 853.
Nun 7? Dann wird’s wohl 8537.

Ziel-Variable Typ so wählen, daß Deine größte Zahl da rein passt.
Zum Start des Sketch und jedes Mal, wenn eine Zahl komplett bearbeitet wurde, diese Variable auf Null setzen.
Bei jeder Ziffer diese Ziel-Variable x 10, + Ziffer.
(wenn die Ziffer das Zahlzeichen ‘0’ ist, dann halt noch ‘0’ davon abziehen)
(ok, dann eben minus 2048 - da ‘0’ 2048 entspricht)

Nach jeder Ziffer ist die ‘neue’ Zahl in der Variable auslesbar.

MfG

PS:
ir_val=results.value;
if (ir_val>=2048 && ir_val<=(2048+9)){
ir_val-=2048;
ziel_var*=10;
ziel_var+=ir_val;
}

postmaster-ino:
Hi

Warum so kompliziert?
Wie war Das gleich in der Grundschule?
Wir fangen bei 0 an
Dann kommt eine 8, wir haben 8.
Nun kommt eine 5, wir haben 85.
Jetzt eine 3, 853.
Nun 7? Dann wird’s wohl 8537.

Ziel-Variable Typ so wählen, daß Deine größte Zahl da rein passt.
Zum Start des Sketch und jedes Mal, wenn eine Zahl komplett bearbeitet wurde, diese Variable auf Null setzen.
Bei jeder Ziffer diese Ziel-Variable x 10, + Ziffer.
(wenn die Ziffer das Zahlzeichen ‘0’ ist, dann halt noch ‘0’ davon abziehen)
(ok, dann eben minus 2048 - da ‘0’ 2048 entspricht)

Nach jeder Ziffer ist die ‘neue’ Zahl in der Variable auslesbar.

MfG

PS:
ir_val=results.value;
if (ir_val>=2048 && ir_val<=(2048+9)){
ir_val-=2048;
ziel_var*=10;
ziel_var+=ir_val;
}

Bin nun deinem Rat gefolgt und habe es auf deine Art und Weise versucht. Musste noch ein paar Sachen modifizieren. Jetzt klappt es jetzt!! Vielen Dank sowohl dir als auch allen anderen für eure nette Hilfe.

Anbei noch der funktionierende Sketch, falls ihn jemand benötigt:

#include <IRremote.h>
int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;

 unsigned long ir_val = 0;
 unsigned long ziel_var = 0;
 int stunden = 0;
 int minuten = 0;

void setup(){
Serial.begin(9600);
irrecv.enableIRIn();
}

void loop() {
  if(irrecv.decode(&results)) {
    if(results.value >= 0 && results.value <= 12){
      results.value = map(results.value, 0, 12, 2048, 2060);
    }
    Serial.print("Results.value: ");
    Serial.println(results.value, DEC);
    ir_val=results.value;
    if(ir_val >= 2048 && ir_val <= 2057){
      ir_val-=2048;
      ziel_var*=10;
      ziel_var+=ir_val;
    }
    if(results.value == 2060){
      ziel_var = 0;
    }
    delay(200);
    stunden = ziel_var/100;
    minuten = ziel_var-stunden*100;
    Serial.print("IR_VAL: ");
    Serial.println(ir_val, DEC);
    Serial.print("ZIEL_VAR: ");
    Serial.println(ziel_var, DEC);
    Serial.print("Stunde: ");
    Serial.println(stunden);
    Serial.print("Minute: ");
    Serial.println(minuten);
    irrecv.resume();
  }
}

Viele Grüße

Noah

Hi

if(results.value >= 0 && results.value <= 12){
results.value = map(results.value, 0, 12, 2048, 2060);
}

Was bekommst Du für Werte von der IR-Lib?
Etwas seltsam ist, daß Du 0…12 zu bekommen scheinst um darauf 2048…2060 zu machen, um daraus (durch mich) wieder 0…9 zu machen.

Wenn’s so klappt - wunderbar - never change a running system!!
Aber: Warum kommen Da so krumme Werte - also 13 (0-12) für einen Bereich von 10 (0-9) raus?

MfG

Ziffer 0 hat den IR-Wert 2048 UND 0 (immer abwechselnd)
Ziffer 1 hat den IR-Wert 2049 UND 1 (immer abwechselnd)
und so weiter bis Ziffer 9

Eine andere Taste, die ich für den Reset von der Ziel Variable habe, hat 2060 UND 12. Deswegen bis 2060 bzw. 12.

Alle Tasten haben zwei IR-Werte, um wiederholtes Drücken einer Taste erkennbar zu machen.

if(results.value >= 0 && results.value <= 12){
      results.value = map(results.value, 0, 12, 2048, 2060);
}

Mit dem Befehl sorge ich dafür, dass ein Tastendruck von beispielsweise Ziffer 0 immer den results.value 2048 ausspuckt und nicht die 0, damit ich einheitlich weiter vorgehen kann und nicht immer mit beiden Möglichkeiten weiterarbeiten muss.

Hoffe, es ist verständlich…

Grüße Noah

Noch eine Frage zu deinem Code, den du geschickt hast:

Wofür genau sorgt dieses "-", "*" und "+" vor dem "=" bzw. was genau passiert hier?

ir_val-=2048;
      ziel_var*=10;
      ziel_var+=ir_val;

Würde mich sehr über eine Erklärung freuen.

Der Zuweisungs-Operator kann mehr sls nur zuweisen.
a += b; ist dasselbe wie a = a+b;

Alles klar. Dann an dich vielen Dank!!

Grüße

Noah