Eingabe Problem?

Und ich wiedermal,

diesmal aber mit einer Frage, die etwas komplizierter sein dürfte.

Bitte das angefügte Bild betrachten.

Ich habe eine 4D Systems Display und benutze die genieArduino Lib.

Was habe ich:

Ich steuere 4 Aktuatoren und deren Geschwindigkeit an einem Fahrzeug. (Klappt alles schon wunderbar, danke nochmal an dieser Stelle für Eure absolut tolle Hilfe.)

Diese sollen auf dem „Set Bildschirm“ siehe Foto Anhang gestellt werden.
Hier ist erstmal nur ein Aktuator zu sehen.

Die blaue Anzeige ist die IST Stellung und Verfahr Geschwindigkeit in Porzent (0-100%)

Die rote Anzeige ist die „Set“ Anzeige. Auf die ist ein „Touch“ Button gelegt.

Was soll nun passieren:

Ich tippe auf das rote Feld, das ich ändern will. -> Tastatur, wie auf dem Bild erscheint.--> Ich gebe eine Wert zwischen 0-100% ein, drücke SET. Wird wird im roten Feld angezeigt.

Ich drücke auf das nächste Feld -> mach das selbe, usw usw.....

Wenn ich fertig bin drücke ich den unteren Button und die Werte werden gesetzt.

Das lesen der Touch eingaben und auch der Tastatur klappen einwandfrei.

Was ich nun nicht weiß, wie man so eine Schleife aufbaut und wie man die Werte dem Feld zu weißt, das ich eben angeklickt habe, da die Tastaturwerte ja nur als Zahl „ankommen“

Ich habe versucht, eine Schleife wie folgt aufzubauen, aber wie zu erwarten war, klappt das nicht...

