Go Down

Topic: Arduino und Nextion als Sensorsteuerung: Keine Werte-Anzeige im Textfeld... (Read 4441 times) previous topic - next topic

Badger1875

´n Abend Gemeinde,

ich hab mir ein kleines Script zusammengefrickelt, mit dem ein Sensorwagen durch einen Schrittmotor an eine bestimmte Stelle gefahren werden kann, die eingegebene und angefahrenen Position wird auf einem kleinen Nokia-Display (5110) angezeigt. Das Display macht was es soll, nur ist es eben sehr klein.

Hier wird im Nokis-Script ein aus mehreren Tatstendrücken erzeugter Wert berechnet
Code: [Select]
else {  // Prüfen ob vierte Ziffer eingegeben wurde
      vierteziffer=x;
      String displayvalue = (String(ersteziffer) + String(zweiteziffer) + String(dritteziffer) + String(vierteziffer));
      drawnokiascreen(displayvalue);

      }


und hier dann angezeigt:
Code: [Select]
void drawnokiascreen(String y) {
 
    u8g.firstPage();
    do {
      u8g.drawHLine(0, 15, 84);
      u8g.drawVLine(45, 16, 38);
      u8g.drawHLine(0, 32, 84);
      u8g.setFont(u8g_font_profont10);
      u8g.drawStr(5, 10, "Eingabe Distanz");
      u8g.setPrintPos(10,27);
      u8g.print(y); //Zeigt eingegebene Distanz an     
      u8g.drawStr(48, 27, "1/10 mm");
      u8g.drawStr(0, 44, "Baer-Pos.");
      u8g.setPrintPos(54,44);
      u8g.print(baer); // Zeigt die aktuelle Position des Bärs an
    }
      while( u8g.nextPage() );
 
}


Soweit so gut...

Badger1875

Nun hab ichs versucht, das Ganze aufs Nextion umzufrickeln und bin dann hier gelandet:
Code: [Select]
else {  // Prüfen ob vierte Ziffer eingegeben wurde
      vierteziffer=x;
      String displayvalue = (String(ersteziffer) + String(zweiteziffer) + String(dritteziffer) + String(vierteziffer));
      drawnextionscreen(displayvalue);

      }


Um das obige anzuzeigen, hab ich dann wie folgt die Textfelder angesprochen:
Code: [Select]

 void drawnextionscreen(String y) {
 
    t0.setText(y);
    t1.setText(baer);
       
    u8g.firstPage();
    do {
      u8g.drawHLine(0, 15, 84);
      u8g.drawVLine(45, 16, 38);
      u8g.drawHLine(0, 32, 84);
      u8g.setFont(u8g_font_profont10);
      u8g.drawStr(5, 10, "Eingabe Distanz");
      u8g.setPrintPos(10,27);
      u8g.print(y); //Zeigt eingegebene Distanz an     
      u8g.drawStr(48, 27, "1/10 mm");
      u8g.drawStr(0, 44, "Baer-Pos.");
      u8g.setPrintPos(54,44);
      u8g.print(baer); // Zeigt die aktuelle Position des Bärs an
    }
      while( u8g.nextPage() );
 
}

um dann die folgende Fehlermeldung zu erhalten:
Code: [Select]
C:\Program Files (x86)\Arduino\libraries\Nextion/NexText.h:53:10: note:   no known conversion for argument 1 from 'String' to 'const char*'

E:\Arbeitsordner\Freddie\Arduino\Sensorsteuerung\Sensor_1_Nextion_roh\Sensor_1_Nextion_1\Sensor_1_Nextion_1.ino: In function 'void drawnextionscreen(String)':

Sensor_1_Nextion_1:317: error: no matching function for call to 'NexText::setText(String&)'

     t0.setText(y);

                 ^

E:\Arbeitsordner\Freddie\Arduino\Sensorsteuerung\Sensor_1_Nextion_roh\Sensor_1_Nextion_1\Sensor_1_Nextion_1.ino:317:17: note: candidate is:

In file included from C:\Program Files (x86)\Arduino\libraries\Nextion/Nextion.h:33:0,

                 from E:\Arbeitsordner\Freddie\Arduino\Sensorsteuerung\Sensor_1_Nextion_roh\Sensor_1_Nextion_1\Sensor_1_Nextion_1.ino:10:

C:\Program Files (x86)\Arduino\libraries\Nextion/NexText.h:53:10: note: bool NexText::setText(const char*)

     bool setText(const char *buffer);   

          ^

C:\Program Files (x86)\Arduino\libraries\Nextion/NexText.h:53:10: note:   no known conversion for argument 1 from 'String' to 'const char*'

Sensor_1_Nextion_1:318: error: no matching function for call to 'NexText::setText(String&)'

     t1.setText(baer);


Ich weiß nun nicht mehr weiter, hab schon einiges gelesen, aber ich versteh gerade nur noch Bahnhof!


Vielen Dank schon mal im Voraus!!!


Freddie

Hartig_jue

du brauchst itoa um die Zahlen in char um zuwandelt die Lib kann mit Zahlen in einem Textfeld nichts anfangen

Badger1875

ITOA???

helf mir mal bitte auf die Beine...

Ich sitz seit heute morgen an dem Krimskrams und so wie mir gearde der Schädel brummt, brauch ich da jetzt mal ´ne richtig gute Portion Startpilot...

Freddie

SkobyMobil

Hallo,
"brauch ich da jetzt mal ´ne richtig gute Portion Startpilot..."

Sollst Du haben. Das, was Du da vor hast- ist ideal für das Nextion.
Als erstes kloppst Du einmal die verdammte NextionLib in die Tonne.
Dann liest Du Dir die Dokumentation zum Nextion durch.

Dort erstellst Du Dir ein NrFeld für die Position, oder ein TextFeld wenn Du es mit Komma (122,49) haben
willst.
Dann bastels Du Dir einen Slider auf dem Nextion. Links Position 0, rechts Positon 100.- was weiß ich.
Dafür braucht es auf dem Nextion "nichts" und auf dem Arduino nicht viel.
Das Nextion übergibt einfach die Position an den Arduino- und der steuert den Motor.
Gruß und Spaß
Andreas
P.S.
wenn Du unbedingt etwas zeichnen willst, dann mache das mit dem Nextion- ist sau schnell.
Zeichnen geht auch mit Variable und Schleife.
Gruß und Spaß
Andreas
P.S. "ITOA???" Integer (Zahl) zu Ascii (Text)
die zweite Maus bekommt den Speck...

Badger1875

Hoi Andreas,

Danke für Deine Antwort!

Ich hab schon beim Lesen einiger Freds und Posts von Dir mitbekommen, dass Du nicht gerade der Freund von den ganzen Libs bist.
Gut, ich würds ja mal probieren, nur mein Problem wird sein, dass ich die Zahlen mit einer Tastaur generieren muss, da Einsatzumgebung von dem Display nichts für einen Touchscreen ist. Zudem sind die Werte zwischen 0 und 2500 mit einem Slider auf dem Display wohl nur schwer einzustellen und es kommt hier wirklich auf die letzte Stelle an....

Es kann doch wohl nicht sein, dass ich diese Minimalanforderung mit dem Ding nicht gebacken kriege....


Freddie

Tommy56

Warum willst Du ein Touchscreendisplay einsetzen, wenn die Umgebung für Touchscreen nicht geeignet ist?

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

SkobyMobil

Hallo,
"dass ich die Zahlen mit einer Tastaur generieren muss"
Auch das ist keine Problem, Nextion liefert ne menge Keyboard´s mit.
Aber mach man.
Hier noch etwas, das helfen könnte
ITOA

Das könnte auch funktionieren:

 
Code: [Select]

char WertFürNextion[15];
  dtostrf(MeinWert, 0, 1, WertFürNextion);


Gruß und Spaß
Andreas
die zweite Maus bekommt den Speck...

Badger1875

Moinsen Tommy,

Warum willst Du ein Touchscreendisplay einsetzen, wenn die Umgebung für Touchscreen nicht geeignet ist?

Gruß Tommy
warum ein Touchscreen?

Das ist ganz einfach...
...ich hätte gerne ein Display mit 3.5" und möchte keins in herkömmlicher Technik, mit der seriellen Schnittstelle ist das Nextion eben die Wahl gewesen.
Außerdem ist der Preis von einem 08/15-Display mit shield teurer als der von einem Nextion bei gleicher Größe. Über die Verdrahtung brauchen wir hier auch nicht reden und beim Nextion belaste ich auch den Arduino nicht mit zusätzlichen Rechenaufgaben zur Darstellung des Bildschirminhaltes.

