Arduino String Nextion Display

Hallo ich würde gern Buttons und Slider über ein Nextion Display abfragen, nach 1 Woche probieren bräuchte ich mal Hilfe.

Über die Serielle Schnittstelle empfängt der Arduino die Strings aber er schaltet meinen Ausgang nicht.

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.
mfg ein Moderator.

Lies Dir bitte mal durch, wie man Quelltexte hier posten sollte. Als Bild ist der ungünstigste Weg.

Welchen Arduino benutzt Du?
Was sagen Deine Ausgaben auf dem Seriellen Monitor, Der übrigens Serial und nicht Serial1 heißt?

Gruß Tommy

Das mag sein, aber wie kontrollierst Du das?
Du prüfst auf Serial1 nicht, ob ein Zeichen vorhanden ist.
Wenn im Pufer kein Zeichen da ist, kommt -1 zurück.
Damit ist Deine Bedingung if(Serial1.... und while(Serial1... immer erfüllt.

Zeige Deinen Code.
Und dann schaun wa ma.

Das wäre mein kleines Setup.
Die Daten was der Button über die Serielle schnittstelle sendet, müsste passten.
Ich möchte einfach mit verschiedene Buttons (Strings Ein/Ausgänge schalten)
Ich benutze eine Mega2560 . Über Serial1 kommen dann am Pin 0,1 die Signale an normales Serial tut nicht.

void setup() {

Serial1.begin(9600);

pinMode(13, OUTPUT);

}

void loop() {

if(Serial1.available()){

char character = "";

String Daten_von_Display="";

delay(30);

while(Serial1.available()){

  character =char(Serial1.read());

  Daten_von_Display += character;

}

Serial1.println(Daten_von_Display);

if(Daten_von_Display.substring(0,4) == "ON")

{digitalWrite(13, HIGH);}

else if (Daten_von_Display.substring(0,4) == "OF")

{digitalWrite(13, LOW);}

}

}

grafik

Serial1 ist RX1(19) und TX1(18) 0/1 ist mit dem USB-verkabelt.

Serial also 0/1 brauchst Du zum debuggen.

String Daten_von_Display = "";
void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
  pinMode(13, OUTPUT);
}

void loop()
{
  while (Serial1.available() > 0)
  {
    char character = "";
    character = char(Serial1.read());
    Daten_von_Display += character;
    Serial.println(Daten_von_Display);
  }
  if (Daten_von_Display.substring(0, 4) == "ON")
  {
    digitalWrite(13, HIGH);
    Daten_von_Display = "";
  }
  else if (Daten_von_Display.substring(0, 4) == "OF")
  {
    digitalWrite(13, LOW);
    Daten_von_Display = "";
  }
}

Es funktioniert. Du bist der Hammer! Danke.

Und wie mach ich das dann mit einem Slider? und Pin 0/1 Serielle Schnittstelle?
Einfach dann das Serial1 durch Serial ersetzen?

Was bekommst da geliefert?

Du kannst nicht gleichzeitig Serial fürs debuggen und zur Datenverwertung nutzen. Das musste trennen...

Ah okay also bleibt der Serielle Port 0,1 immer unbelegt?, weil ich möchte dann 1 Serellen Port für das Display, dann 1 für RFID und 1Port für einen Sensor nutzen.

Der Slider sollte von 0-100% eine LED Dimmen.

Darf ich deine Mail Adresse haben, dann würde ich dir einfach mal mein Projekt zusenden.
Ich bezahl dich auch demensprechend.

Ja... geht. pwm und ggfls. mappen. Aber auf was?
Kommt da als kleinster Wert 0 und als größter 100?

Zum probieren:
Geht allein mit dem Seriellen Monitor. einfach oben eine Zahl eingeben.
Beobachte, was mit der Onboard-LED passiert ....
Da wo HIER steht, kannst Du auch Serial1 draus machen, musst dann aber eine Zahl übertragen.

String Daten_von_Display = "";
int zahl;
void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop()
{
  while (Serial.available() > 0)  // HIER
  {
    char character = char(Serial.read()); // HIER
    Daten_von_Display += character;
    Serial.println(Daten_von_Display);
    if (character == '\n')
    {
      zahl = Daten_von_Display.toInt();
      Serial.println(zahl);
      if (zahl > 100) {Serial.println("zuviel"); zahl = 100;}
      Daten_von_Display = "";
    }
  }
  analogWrite(LED_BUILTIN, map(zahl, 0, 100, 0, 255));
}

Lernen ist unbezahlbar.
Wenn Du was lernen willst, bleib hier.
:wink:

Hey sorry das ich erst jetzt schreibe, muss leider immer wieder ins Krankenhaus zur Blutabnahme nach meiner Wiederbelebung.

So, also das Ziel ist es wenn ich 6 Slider bewege von 0-100 % das ich dann die Werte an ein Digitalpoti sende (Entweder 1x6CH AD5206 oder 6 einzelne). Auflösung 0-256 um dann die LEDs zu dimmen.

grafik

Da würde ich dann auch gerne mit Strings arbeiten .

Warum?
Wenn Du eh schon Werte hast, dann übertrage die - keine Umrechnung und Konvertierung.
Ich würde die Channel abfragen - und als Antwort den Wert erwarten, der direkt auf den AD geht.

Man kann das Nextion mit einer Hilfsvariablen und covx auch dazu überreden, Werte als C-String zu versenden. Ob ich das je benutzen würde, steht auf einem anderen Blatt.

Beispiel (HMI, TFT und ein Font) beiliegend; Informationen im Nextion Instruction Set, ausprobierbar im Nextion Editor "Debug"-Funktion.

Slider A geht "konventionell":

  • Touch Press Event / Touch Release Event: Send Component ID
  • Touch Move: Get Value

Slider B ist mit Textausgabe (alle Zeichenketten 0-terminiert):

  • Touch Press Event: "SliderBPress"
  • Touch Move: aktueller Wert als Text ("44", "32"...)
  • Touch Release Event: "SliderBRelease"

Viel Spaß beim Ausprobieren!

NextionSlider.zip (207,2 KB)


Gruß Walter

2 Likes

Endlich einer, der das mal bauen kann :slight_smile:
Ich habe eine Spende, kann das aber nicht, da wo der ist ist kein Windows, und da wo windows ist ist er nicht :cry: - Danke.

Vielen Dank ich werde es mal ausprobieren ob es klappt. Mit dem Nextion komm ich klar bloß mit dem Arduino Sketch da hab ich Probleme es zu verstehen, wie das umgewandelt wird.

Ist keine Raketenwissenschaft. Du musst Dir nur darüber klarwerden, dass Zahlen nicht als Text-Ziffern gespeichert bzw. übertragen werden.
Ein Byte (ohne Vorzeichen) kann Werte von 0 bis 255 aufnehmen, in Hex-Darstellung 0x00...0xFF.
Zwei Byte (Arduino unsigned int) geht dann von 0 bis 65535 (0x0000...0xFFFF). Da muss man sich nur überlegen, ob zuerst die rechte Hälfte im Speicher steht bzw. empfangen wird (little endian) oder die linke (big endian, ist nicht mehr so gebräuchlich).
Das Nextion überträgt little endian.

Im Beispiel Slider A:
Lesen in einen Byte-Puffer bis 3x hintereinander 0xFF empfangen wurde (Ende-Kennzeichen). Dann Auswertung der empfangenen Nachricht und wieder von vorn.

Beim Touch Press brauchst Du nur ein paar Byte vergleichen:

65 00 01 01 FF FF FF 
|  |  |  |
|  |  |  +---- buffer[3]    01 = Press , 00 = Release
|  |  +------- buffer[2]    Component ID
|  +---------- buffer[1]    Page Number
+------------- buffer[0]    Kennung: Touch Event

Der Wert selbst (hier: 46 = 0x2E) kommt beim 'Move' dann mit Kennung 0x71.
Die Nextion-Dokumentation und der Debugger geben vier Byte für die Zahl an. Ich glaube, das stimmt nicht. Kannst Du aber rauskriegen, indem Du nachzählst, wie viele Byte vor den drei 0xFF gekommen sind.

71 2E 00 00 00 FF FF FF 
|  |  |  |  |
|  +--+--+--+---- Wert (little Endian)
+---------------- Kennung Numeric data

Der Wert ist dann ein unsigned long bzw. uint32_t:

// 0x2E + 0x00*256 + 0x00*256*256 + 0x00*256*256*256;
uint32_t value = buffer[1] + buffer[2]*256 + buffer[3]*256*256 + buffer[4]*256*256*256;

Mein Display schickt nur zwei Byte:

71 2E 00 FF FF FF 
|  |  |
|  +--+---- Wert (little Endian)
+---------- Kennung Numeric data

Der Wert ist dann ein uint16_t:

// 0x2E + 0x00*256 
uint16_t value = buffer[1] + buffer[2]*256;

Wenn Du den Slider bewegst, bekommst 1x 0x65, etliche Male 0x71 und dann zum Schluß wieder die 0x65 mit dem vierten Byte (buffer[3]) als 0 (Release).

1 Like

Ah Okay langsam wirds verständich vielen herzlichen Dank für eure Hilfe :slight_smile: ich schreib da jetzt mal einen Sketch und probiere das. :slight_smile:

Ich habe jetzt mal den Code für die Slider und Buttons geschrieben das funktioniert auch und lässt sich dimmen.

Jetzt soll das ganze an ein Digitalpoti oder Spannungsregler angeschlossen werden.
Das der Arduino ein externes Signal überlagern kann..

Wie würdet ihr das machen oder habt ihr da eine Idee? Mein Code ist hier:

// START PROG *************************************************************************************************************************************************************

void loop() {
  if(Serial1.available()){                                                      // Warte auf Serielle Verbindung von Display und Schreibe in Daten String Daten_von_Display 
    char character = "";                            
    String Daten_von_Display="";
    delay(30);
    while(Serial1.available()){                                                         
      character =char(Serial1.read());
      Daten_von_Display += character;                                           // Wenn Verbindung da dann hole Daten von Display 
    }
    // ********* BUTTON MATRIX************************************************* // EMPFANGENE DATEN VON DISPLAY***********************************************************
    Serial1.println(Daten_von_Display);                                         
    if(Daten_von_Display.substring(0,4) == "Bt01"){                             // Button Color Perfekt White 1
    digitalWrite(13, HIGH);}
    else if (Daten_von_Display.substring(0,4) == "Bt00"){                       // Button Color Perfekt White 0
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "BSG0"){                       // Button Scanguard OFF
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "BSG1"){                       // Button Sanguard ON
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "BLS0"){                       // Button Lidar Sensor OFF                   
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "BLS1"){                       // Button Lidar Sensor ON
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "BIX0"){                       // Button Invertiere X Achse OFF
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "BIX1"){                       // Button Invertiere X Achse ON
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "BIY0"){                       // Button Invertiere Y Achse OFF
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "BIY1"){                       // Button Invertiere Y Achse ON
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "BG10"){                       // Motorrizes Grating Effekt OFF
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "BG11"){                       // Motorrizes Grating Effekt ON
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "ATC0"){                       // Auto Test Check Nicht Aktiv
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "ATC1"){                       // Auto Test Check Aktiv
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "MST0"){                       // Mechanischer Shutter Test Nicht Aktiv
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "MST1"){                       // Mechanischer Shutter Test Aktiv
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "BPL0"){                       // Button Pilotlaser OFF
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "BPL1"){                       // BUtton Pilotlaser ON
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "RGB0"){                       // Button RGB Gerätelicht OFF
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "RGB1"){                       // BUttton RGB Gerätelicht ON
    digitalWrite(13, LOW);}
    else if (Daten_von_Display.substring(0,4) == "REDS"){                       // Slider Farbe Rot 0-100%
    analogWrite(13,Daten_von_Display.substring(4,10).toInt());
    Serial.println(String(Daten_von_Display.substring(4,10).toInt()));}
    else if (Daten_von_Display.substring(0,4) == "GRES"){                       // Slider Farbe Grün 0-100%
    analogWrite(13,Daten_von_Display.substring(4,10).toInt());
    Serial.println(String(Daten_von_Display.substring(4,10).toInt()));}
    else if (Daten_von_Display.substring(0,4) == "BLUS"){                       // Slider Farbe Blau 0-100%
    analogWrite(13,Daten_von_Display.substring(4,10).toInt());
    Serial.println(String(Daten_von_Display.substring(4,10).toInt()));}
    else if (Daten_von_Display.substring(0,4) == "CYAS"){                       // Slider Farbe Cyan 0-100%
    analogWrite(13,Daten_von_Display.substring(4,10).toInt());
    Serial.println(String(Daten_von_Display.substring(4,10).toInt()));}
     else if (Daten_von_Display.substring(0,4) == "YELS"){                      // Slider Farbe Yellow/Gelb/Orange 0-100%
    analogWrite(13,Daten_von_Display.substring(4,10).toInt());
    Serial.println(String(Daten_von_Display.substring(4,10).toInt()));}
    else if (Daten_von_Display.substring(0,4) == "DPBS"){                       // Slider Farbe Deep Blue 0-100%
    analogWrite(13,Daten_von_Display.substring(4,10).toInt());
    Serial.println(String(Daten_von_Display.substring(4,10).toInt()));}


}
  


}

Vielen herzlichen Dank :wink:

Rein informativ:
DAS

void loop()
{
  if (Serial1.available())                                                      // Warte auf Serielle Verbindung von Display und Schreibe in Daten String Daten_von_Display
  {
    char character = "";
    String Daten_von_Display = "";
    delay(30);
    while (Serial1.available())
    {
      character = char(Serial1.read());
      Daten_von_Display += character;                                           // Wenn Verbindung da dann hole Daten von Display
    }
    // ********* BUTTON MATRIX************************************************* // EMPFANGENE DATEN VON DISPLAY***********************************************************
    Serial1.println(Daten_von_Display);
    if (Daten_von_Display.substring(0, 4) == "Bt01")                            // Button Color Perfekt White 1

bricht Dir das Genick.
Das wird immer als Beispiel gezeigt, ist aber nur ein Beispielcode und funktioniert vielleicht im Beispiel. In der Realität sieht das ganz anders aus.

Wenn die Daten langsamer kommen, als Du liest, ist die Bedingung für while (Serial1.available())) weiterhin erfüllt. Damit liest Du irgendwas mit character = char(Serial1.read()); - egal ob Du das verwerten kannst, schreibst Du das in Deinen String.
Tu das nicht.
Mach das nicht-blockierend und prüfe, was Du in den String schreiben willst.

Und als Anregung für Deinen endlosen if-Dingens....

    Serial1.println(Daten_von_Display);
    myCharVar = Daten_von_Display.substring(0, 4);
    switch (myCharVar)
    {
      case "Bt01":
        digitalWrite(13, HIGH);
        break;
      case "Bt00":
        digitalWrite(13, LOW);
        break;
      case "BSG0":
        digitalWrite(13, LOW);
        break;
1 Like