Nextion - Tip´s & Trick´s

Hallo,
lesen hilft...
Befehls-Referenz
Gruß und Spaß
Andreas

Hallo,
die MS-Font´s sind für das Nextion fast nicht zu gebrauchen. Wenn man dort
eine kleine feine Schrift nutzen möchte, dann kommt es zu Problemen.
Hier gibt es einen Beitrag dazu, das Tool habe ich angehängt. Damit kann man
seine Font´s so gestalten, wie man es sich wünscht.
Gruß und Spaß
Andreas

Generatorv3.zip (330 KB)

Ich nutze für meine ganzen HMIs (SiemensWinCC und Kinco) incl Nextion (noch nicht viel gemacht damit) die Tahoma Schrift die ist auch "klein" ziemlich gut zu lesen und lässt sich mit den ganzen HMI Programmen gut verarbeiten.

Grurß
DerDani

Hallo,
beim Nextion ist es eigentlich so, das nur die Seite Daten seriell empfangen
kann, die aufgerufen ist…

Ich möchte ich z.B. auf "Seite 3" Datem empfangen, muß die "Seite 3"
aufgerufen sein.
Befinde ich mich aber auf "Seite 1"- und möchte für "Seite 3" Daten empfangen
dann funktioniert das nicht.

Es ist aber möglich…

Man legt auf "Seite 3" eine globale Variable an, z.B.

"MeineSeite3Variable" mit dem Wert: val=0

Wenn man nun auf "Seite 3" ist, dann kann diese Variable mit Daten gefüllt
werden.
Befinde ich mich aber auf "Seite 1" ist das nicht möglich.
Möchte man nun auf "Seite 1" Daten für "Seite 3" empfangen, dann fügt man
auf "Seite 1", nach deren Aufbau folgende Zeile ein:

Seite 3.MeineSeite3Variable.val=0

Der Arduino sendet nun Daten an "Seite 3.MeineSeite3Variable.val=X"

Wenn man nun "Seite 3" aufruft, dann sind die Daten bereit.
Geht man zurück zur "Seite 1" dann verliert die "MeineSeite3Variable" ihre
Daten wieder.

Ändert man nun auf "Seite 1" die Zeile:

Seite 3.MeineSeite3Variable.val=0

in

Seite 3.MeineSeite3Variable.val = Seite 3.MeineSeite3Variable.val

dann bleiben die Daten erhalten.

Man kann nun die Daten für "Seite 3", auf "Seite 1 & Seite 3" empfangen.

Die Daten gehen nicht verloren, und können auch an andere Seiten übergeben
werden.

Gruß und Spaß
Andreas

Hallo,
mit der SystemVariable "dim" läßt sich die Helligkeit des Display regeln.
Normal liegt die bei "100", also volle Pulle.

Mit z.B. "dim=50" läßt sich diese reduzieren. Der Wert läßt sich auch
über 2 Bottum´s hoch- und runterzählen.
Ein geringerer "dim=Wert" sollte auch die Lebensdauer des Display erhöhen.

Mit "dims=dim" oder "dims=35" läßt sich der Helligkeitswert dauerhaft setzen.
Nach einem Reset oder ausschalten des Display setzt die Variable "dims"
die Helligkeit auf den vorher gesetzten Wert.

Beide Variablen (dim, dims) lassen sich auch mit dem Arduino setzen.

Gruß und Spaß
Andreas

Hallo,
man (Frau) sieht immer wieder, das Befehle vom Arduino zum Nextion so
getippt werden:

Serial.print("Wert.val=");
Serial.print(Wert);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);

es geht aber auch so...

byte NextionTerminator[3] = {255,255,255}; // global deklarieren

Serial.print("Wert.val=");
Serial.print(Wert);
Serial.write(NextionTerminator,3);

Gruß und Spaß
Andreas

Wie sieht es den mit dem Empfang von Nummern aus?

Bezüglich des Sliders z.b.

