Arduino und Nextion als Sensorsteuerung: Keine Werte-Anzeige im Textfeld...

´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

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:

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

Nun hab ichs versucht, das Ganze aufs Nextion umzufrickeln und bin dann hier gelandet:

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:

 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:

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

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

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

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)

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

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

Gruß Tommy

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:

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

Gruß und Spaß
Andreas

Moinsen Tommy,

Tommy56:
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

SkobyMobil:
…“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.

SkobyMobil:
Hier noch etwas, das helfen könnte
ITOA

Das könnte auch funktionieren:

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

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

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

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:

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:

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:

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

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:

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:

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

Also so:

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

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.

Hoi Andreas,

eigentlich wollte ich mir das "neu schreiben" sparen. Ich hab grad mir anderen Sachen den Kopf noch so voll, dass ich gerne was funktionierendes als Grundlage genommen hätte.
Ich hatte eigentlich gedacht, dass die Anzeige eines bestehenden Wertes auf einem anderen Display kein so großes Hexenwerk sein kann.

Schade, dann werd ich wohl doch in den sauren Apfel beissen...

Das wirft mich allerdings wieder um eine lange Zeit zurück :frowning:

Danke trotzdem!

Grüße

Freddie

Du musst es nur richtig machen

char buffer_baer[6];

int z = 12345;

itoa(z, buffer_baer, 10);

Das ist alles. itoa() will den Wert als Integer Variable, einen Puffer der groß genug für den String + 1 ist und das Zahlensystem.

SkobyMobil:
…steht doch schon alles geschrieben… hast Du es nicht beachtet?..

Zumindestens versuche ich es…

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

Eigentlich weiß ich es schon, mit dem Nokia macht das Teil genau das was ich will, ich möcht nur das kleine Nokia gegen ein größeres Display tauschen.

SkobyMobil:
…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.

In der Zwischenzeit hab ich angefangen, das Rad neu zu erfinden, mal sehn wie lange es dauert, bis es wieder rund läuft.

Nur um nochmal das eigentliche Problem darzustellen:
mein Script funktioniert in allen Bereichen so wie es soll, die Tastatureingaben werden übernommen und richtig angezeigt,die zwei daraus errechneten Zahlenwerte werden auf dem Nokia genau da wo sie sein sollen angezeigt. Auch der Schrittmotor macht genau das was er soll.
Nun möchte ich die Werte anstatt auf dem Nokia, auf dem Nextion an ähnlicher Stelle anzeigen. Leider habe ich fast keine Ahnung vom Nextion, habe aber meine Seiten so hinbekommen wie ich sie wollte und auch die für die Anzeige notwendigen Textfelder auf der Seite definiert.
Das es aber so schwer ist, sich nur zwei Werte anzeigen zu lassen zeigt mir, dass man sich nicht zu viel erhoffen darf…
Ich werde weiterwerkeln…

Trotzdem vielen Dank für eure Hilfe!

Grüße

Freddie

Die beiden Displays haben ein völlig anderes Konzept. Das Nokia wird vom Arduino direkt angesprochen. Das Nextion hat einen eigenen Prozessor. Dort muss einerseits das Display selbst programmiert werden, anderseits die Datenübertragung zum Display.

Das kann man nicht miteinander vergleichen.

Das Nextion kann viel mehr, als das Nokia. Es erfordert aber auch mehr Einarbeitungsaufwand. Das zu akzeptieren, scheint Dein Problem zu sein.

Gruß Tommy

Hallo,
na gut. Gehen wir einmal davon aus “auf dem Nokia genau da wo sie sein sollen angezeigt”

Mach von Deinem Sketch mal eine Si-Kopie.
Nun nimmst Du das Original und löscht alles raus, was mit dem Nokia zu tun.
Zeilen und Libs fürs Nokia.
Mit Serial.println(meinWert) bringst Du alles im original Format auf den seriellen Monitor.
Wenn der serielle Monitor alles genau so richtig anzeigt wie das Nokia voher, dann meldest Du Dich noch
einmal.
Gruß und Spaß
Andreas