Wenn ich allerdings die o.a. Probleme nicht gebacken bekomme (ohne das ich jetzt noch 'C' komplett lernen muss) werd ich wohl in den sauren Apfel beissen müssen und doch ein 08/15 Display verwenden!

Grüße

Freddie

Badger1875

..."dass ich die Zahlen mit einer Tastaur generieren muss"
Auch das ist keine Problem, Nextion liefert ne menge Keyboard´s mit...
Jupp, aber eben immer auf dem Touchscreen. Ich hab einiges an Staub und Dreck in der Luft, damit dürfte ich mir in kurzer Zeit das Display ruinieren und zusätzlich ist es imho für diese Zwecke einfach zu klein.
Hier noch etwas, das helfen könnte
ITOA

Das könnte auch funktionieren:

 
Code: [Select]

char WertFürNextion[15];
  dtostrf(MeinWert, 0, 1, WertFürNextion);

...
Das werdi ich mal heute ausprobieren, mal sehen ob ich damit zuerechtkomme!

Danke für eure Hilfen und Ratschläge, so fühl ich mich wenigstens nicht alleine!!!

Grüße

Freddie

Serenifly

Wenn ich allerdings die o.a. Probleme nicht gebacken bekomme (ohne das ich jetzt noch 'C' komplett lernen muss) werd ich wohl in den sauren Apfel beissen müssen und doch ein 08/15 Display verwenden!
Auch ohne Touchscreens und TFT sind Displays und Menüs nichts was man mal schnell einfach so programmiert ohne zu wissen was man tut. Auch auf einem einfachen 20x4 LCD musst du z.B. Werte auf eine konstante Breite formatieren damit nicht Text stehen bleibt.

Ein paar grundlegende Kenntnisse über Datentypen und wie diese konvertiert werden schaden nie.

Badger1875

...nichts was man mal schnell einfach so programmiert ohne zu wissen was man tut...

...in paar grundlegende Kenntnisse über Datentypen und wie diese konvertiert werden schaden nie...
Hallo Serenifly,
da brauchen wir uns auch nicht drüber unterhalten und ich geb Dir uneingeschränkt Recht!
Momentan muss ich dass sch...Display einfach nur zum Laufen kriegen. Wie gesagt es fehlt nur die Wandlung der errechneten Daten vom Arduino auf die erwarteten Daten vom Display, alles andere funktioniert.

Grüße

Freddie

Badger1875

Hallo Leutz,

ich hab jetzt mal mit ITOA gespielt aber auch keinen Erfolg erzielt...
...im Script hab ich ganz am Anfang mal die "char" Variablen definiert:
Code: [Select]

char buffer_y [6] = {0};             // [6] ist die Länge des Wertes der hier eingetragen wird
char buffer_displayvalue [6] = {0};  // [6] ist die Länge des Wertes der hier eingetragen wird
char buffer_baer [6] = {0};          // [6] ist die Länge des Wertes der hier eingetragen wird