Bei Touch Release event hab ich Send component ID

Und im Code auf dem Arduino folgendes:

void motorPWMnexPopCallback(void *ptr)
{
  uint32_t number = 0;
  motorPWMnex.getValue(&number);
  pwm = number;
}

Wenn ich mir jetzt aber PWM ausgeben lasse, kommt nur 0 bei raus.

Ich hab auch schon atoi ausprobiert, funktioniert aber nicht...

Wie lasse ich mir den String den am besten in einen int umwandeln?

Hallo,
das funktioniert:

const int SERIAL_BUFFER_SIZE = 9;
char serialBuffer[SERIAL_BUFFER_SIZE];
int zlA = 0;

void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
  }

void loop()

{
  if (zlA == 0) //Kommando 1mal senden
 {   
  Serial1.println("T"); 
    zlA = 1;
  }

  if (readSerial(Serial1) == true)

 if (zlA == 1)
 {
   delay(5000); // wenn verarbeitung fertig, warte
   zlA = 0;
}
}

bool readSerial(Stream& stream)
{
  static byte index;

  while (stream.available())
  {
    char c = stream.read();

    if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
    {
      serialBuffer[index++] = c;
    }
    else if ((c == '\n' || c == '\r') && index > 0)
    {
      serialBuffer[index] = '\0';
      index = 0;
  // ***********************************************************Ausgabe serieller Monitor**************   
      Serial.print("Ausgabe :");
           Serial.print(serialBuffer);
           
           Serial.print("  Integer:");
          int Wert = atoi(serialBuffer + 5); //serialBuffer auf richtige länge bringen
        Serial.print(Wert);
       
        float Zahl=Wert;// int in float
        Zahl /=10;
        Serial.print("  Float:");
      Serial.println(Zahl,1);
      return true;
    }
  }
  return false;
}

// Ausgabe : T 01233  Integer:233  Float:23.3

Das Original stammt von Serenifly
Gruß und Spaß
Andreas

Hallo,
mit dem Kommando "click", läßt sich das Anklicken einer Seite oder einer
Komponente simulieren.
Mit dem Arduino sendet man also:

Serial.print("click Übersicht,1");

und!?

das funktioniert so eben nicht.

Der Nextion-Editor läßt in Bezeichnungen, Befehlen und Formeln zwar Umlaute zu-
auch wenn diese im Editor eigegeben werden, aber eben nicht- wenn ihm diese
seriell übertragen werden.

Sendet man nun mit dem Arduino:

Serial.print("click Uebersicht,1");

dann funktioniert das Ganze. Also- Vorsicht mit Umlauten.
Gruß und Spaß
Andreas

Die serielle Schnittstelle des Nextion akzeptiert nur druckbare ASCII-Zeichen, also bis 0x7f. Die Umlaute liegen höher.

Gruß Tommy

Hallo,
das weißt Du, ich jetzt auch- und andere...?
Das Ding ist ohne- Lib wirklich einfach zu füttern, aber (zu) einfache Kleinigkeiten treiben Dich an den Rand des
Wahnsinn.
Gruß und Spaß
Andreas

Nicht falsch verstehen. Ich finde es gut, dass Du die Stolpersteine sammelst.
Ich wollte auch nur zu Deiner Feststellung die Begründung ergänzen.

Gruß Tommy

Hallo,
die Nextion Befehle haben ja alle so ihre Eigenheiten…

Der Befehl "cirs x,y,6,Farbe" zeichnet z.B. einen gefüllten Kreis an die
Position x,y, mit einem Radius von 6px, einer Füllfarbe rot.

Im Nextion sieht das dann so aus:

cirs 200,400,6,RED

möchte man das mit dem Arduino machen, dann funktioniert es so:

Serial2.print("cirs 200,400,6,RED");
Serial2.write(NexT,3);

funktioniert wunderbar, alles gut.

Wenn es nun aber so ist, das man mit dem Arduino x,y errechnet hat, würde
man im ersten Moment das übertragen:

int x = 200;// errechnete Koordinaten
int y = 400;

jetzt wieder die Arduino Anweisung an das Nextion:

Serial2.print("cirs x,y,6,RED");
Serial2.write(NexT,3);

und das funktioniert nicht, weil- x,y wird als "Buchstabe" x und y übertragen.
Nun denkt man sich, das dieser ganze Mist wieder mit einer geheimnisvollen
String-Funktion in ein Format des Nextion gebracht werden muß.

Dem ist aber nicht so, das Nextion ist hier recht clever…
Keine Konvertierung, nur einige Zeilen mehr:

Serial2.print("cirs ");
Serial2.print(x);
Serial2.print(",");
Serial2.print(y);
Serial2.print(",");
Serial2.print("6,RED");
Serial2.write(NexT,3);

das funktioniert. Man muß sich ja wundern.
Gruß und Spaß
Andreas

Da muss man sich nicht wundern, sondern nur verstehen wie die Arduino Software funktioniert :slight_smile: Ob du dass in einem String oder gestückelt sendest ist dem Display vollkommen egal.

Ich benötige einmal eure Hilfe. Ich habe ein Sketch geschrieben um 2 Inkrementalgeber (optisch) auszuwerten (SIKU 200P/U). Das geht einwandfrei im Serial Monitor. Ich habe mir nun ein Nextion zugelegt und versuche krampfhaft die Daten (Meter und Dezimeter) dort anzeigen zu lassen. ICh habe einen Sketch geschrieben um einfach mal etwas rumzuprobieren. Touch und Text klappen. Benutzen tue ich einen MEGA.

Hier mal der Sketch ohne Nextion für den Dual Incrementalgeber und die Nextion Oberfläche :

// HH191 MFD TX RS232 (2 Hz @ 57600)
int encoderPin1 = 2;
int encoderPin2 = 3;

int encoderPin3 = 5;
int encoderPin4 = 4;

int RESETLZ1=6;
int RESETLZ1WERT = 0;

int RESETLZ2=7;
int RESETLZ2WERT = 0;

volatile int lastEncoded = 0;
volatile long encoderValue = 0;

volatile int lastEncodedA = 0;
volatile long encoderValueA = 0;

long lastencoderValue = 0;

long lastencoderValueA = 0;

int lastMSB = 0;
int lastLSB = 0;

int lastMSBA = 0;
int lastLSBA = 0;

void setup() {
// 57600 Bps
Serial.begin (57600);

pinMode(encoderPin1, INPUT);
pinMode(encoderPin2, INPUT);

pinMode(encoderPin3, INPUT);
pinMode(encoderPin4, INPUT);

pinMode(RESETLZ1,INPUT);
pinMode(RESETLZ2,INPUT);

digitalWrite(encoderPin1, HIGH);
digitalWrite(encoderPin2, HIGH);

digitalWrite(RESETLZ1, HIGH);
digitalWrite(RESETLZ2, HIGH);

digitalWrite(encoderPin3, HIGH);
digitalWrite(encoderPin4, HIGH);

attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);

attachInterrupt(2, updateEncoder, CHANGE);
attachInterrupt(3, updateEncoder, CHANGE);

}

void loop(){

RESETLZ1WERT=digitalRead(RESETLZ1);
if (RESETLZ1WERT == LOW) encoderValue = 0; // Wenn Eingang 6 (RESETLZ1 auf "0", dann Zähler rücksetzen)

RESETLZ2WERT=digitalRead(RESETLZ2);
if (RESETLZ2WERT == LOW) encoderValueA = 0; // Wenn Eingang 7 (RESETLZ2 auf "0", dann Zähler rücksetzen)

Serial.print ("LZ1 (KW500) = ");
Serial.print (encoderValue*(1.0/40.0*40.0/40.0), 1.0);Serial.print (" m");

Serial.print (" LZ2 (DPS) = ");
Serial.print (encoderValueA*(0.1/80.0*40.0), 1.0);Serial.print (" m");

delay(125); //500ms (2 Hz)

}

void updateEncoder(){

int MSB = digitalRead(encoderPin1);
int LSB = digitalRead(encoderPin2);

int encoded = (MSB << 1) |LSB;
int sum = (lastEncoded << 2) | encoded;

if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;

lastEncoded = encoded;

int MSBA = digitalRead(encoderPin3);
int LSBA = digitalRead(encoderPin4);

int encodedA = (MSBA << 1) |LSBA;
int sumA = (lastEncodedA << 2) | encodedA;

if(sumA == 0b1101 || sumA == 0b0100 || sumA == 0b0010 || sumA == 0b1011) encoderValueA ++;
if(sumA == 0b1110 || sumA == 0b0111 || sumA == 0b0001 || sumA == 0b1000) encoderValueA --;

lastEncodedA = encodedA;

//speichere fürs nächste mal :slight_smile:

}

Funktioniert so einwandfrei und ist für verschiedene Inkrementalgeber oder Abttasträder geeignet. Aber die Ausgabe auf das Nextion in bezug auf den Serial.print (encoderValue*(1.0/40.0*40.0/40.0), 1.0);Serial.print (" m") ist mir schleierhaft :o :confused: .

Das Ausgeben des "m" ist nicht so wichtig , da es im Hintergrundbild angelegt ist.

Vielen Dank für eure Hilfe

MFDV1_Hintergrund.jpg

@Django3000
Du brauchst jetzt nicht deinen Sketch in jedem dir zur Verfügung stehenden Thread zu posten.
Mach einfach einen neuen Thread auf, in dem du deine Frage richtig formulierst.
Da setzt du deinen Sketch in Code-Tags rein. Schaltfläche </>oben links im Editor. Und ließ die "How to use this forum".

Hallo Serenifly,
da gebe ich Dir recht.
Es ist nur so, das "jeder" massive Probleme mit der seriellen String-
Übertragung hat. Das Forum ist voll davon.
Hier gibt es keine Konvertierung, keine Steuerzeichen- nichts.
Einfach nur "Serial.print". Das sollte wohl jeder hinbekommen?

Das geht sicher noch eleganter, aber wenn jemand das Nextion hat, dann will
er auch schnellen Erfolg sehen und nichts über die Verarbeitung von String´s
wissen. Das hier ist nur ein recht einfacher Weg.
Gruß und Spaß
Andreas

Hallo Django3000,
ich hatte es schon einmal geschrieben, in Deinem Sketch befindet sich nichts, aber auch nichts für das
übertragen an das Nextion. Niemand wird Dir hier Deinen Sketch umschreiben.
Auch dieses "verdammte keine CodeTags (Editor </> )" zu nutzen, ist nicht förderlich.
Antworten auf Deine Fragen findest Du z.B. hier.
Dort gibt es auch einige Links zum Thema Nextion.
Gruß und Spaß
Andreas

SkobyMobil:
Es ist nur so, das "jeder" massive Probleme mit der seriellen String-Übertragung hat. Das Forum ist voll davon.
Hier gibt es keine Konvertierung, keine Steuerzeichen- nichts.Einfach nur "Serial.print". Das sollte wohl jeder hinbekommen?

Ja. Das ist ja auch nichts Nextion-spezifisches. Man sieht das auch oft bei Netzwerk-Anwendungen hier. Da wollen viele Leute erst mal umständlich mit der String Klasse alles in einen String basteln. Statt mehrmals print() zu machen.

Wenn man das mit einer schöneren und übersichtlicheren Syntax will nimmt man die Streaming Library. Dass die Arduino Software immer noch nicht den Streaming Operator << implementiert ist sehr traurig.

Alles Gut. Habs hinbekommen, ohne die Library. Ging ganz einfach mit Print. Vielen Dank für eure Hinweise

---CLOSED---