Go Down

Topic: Zahl aus Remote Tasteneingabe zusammensetzen. (Read 199 times) previous topic - next topic

MrZortrax

Hi,

ich möchte via IR Fernbedienung die Zahleneingaben 0-9 in einer Variable zusammen setzen. Wie beim Taschenrechner wenn man so will.

z.B. Druck auf Taste 1, 3, 5,

Ergibt 135

Ist wahrscheinlich simpel, ich habe das in C++ aber noch nicht gemacht.

Kann mir da bitte jemand mal ein Beispiel geben?

VarA  = VarA & VarB

So würds ja schon funktionieren. Geht aber so in C++ nicht wie ich es mir vorstelle.

my_xy_projekt

Zahleneingaben 0-9 in einer Variable zusammen setzen. Wie beim Taschenrechner wenn man so will.
z.B. Druck auf Taste 1, 3, 5, Ergibt 135

VarA  = VarA & VarB
Suchst Du sowas?
VarA=VarA*10+VarB

Achtung! Wertebereich beachten!

Tommy56

So, wie Du das auf dem Zettel auch machen würdest (Pseudocode):
Code: [Select]

int zahl = 0;#
solange wi nicht Ende {
char zeichen = inputFernbedienung();
zahl *=10 + zeichen - '0';
}

Für mehr solltest Du den Code zum Einlesen der Zeichen bereit stellen.
Woran erkennst Du Ende der Eingabe?

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

MrZortrax

#3
Nov 02, 2020, 10:02 pm Last Edit: Nov 02, 2020, 10:03 pm by MrZortrax
Okay...

Ich habe die LCDM lib im Einsatz. Ich habe mal die Belegung der Fernbedienung aufgelistet inkl. den Standardfunktionen.

Als Eingabeabschluss kann z.B. die Loop Taste dienen.  Ich möchte damit später Sekunden bzw Minuten eingaben tätigen. Wie müsste ich die einzelnen Tasten programmieren?

Vielen Dank! :)

Code: [Select]

void lcdml_menu_control(void)
{
  // If something must init, put in in the setup condition
  if(LCDML.BT_setup()) {
    // runs only once
    irmp_init();
  }

  if((millis() - g_LCDML_DISP_press_time) >= 200) {
    g_LCDML_DISP_press_time = millis(); // reset debounce timer
   
  if (irmp_get_data(&irmp_data[0]))
  {
    // comment this line out, to check the correct code
    //irmp_result_print(&irmp_data[0]);
    //delay(1000);
    // in this switch case you have to change the value 0x...1 to the correct IR code
    switch (irmp_data[0].command)

    //Fernbedienung Belegungen:
    // Ein/Aus  | P=NEC  A=0xFF00 C=0x45
    // Mode     | P=NEC  A=0xFF00 C=0x46
    // Mute     | P=NEC  A=0xFF00 C=0x47
    // Play     | P=NEC  A=0xFF00 C=0x44
    // Rev      | P=NEC  A=0xFF00 C=0x40
    // For      | P=NEC  A=0xFF00 C=0x43
    // EQ       | P=NEC  A=0xFF00 C=0x7
    // Minus    | P=NEC  A=0xFF00 C=0x15
    // Plus     | P=NEC  A=0xFF00 C=0x9
    // 0        | P=NEC  A=0xFF00 C=0x16
    // Loop     | P=NEC  A=0xFF00 C=0x19
    // U/SD     | P=NEC  A=0xFF00 C=0xD
    // 1        | P=NEC  A=0xFF00 C=0xC
    // 2        | P=NEC  A=0xFF00 C=0x18
    // 3        | P=NEC  A=0xFF00 C=0x5E
    // 4        | P=NEC  A=0xFF00 C=0x8
    // 5        | P=NEC  A=0xFF00 C=0x1C
    // 6        | P=NEC  A=0xFF00 C=0x5A
    // 7        | P=NEC  A=0xFF00 C=0x42
    // 8        | P=NEC  A=0xFF00 C=0x52
    // 9        | P=NEC  A=0xFF00 C=0x4A
   
    {
      case 0x7: LCDML.BT_enter(); break;
      case 0x15: LCDML.BT_up();    break;
      case 0x9: LCDML.BT_down(); break;
      case 0x40: LCDML.BT_left();  break;
      case 0x43: LCDML.BT_right(); break;
      case 0x44: LCDML.BT_quit();  break;
      case 0x16:  break;
      case 0xC:   break;
      case 0x18:   break;
      case 0x5E:   break;
      case 0x8:   break;
      case 0x1C:   break;
      case 0x5A:   break;
      case 0x42:   break;
      case 0x52:   break;
      case 0x4A:   break;
     
      default: break;
    }
  }
  }
}

(deleted)

#4
Nov 03, 2020, 07:27 am Last Edit: Nov 03, 2020, 07:33 am by Peter-CAD-HST
(deleted)

my_xy_projekt

#5
Nov 03, 2020, 07:31 am Last Edit: Nov 03, 2020, 07:33 am by my_xy_projekt
Wie müsste ich die einzelnen Tasten programmieren?
?
Einfach zusammenrechnen?
Code: [Select]

int number=0;

    //Fernbedienung Belegungen:
    // 0        | P=NEC  A=0xFF00 C=0x16
    // 1        | P=NEC  A=0xFF00 C=0xC
  
    {
      case 0x16:  // 0 addieren
      number=number*10+0;
      break;
      case 0xC:  
      number=number*10+1;
      break;

//// hier mach was

number=0;


Wenn die erste Zahl eine 0 ist, bleibt number 0.
Die zweite Zahl eine 1, dann wird number 1


Wenn die erste Zahl eine 1 ist, wird number 1.
Die zweite Zahl eine 0, dann wird number 10

usw.
Die Prüfung, ob die Eingabe in den Wertebereich passt nicht vergessen! Minuten/Sekunden gehen nur bis 59.

MrZortrax

Super!

Das hilft mir wirklich schonmal sehr weiter!

Jetzt fehlt mir noch eine klevere Programmierung, in der ich mehrere Eingaben hintereinander machen kann.

In meiner Programmeriung sieht z.B. eine Eingabe jetzt folgendermaßen aus.

Code: [Select]

    if (globaltime == 0)
    {
    lcd.setCursor(0, 0);
    lcd.print(F("Enter Cure Time:"));
    lcd.setCursor(0, 1);
    lcd.print(F("Sek:    "));
    lcd.setCursor(4, 1);
    lcd.print(globalinput);
    
     if(globalsubmit==1)
    {
      globaltime = globalinput;
      globalinput=0;
      globalsubmit=0;
    }
    }


Wie ihr seht, ich habe noch eine Variable hinzugefügt, die den Bestätigungsbutton entspricht. Dieser soll dann den temporär eingegebenen Wert der eigentlichen Variabel übergeben.

Im nächsten Schritt möchte ich nachdem die Eingabe beendet ist einen weiteren Wert eingeben.

Wie kann ich die Programmierung sinnvoll gestalten, ohne alles in einem if unter zu bringen? Denn solange die Eingabe des ersten Wertes nicht erfolgt ist, soll die Frage nach dem 2. Wert nicht erscheinen. Nun könnte man überlegen in die nachfolgende Abfrage des nächsten Wertes die Voraussetzung <> 0 des vorherigen Wertes mit unterzubringen...

Gibt vielleicht aber auch einen viel einfacherern Weg. Was meint Ihr?

my_xy_projekt

#7
Nov 06, 2020, 10:57 am Last Edit: Nov 06, 2020, 11:00 am by my_xy_projekt
Gibt vielleicht aber auch einen viel einfacherern Weg. Was meint Ihr?
Schrittkette?
(ungetestet)
Code: [Select]

/* Forensketch https://forum.arduino.cc/index.php?topic=711787.msg4786918#msg4786918
    basiert auf https://forum.arduino.cc/index.php?topic=711787.msg4783229#msg4783229

    // 1        | P=NEC  A=0xFF00 C=0xC
    // 2        | P=NEC  A=0xFF00 C=0x18
    // 3        | P=NEC  A=0xFF00 C=0x5E
    // 4        | P=NEC  A=0xFF00 C=0x8
    // 5        | P=NEC  A=0xFF00 C=0x1C
    // 6        | P=NEC  A=0xFF00 C=0x5A
    // 7        | P=NEC  A=0xFF00 C=0x42
    // 8        | P=NEC  A=0xFF00 C=0x52
    // 9        | P=NEC  A=0xFF00 C=0x4A
    // Loop     | P=NEC  A=0xFF00 C=0x19
*/

unsigned int sekunde = 0;
unsigned int minute = 0;
unsigned int eingabe = 0;

void setup()
{
  Serial.begin (115200);
  Serial.println (F ("Start..."));
}

void loop()
{
  // hier weise der Variablen eingabe einen Wert zu:
  switch (irmp_data[0].command)
  case C=0x16: // 0
  eingabe = eingabe * 10 + 0;
  break;
case C=0xC: // 1
  eingabe = eingabe * 10 + 1;
break:
case C=0x18: // 2
  eingabe = eingabe * 10 + 2;
break:
case C=0x5E: // 3
  eingabe = eingabe * 10 + 3;
break:
case C=0x8: // 4
  eingabe = eingabe * 10 + 4;
break:
case C=0x1C: // 5
  eingabe = eingabe * 10 + 5;
break:
case C=0x5A: // 6
  eingabe = eingabe * 10 + 6;
break:
case C=0x42: // 7
  eingabe = eingabe * 10 + 7;
break:
case C=0x52: // 8
  eingabe = eingabe * 10 + 8;
break:
case C=0x4A: // 9
  eingabe = eingabe * 10 + 9;
break:
case C=0x19: // Ende Eingabe
  uebernahme (eingabe);
  break;
case default:
  eingabe = 0;
  uebernahme (eingabe);
break:
}
void uebernahme (const int a)
{
  static next = 0; // Variable für Schrittkette
  if (next >1)    // Einfügen weiterer Schritte ermöglichen
  {
    next = 0;
  }
  if (a > 59)      // bei weiteren Schritten evtl. verschieben
  {
    a = 0;
  }
  if (next == 0)
  {
    minute = a;
  }
  else
    if (next == 1)
    {
      sekunde = a;
    }
  next++;
}

MrZortrax

Ich habs momentan Testweise so gelöst...

Code: [Select]

    if (globaltime == 0)
    {
    lcd.setCursor(0, 0);
    lcd.print(F("Enter Cure Time:"));
    lcd.setCursor(0, 1);
    lcd.print(F("Sek:    "));
    lcd.setCursor(4, 1);
    lcd.print(globalinput);
    
     if(globalsubmit==1)
    {
      globaltime = globalinput;
      globalinput=0;
      globalsubmit=0;
    }
    }

    if (globaltime != 0 and objekthigh == 0)
    {
    lcd.setCursor(0, 0);
    lcd.print(F("Objekt in mm:   "));
    lcd.setCursor(0, 1);
    lcd.print(F("Objekt:    "));
    lcd.setCursor(7, 1);
    lcd.print(globalinput);
    
     if(globalsubmit==1)
    {
      objekthigh = globalinput;
      globalinput=0;
      globalsubmit=0;
    }
    }

    if (globaltime != 0 and objekthigh != 0)
    {
    lcd.setCursor(0, 0);
    lcd.print(F("Eingabe OK?     "));
    
    if (timestamp == 0)
    {
      timestamp = millis();
    }

    if (millis() >= timestamp + 2000 and millis() <= timestamp + 2100)
    {
    lcd.setCursor(0, 1);
    lcd.print(F("Curetime:       "));
    lcd.setCursor(9, 1);
    lcd.print(globaltime);
    }

    if (millis() >= timestamp + 4000 and millis() <= timestamp + 4100)
    {
    lcd.setCursor(0, 1);
    lcd.print(F("Objekt:         "));
    lcd.setCursor(7, 1);
    lcd.print(objekthigh);
    }

    if (millis() >= timestamp + 6000)
    {
      timestamp = millis();
    }
    
     if(globalsubmit==1)
    {
    lcd.setCursor(0, 1);
    lcd.print(F("Status:Start     "));
    //lcd.setCursor(7, 1);
    //lcd.print(objekthigh);
      globalsubmit=0;
    }
    }

Go Up