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