dann im Script unter 'void loop'
für die Schrittmotorsteuerung und die Anzeige des Wertes folgendes eingetragen:
Code: [Select]
void movestepper(long z) {  //  Startet Schrittmotor
 
long calculatedmove=((z*1600)/40);  //  Berechnet die Schrittzahl anhand der neuen Eingabe
stepper.runToNewPosition(calculatedmove);
baer = String(z);


  memset(buffer_baer 0, sizeof(buffer_baer));
  itoa(baer, buffer_baer, 10);
  t1.setText(buffer_baer);

  nexLoop (nex_listen_list);

auch die anderen Screens vom Nokia hab ich so geschrieben, jetzt sind die einen Fehlermeldungen weg, dafür hab ich jetzt andere:

Code: [Select]
E:\Arbeitsordner\Freddie\Arduino\Sensorsteuerung\Sensor_1_Nextion_roh\Sensor_1_Nextion_1_test\Sensor_1_Nextion_1_test.ino: In function 'void movestepper(long int)':

Sensor_1_Nextion_1_test:300: error: expected ')' before numeric constant

   memset(buffer_baer 0, sizeof(buffer_baer));

                      ^

Sensor_1_Nextion_1_test:300: error: too few arguments to function 'void* memset(void*, int, size_t)'

   memset(buffer_baer 0, sizeof(buffer_baer));

                                            ^

In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:25:0,

                 from sketch\Sensor_1_Nextion_1_test.ino.cpp:1:

c:\program files (x86)\arduino\hardware\tools\avr\avr\include\string.h:235:14: note: declared here

 extern void *memset(void *, int, size_t);

              ^

Sensor_1_Nextion_1_test:301: error: cannot convert 'String' to 'int' for argument '1' to 'char* itoa(int, char*, int)'

   itoa(baer, buffer_baer, 10);

                             ^

E:\Arbeitsordner\Freddie\Arduino\Sensorsteuerung\Sensor_1_Nextion_roh\Sensor_1_Nextion_1_test\Sensor_1_Nextion_1_test.ino: In function 'void drawnextionscreen(String)':

Sensor_1_Nextion_1_test:334: error: cannot convert 'String' to 'int' for argument '1' to 'char* itoa(int, char*, int)'

   itoa(y, buffer_y, 10);

                       ^

Sensor_1_Nextion_1_test:337: error: expected ')' before numeric constant

   memset(buffer_baer 0, sizeof(buffer_baer));

                      ^

Sensor_1_Nextion_1_test:337: error: too few arguments to function 'void* memset(void*, int, size_t)'

   memset(buffer_baer 0, sizeof(buffer_baer));

                                            ^

In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:25:0,

                 from sketch\Sensor_1_Nextion_1_test.ino.cpp:1:

c:\program files (x86)\arduino\hardware\tools\avr\avr\include\string.h:235:14: note: declared here

 extern void *memset(void *, int, size_t);

              ^

Sensor_1_Nextion_1_test:338: error: cannot convert 'String' to 'int' for argument '1' to 'char* itoa(int, char*, int)'

   itoa(y, buffer_baer, 10);

                          ^

exit status 1
expected ')' before numeric constant

irgendwie werde ich meinen Frust nicht mehr los, kann mir hier wiklich keiner helfen?

Grüße

Freddie

Serenifly

Da fehlt ein Komma nach dem ersten Parameter. Aber lass das memset() weg. Das ist vollkommen überflüssig. Die Strings werden automatisch Null-terminiert. Steht in der Doku drin:
Quote
Converts an integer value to a null-terminated string using the specified base and stores the result in the array given by str parameter.
Du tippst aber generell nur willkürlich Code ein und hoffst das es geht. Wieso wandelst du die Zahl in ein String Objekt und übergibst dieses an itoa()? itoa() erwartet offensichtlich einen Integer als Parameter. Mit Arduino String Objekten kann die Funktion nicht das geringste anfangen. Schau dir an wie sie deklariert ist:
Code: [Select]

char*  itoa (int value, char* str, int base);


Also so:
Code: [Select]

itoa(z, buffer_baer, 10);

Fertig. Oder ltoa() statt itoa() wenn du wirklich den gesamten Werte-Bereich von long brauchst. itoa() ist eigentlich für int. Aber das ist wohl was du willst, wenn dein Puffer nur 6 Byte hat. Also 5 Stellen

SkobyMobil

Hallo,
steht doch schon alles geschrieben… hast Du es nicht beachtet?

"ich hab mir ein kleines Script zusammengefrickelt, mit dem ein Sensorwagen durch einen Schrittmotor an eine bestimmte Stelle gefahren werden kann, die eingegebene und angefahrenen Position wird auf einem kleinen Nokia-Display"

Wenn DU- diesen Sketch "zusammengefrickelt hast, dann weißt auch nur DU- was
er macht. Dem ist aber wohl nicht so.

Also klobbe mal die NextionLib in die Tonne und Deinen Sketch hinterher.
Da Du das ganze am Nextion betreiben willst, brauchst Du auch kein Nokia-
Display- auch in die Tonne.

Du machst doch nichts weiter, als mit dem Arduino einen Schrittmotor zu
steuern.
Besorge Dir also einen Sketch, der GENAU- mit dem Schrittmotor-das macht,
was Du möchtest.

Alle Eingaben/Ausgaben gibst Du über die serielle Schnittstelle aus!

Wenn das fehlerfrei läuft, dann hast Du die beste Grundlage für das Nextion.
Gruß und Spaß
Andreas
P.S.
Ja ich weiß, scheiß Vorschlag, bringt mich nicht weiter- blah, blah, blah.
Manchmal ist es aber besser einfach, einfach- von vorne zu beginnen.
die zweite Maus bekommt den Speck...

Go Up