Nextion Display auf Nano ohne Libs realisieren

Hallo zusammen,

ich teste mein neues 3,2" Nextion Display enhance seit ein paar Tagen (Datenblatt), mit meinem Nano-Clone.

Mir war die Nutzung des Displays gänzlich unbekannt, ich konnte aber mit Hilfe des Tutorials von Böcker das Display einrichten und die Lib von Itead v0.70.0 erfolgreich nutzen.

Nach Anpassung NexConfig_.h (Debug über Serial deaktivieren und die Kommunikation des Nextion auf Serial statt Serial2 anpassen), kann mit der Lib einfach und schnell Daten an das Nextion senden. Nachteil ist leider mit dem Nano, dass der kein Serial2 unterstützt und ich die Lib nicht auf SoftwareSerial umschreiben kann. D.h. wenn das Display angeschlossen ist, kann ich den Nano via USB nicht updaten.

Da die Itead-Libs quasi keinen großen Beliebtheitsgrad haben und mir von der Nutzung abgeraten wurde, habe ich versucht es mittels der mir empfohlenen Tutorials von Böcker und Nextion umzusetzen, leider erfolglos, diese Tuts erklären zwar einiges aber nicht alles und sind für Anfänger nur bedingt eine praktische Hilfe, zumindest am Anfang.

Mit Hilfe der Forensuche bin ich auf den folgenden Beitrag (#26) gestoßen, hiermit konnte ich den Nextion endlich mit Daten versorgen: (Auf SoftwareSerial angepasst)

#include <Arduino.h>                        //Include wird für Platformio benötigt
#include <SoftwareSerial.h>

#define rxPin 10
#define txPin 11

byte NexT[3] = {255,255,255}; //Sendet 0xff, 0xff, 0xff

float SpeedKmh;

SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup()  {
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  mySerial.begin(9600);
}

void loop() {
  SpeedKmh = 21.45; //Wert als float
  dtostrf(SpeedKmh, 5, 2, StrSpeedKmh); //float in String umwandeln

  mySerial.print("p0.t3.txt=\"");
  mySerial.print(StrSpeedKmh);
  mySerial.print("\"");     //Zusammengesetzter String: "p0.t3.txt=\"21.45\""
  mySerial.write(NexT,3);
}

Der Sketch ist zum testen nur für ein Textfeld geschrieben und da im Display aktuell 9 Werte jederzeit aktualisiert werden sollen, wird der Sketch schnell extrem unübersichtlich und die Vorgehensweise gefällt mir da auch nicht.

Ich würde gerne eine Funktion erstellen und der Funktion 3 Parameter (z.b. p0, t3 und 21.45) übergeben und damit den zu sendenden String zu erzeugen. Mehr als einen Wert an die Funktion zu übergeben ist aber scheinbar beim Arduino nicht vorgesehen. Daher brauche ich eure Hilfe.

Das habe ich versucht:

#include <Arduino.h>                        //Include wird für Platformio benötigt
#include <SoftwareSerial.h>

//Display
#define rxPin 10
#define txPin 11
//Send 0xff, 0xff, 0xff
byte NexT[3] = {255,255,255};

char StrSpeedKmh[6];
float SpeedKmh;
void NextionText();

char p0[3] = "p0";      //anzusprechende Seite des Displays
char t3[3] = "t3";      //anzusprechendes Textfeld

// set up a new serial port
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup()  {
  // define pin modes for tx, rx:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
}

void loop() {
  SpeedKmh = 21.45;
  dtostrf(SpeedKmh, 5, 2, StrSpeedKmh);
  NextionText(p0, t3, StrSpeedKmh);
}

void NextionText(char Page, char Obj, char TxtValue) {
  mySerial.print(Page);
  mySerial.print(".");
  mySerial.print(Obj);
  mySerial.print(".txt=\"");
  mySerial.print(TxtValue);
  mySerial.print("\"");               //zusammengesetzter String: "p0.t3.txt=\"21.45\""
  mySerial.write(NexT,3);
}

Erzeugt in Platformio die Fehler:

src\main.cpp: In function 'void loop()':
src\main.cpp:31:34: error: too many arguments to function 'void NextionText()'
NextionText(p0, t3, StrSpeedKmh);
^
src\main.cpp:12:6: note: declared here
void NextionText();
^
*** [.pioenvs\nanoatmega328\src\main.cpp.o] Error 1

In der Arduino IDE:

D:\Dokumente\Arduino\sketch_apr08a\sketch_apr08a.ino: In function 'void loop()':

D:\Dokumente\Arduino\sketch_apr08a\sketch_apr08a.ino:31:34: warning: invalid conversion from 'char*' to 'char' [-fpermissive]

   NextionText(p0, t3, StrSpeedKmh);

                                  ^

D:\Dokumente\Arduino\sketch_apr08a\sketch_apr08a.ino:34:6: note:   initializing argument 1 of 'void NextionText(char, char, char)'

 void NextionText(char Page, char Obj, char TxtValue) {

      ^

D:\Dokumente\Arduino\sketch_apr08a\sketch_apr08a.ino:31:34: warning: invalid conversion from 'char*' to 'char' [-fpermissive]

   NextionText(p0, t3, StrSpeedKmh);

                                  ^

D:\Dokumente\Arduino\sketch_apr08a\sketch_apr08a.ino:34:6: note:   initializing argument 2 of 'void NextionText(char, char, char)'

 void NextionText(char Page, char Obj, char TxtValue) {

      ^

D:\Dokumente\Arduino\sketch_apr08a\sketch_apr08a.ino:31:34: warning: invalid conversion from 'char*' to 'char' [-fpermissive]

   NextionText(p0, t3, StrSpeedKmh);

                                  ^

D:\Dokumente\Arduino\sketch_apr08a\sketch_apr08a.ino:34:6: note:   initializing argument 3 of 'void NextionText(char, char, char)'

 void NextionText(char Page, char Obj, char TxtValue) {

Wie kann ich die Funktion gestalten, dass mehr als ein Wert übergeben werden kann? Und gibt es eine Möglichkeit den Sting für mySerial.print besser zu verketten?

Wahrscheinlich muss ich auf Zeiger oder Referenzen ausweichen, aber da fehlt mir noch das Knowhow und bin wiederrum auf eure Hilfe angewiesen…

Da ich nicht nur Textfelder im Nextion verändern will, sondern auch Slider, ProgressBar und was mir da sonst noch unter die Finger kommt, wird das wohl nicht die einzige Funktion dieser Art bleiben.

Gruß
Jörg

Du solltest 2 Informationsquellen immer zu Rate ziehen:

Die Doku vom Hersteller und die dazu etwas vereinfachte Info von Boecker

Gruß Tommy

Tommy56: Du solltest 2 Informationsquellen immer zu Rate ziehen:

Die Doku vom Hersteller und die dazu etwas vereinfachte Info von Boecker

Gruß Tommy

Sorry Tommy, aber das sind genau die 2 Tutorials mit denen ich nicht weiterkomme, steht auch so im Post. Und die beantworten mir auch nicht meine gestellten Fragen, die stehen übrigens im unteren Teil des Postings. ;)

Hi

Einer Funktion mehr als einen Wert mitzugeben - hat NICHTS mit der Funktion dieser Funktion zu tun - deshalb ist Das auch kein Nextion-typisches Problem.

Was Du mit den zwölf übergebenen Werten in der Funktion machst - jo, ziemlich genau Das, was Du Da rein schreibst.

Also: Was Du wolle? Also 'wirklich wolle'. Nicht, was Du denkst, was Dein Problem irgendwie umgehen könnte.

MfG

Schau dir mal etwas Grundlagen zu C Strings/char Arrays an, dann erkennst du auch das Problem. Oder zu Arrays generell und wie man Arrays an Funktionen übergibt.

char ist nun mal etwas anderes als char[]. Wenn du ein Array übergeben willst, dann musst du einen Zeiger verwenden. Das sagt doch auch die Fehlermeldung:

invalid conversion from 'char*' to 'char'

Also so:

void NextionText(const char* Page, const char* Obj, const char* TxtValue)

Einfach weil Arrays in C keine Objekte sind, sondern äquivalent zu Zeigern auf das erste Element sind.

Keine Ahnung wie du darauf kommst dass man nicht mehrere Variablen übergeben kann, anstatt zu sehen dass du den falschen Datentyp verwendest

Und gibt es eine Möglichkeit den Sting für mySerial.print besser zu verketten?

Mit der Streaming Library ist es angenehmer, aber der Code ist der Gleiche:

http://arduiniana.org/libraries/streaming/

wapjoe: Sorry Tommy, aber das sind genau die 2 Tutorials mit denen ich nicht weiterkomme, steht auch so im Post. Und die beantworten mir auch nicht meine gestellten Fragen, die stehen übrigens im unteren Teil des Postings. ;)

Das [u]Du[/u] damit (noch?) nicht klar kommst, ändert aber nichts an der Tatsache, dass Du es ohne diese Infos nicht realisieren kannst.

Gruß Tommy

Tommy56:
Das Du damit (noch?) nicht klar kommst, ändert aber nichts an der Tatsache, dass Du es ohne diese Infos nicht realisieren kannst.

Gruß Tommy

Natürlich werde ich die Infos später nutzen und es auch müssen, bzw. habe ich dadurch auch schon was gelernt, nur fehlte mir eine gewisse Überleitung und Denkhilfen. Alleine um den RTC oder den eeprom anzusprechen werden ich die Dokus brauchen.

Aber dazu muss ich erst mal den Knoten in meinem Kopf lösen.

Serenifly: Schau dir mal etwas Grundlagen zu C Strings/char Arrays an, dann erkennst du auch das Problem. Oder zu Arrays generell und wie man Arrays an Funktionen übergibt.

char ist nun mal etwas anderes als char[]. Wenn du ein Array übergeben willst, dann musst du einen Zeiger verwenden. Das sagt doch auch die Fehlermeldung: Also so:

void NextionText(const char* Page, const char* Obj, const char* TxtValue)

Einfach weil Arrays in C keine Objekte sind, sondern äquivalent zu Zeigern auf das erste Element sind.

Keine Ahnung wie du darauf kommst dass man nicht mehrere Variablen übergeben kann, anstatt zu sehen dass du den falschen Datentyp verwendest

Mit der Streaming Library ist es angenehmer, aber der Code ist der Gleiche:

http://arduiniana.org/libraries/streaming/

Danke für den Hinweis, ich bin mit der ganzen Materie noch nicht so ganz komform und kann mich auch nur im meiner Freizeit reinlesen, daher geht es nur Schritt für Schritt und mit learning by doing.

Von den falsch gewählten Datentypen abgesehen, hab ich gestern noch festgestellt, dass ich die Datentypen zusätzlich in der Funktionsdeklaration vergessen hatte, oder nicht daran gedacht habe... Läuft zwar noch nicht richtig, aber schon mal einen Schritt weiter! ;)

Die Streaming Library werde ich mir auch mal anschauen, aber ich will das erst mal "zu Fuß" hinkriegen.

Gruß Jörg

postmaster-ino: Hi

Einer Funktion mehr als einen Wert mitzugeben - hat NICHTS mit der Funktion dieser Funktion zu tun - deshalb ist Das auch kein Nextion-typisches Problem.

Was Du mit den zwölf übergebenen Werten in der Funktion machst - jo, ziemlich genau Das, was Du Da rein schreibst.

Also: Was Du wolle? Also 'wirklich wolle'. Nicht, was Du denkst, was Dein Problem irgendwie umgehen könnte.

MfG

Das es ein Nextion-Problem ist, hab ich auch nicht behauptet, ich will/wollte nur wissen was ich falsch gemacht habe und wie es besser geht.

Was ich von der Funktion will? Daten via SoftwareSerial an das Display übertragen und später auch zu empfangen, aber möglichst ohne den Sketch mit hunderten mySerial.print()-Zeilen aufzublähen.

Dass die Funktion nicht mehr als einen Wert akzeptiert, war zu 99,9 % mein Fehler, mit einer Fehlerquote von 0,1 % ::)

Die Funktion mit den richtigen Datentypen, richtiger Deklaration und mit den richtigen Pins auf dem Nano funktioniert übrigens... Hatte gestern noch was anderes getestet und den Nextion auf D0/D1 statt D10/D11 angeschlossen, war gestern zum testen doch etwas zu spät! :roll_eyes: :confused:

wapjoe: Alleine um den RTC oder den eeprom anzusprechen werden ich die Dokus brauchen.

Für die RTC auf dem Enhanced Nextion haben wir hier eine schwere Geburt erfogreich gelöst.

Gruß Tommy

Tommy56: Für die RTC auf dem Enhanced Nextion haben wir hier eine schwere Geburt erfogreich gelöst.

Gruß Tommy

Thx! Wenn ich die Daten sauber an das Display übertragen kriege ist das meine nächste Baustelle. ;) Zum RTC hatte ich mich schon etwas im Nextion Dokument eingelesen, zumindest soweit, dass man Stunden, Minuten und Sekunden mit einzelnen Befehlen auslesen muss. Den Beitrag lese ich mir auf jeden Fall noch durch, kann nie schaden. :)

Gruß Jörg

Die angepassten Funktionen laufen jetzt einwandfrei:

#include <Arduino.h>                        //Include wird für Platformio benötigt
#include <SoftwareSerial.h>

//Display
#define rxPin 10
#define txPin 11
//Send 0xff, 0xff, 0xff
byte NexT[3] = {255,255,255};

char StrSpeedKmh[6];
float SpeedKmh;
byte Battery;

char p0[6] = "page0";      //anzusprechende Seite des Displays
char t3[3] = "t3";      //anzusprechendes Textfeld
char j1[3] = "j1";      //anzusprechende ProgressBar

//Werte für Textfelder an Display senden
void NextionText(const char* Page, const char* Obj, const char* Value);
//Werte für ProgressBar/Slider an Display senden
void NextionVal(const char* Page, const char* Obj, byte Value);

// set up a new serial port
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup()  {
  // define pin modes for tx, rx:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
}

void loop() {
  SpeedKmh = 21.45;
  Battery = 35;
  dtostrf(SpeedKmh, 5, 2, StrSpeedKmh);
  NextionText(p0, t3, StrSpeedKmh);
  delay(1000);
  NextionVal(p0, j1, Battery);
}
//Werte für Textfelder an Display senden
void NextionText(const char* Page, const char* Obj, const char* Value) {
  mySerial.print(Page);
  mySerial.print(".");
  mySerial.print(Obj);
  mySerial.print(".txt=\"");
  mySerial.print(Value);
  mySerial.print("\"");
  mySerial.write(NexT,3);
}

//Werte für ProgressBar/Slider an Display senden
void NextionVal(const char* Page, const char* Obj, byte Value) {
  mySerial.print(Page);
  mySerial.print(".");
  mySerial.print(Obj);
  mySerial.print(".val=");
  mySerial.print(Value);
  mySerial.write(NexT,3);
}

Morgen integriere ich die Funktionen in den Hauptsketch und dann gehts an den RTC.
Danke schon mal für eure Hinweise.