// Touchpad Intput
void handleGenieEvent (void) 
{
  genieFrame event;
  genieDequeueEvent(&event);
  int keyboardValue;
  
  // auswahl speed anzeige knots / km/h  / m/s
  if (event.reportObject.object == GENIE_OBJ_USERBUTTON) 
  {
    if (event.reportObject.index == 0)                 // Button 0 Change Gauge 
    
    {
     gauge++;
     if ( gauge == 3)gauge = 0;
     //Serial.print(gauge);
    }
  }
  // auswahl ende
  
  
  if (event.reportObject.object == GENIE_OBJ_USERBUTTON) 
  {
   if (event.reportObject.index == 2)  
  
     {
       if(event.reportObject.object == GENIE_OBJ_KEYBOARD) // If this event is from a Keyboard
        {
         if (event.reportObject.index == 0)        // If from Keyboard0
          {
           keyboardValue = genieGetEventData(&event); // Get data from Keyboard0
           touchKey (keyboardValue); // pass data to the calculatorKey function for processing
          }
        }
     }
  }

Und

void touchKey (int key)
{
  static int gotDecimal = FALSE ;
  static int startNewNumber = TRUE ;
  static double multiplier = 1.0 ;
  float digit ;

// Eeeeee...



  if (isdigit (key))
  {
    if (startNewNumber)
    {
      startNewNumber = FALSE ;
      multiplier = 1.0 ;
      display = 0.0 ;
    }

    digit = (double)(key - '0') ;
    if (multiplier == 1.0)
      display = display * 10 + (double)digit ;
    else
    {
      display = display + (multiplier * digit) ;
      multiplier /= 10.0 ;
    }
    genieWriteObject(GENIE_OBJ_LED_DIGITS, 15, display);
    Serial.println(display);
    return ;
  }
  
  
}

Den Code hab ich mir aus dem Beispiel eines Taschenrechners mit Arduino und genie zusammen geklaubt

Mir geht jetzt weniger um einem kompletten Code, sondern generell, wie man sowas aufbaut.

Vielen lieben Dank schon mal.

Edit: Leider kann man hier grad keine Bilder posten... Gibt ein Fehlermeldung. Ich lade es wo anderst hoch und verlinke es...

http://4d.websitetoolbox.com/file?id=1762956

Hier das Bild

Hallo TEC_MICHL,
helfen kann ich Dir leider nicht, aber dumme Fragen stellen:
Das von Dir gezeigte Display ist etwas für meines Vater Sohn...

Hast Du die genaue Bezeichnung für das Display, und/oder auch einen direkten Link dazu?
Das betreibst Du am Arduino ohne Probleme?
Gruß und Dank
Andreas

Guten morgen Andreas,

das Display ist von 4D Systems siehe hier:

http://www.4dsystems.com.au/group/3/Arduino_Display_Modules_and_Shields/

In meinem Fall das uLCD-43PT-AR. Evtl. würde ich hier aber auch ein Auge auf Capacitive Touch werfen. Hab ich noch keine Erfahrungen. Aber der Resistive Touch ist trotz Kalibrierung ziemlich ungenau. Soll heißen, man muss die Buttons recht groß und weit auseinander machen, sonst hat er Probleme mit der Erkennung.

Ist ein tolles Dislpay, was man aber leider auch am Preis merkt. Die Programiermöglichkeiten sind mit Hilfe der Sofware Workshop4 relativ einfach und super dokumentiert. Wenn Du die "Vise Genie" Variante wählst, dann brauchst du kaum Programmierkentnisse für das Display und kannst tolle Grafik-Oberflächen bauen. Die Dokumentation ist sehr gut:
http://www.4dsystems.com.au/appnotes/

Leider sieht es auf der Arduinoseite anders aus und ist die Doku eher bescheiden:
Ich empfehle Dir die Bsp:

https://github.com/4dsystems/ViSi-Genie-Arduino-Library/blob/master/genieArduino/Examples/genieArduino_Demo/genieArduino_Demo.ino

Was mich hier erstmal etwas durcheinander gebracht hat, war die Variable "event" und "replay", das ist das Selbe, und muss dann auch im gesammten Arduino Code gleich sein.

Meine Problem konnte ich nun lösen, nachdem ich mir die Nacht um die Ohren gehaut habe...

Fals jemand das auch mal machen muss, hier der Weg und das Programm stoppt nicht, bei der Eingabe.

Im ersten Schritt erfolgt eine Zuweisung. Also wenn man eine Anzeige, die geändert werden soll, berührt, wird die Tastatur dem Wert zugewiesen, man unterscheide hier zwischen dem Touch Button, der einfach über einem AusgabeFeld liegt und dem Ausgabe Feld selbst.
Hier am Bsp von 3 Anzeigen:

 if (event.reportObject.object == GENIE_OBJ_USERBUTTON)  // Touch gedrückt
  {
   if (event.reportObject.index == 1)  // Welcher Touchbutton wurde gedrück?
    {disp_canal = 21;}                            // Button 1 gehört zu Feld 21
      
   if (event.reportObject.index == 2) 
    {disp_canal = 16;}
    
   if (event.reportObject.index == 3)
    {disp_canal = 17;}   

// Hier wird nun das Keyboard initalisiert und an die, ich sag mal "Zahlen zusammenbau Routine" übergeben

     {
       if(event.reportObject.object == GENIE_OBJ_KEYBOARD) // If this event is from a Keyboard
        {
         if (event.reportObject.index == 0)        // If from Keyboard0
          {
           keyboardValue = genieGetEventData(&event); // Get data from Keyboard0
           touchKey (keyboardValue); // pass data to the calculatorKey function for processing
          }
        }
     }

Im weiteren wird dann die Keyboardeingabe zusammengebaut und in den angewählten Canal geschrieben.
Der Vorteil ist, so finde ich, dass das Programm so nicht stoppt, wenn man keine Eingabe macht. Es läuft nur hier durch, wenn eine weitere Zahl eingetippt wird und hängt sie an die Vorangegangene. Also, wenn die erste z.B. 1 ist dann bleibt die 1 in der Var "Display", und der restliche Code läuft weiter. Wenn ich nun als nächste eine 5 eingebe wird die 1 mit 10 multipliziert und + 5 genommen. -> 15 usw usw....
Die Zusatztasten beenden die Eingabe, bzw. löschen sie.
Jetzt sind alle Variablen die man geändert hat im v_soll_hold Array. Drückt man nun dem HauptSet Button, werden die Werte in die Steuervariablen geschireben..

void touchKey (int key)
{
  static int gotDecimal = FALSE ;
  static int startNewNumber = TRUE ;
  static double multiplier = 1.0 ;
  int digit ;

  if (isdigit (key))
  {

    if (startNewNumber)
    
    {
      startNewNumber = FALSE ;
      multiplier = 1.0 ;
      display = 0 ;
    }

    digit = (double)(key - '0') ;
    if (multiplier == 1.0)
      display = display * 10 + (double)digit ;
    else
    {
      display = display + (multiplier * digit) ;
      multiplier /= 10.0 ;
    }
  
    genieWriteObject(GENIE_OBJ_LED_DIGITS, disp_canal, display);  //Hier erfolgt un das schreiben in das vorher zugewiesene Anzeige Feld
    v_soll_hold[disp_canal] = display  // Hier wird der Wer in das Array geschireben.
    return;
  }
  
  
    switch (key)
  {

      case 'c':                        // Clear entry or operator
      if (lastOperator != 0)
        lastOperator = 0 ;
      else
      {
        display = 0 ;
        gotDecimal = FALSE ;
        startNewNumber = TRUE ;
      }
      break ;
      
      case 's':                        // Set und canal verlassen
      
      disp_canal = 100;
      display=0;
      break ;
         
      
      
  }
  
}

Gruß Michael

Hallo TEC_MICHL,
Das ist doch einmal eine Antwort. Ne´richtige Hausnummer.
Andreas sagt Danke schön.

gerne! :slight_smile: