Tutorial Nextion #6 – Send Value to Arduino

14 Kommentare
Tutorial Nextion #6 – Send Value to Arduino

In diesem Beitrag geht es darum, wie Ihr Wert (Value) an den Arduino senden könnt.


Inhaltsverzeichnis

  1. Was wird für das Projekt benötigt.
  2. Das Nextion Programm
  3. Der Arduino Code



1. Was wird für das Projekt benötigt.

Ihr braucht einen Microcontroller (Arduino, ESP8266, ESP32 oder ein anderes Board), in meinem Beispiel der Arduino Uno R3. Dann braucht Ihr natürlich noch ein Nextion Display euer Wahl. Ich habe das Nextion Discovery 3,5 Zoll verwendet. 1x Nextion 3.5″ Discovery Touch Display 480×320 HMI – NX4832F035 - https://ap-url.de/nextion35d
1x UNO R3 ATmega328P Board mit USB Kabel Arduino Uno R3 kompatibel - https://ap-url.de/arduinouno



2. Das Nextion Programm

In der Nextion Software erstellen wir uns ein Projekt. In diesem Projekt brauchen wir 3 Nummernfelder und einen Button.Die ersten beiden Nummernfelder sind für die Eingabe der Werte gedacht.Das dritte Nummernfeld ist für die Ausgabe da. Der Button wird zum senden der Werte benötigt.


Wenn die Nummernfelder Platziert sind muss für n0 und n1 noch ein Keyboard ausgewählt werden. Das geht in dem Ihr in den Attributen unter vscope global wählt und unter key das numeric keyboard wählt. n2 bleibt wie es ist, dieses dient zur Ausgabe.


Im nächsten Schritt müssen wir dem senden Button, jenach wunsch in das Touch Press Event oder in das Touch Release Event folgendes Eintragen.

prints n0.val,0
prints n1.val,0

Mit diesen Einträgen werden die Werte aus n0 und n1 beim drücken des Buttons an den Arduino gesendet.


Mit diesen Einträgen werden die Werte aus n0 und n1 beim drücken des Buttons an den Arduino gesendet.


Download Nextion und Arduino Programm (158kb .zip)




3. Der Arduino Code

#include <softwareserial.h>
String endChar = String(char(0xff)) + String(char(0xff)) + String(char(0xff));
String ReceivedData = "";

SoftwareSerial nextion(6, 5); // RX, TX
int Data0;
int Data1;

union {
  char charByte[8];
  long valLong;
} value;

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

void loop() {
  if (nextion.available()) {
    ReceivedData += char(nextion.read());
    if (ReceivedData.length() > 8) ReceivedData = "";
  }

  if (ReceivedData.length() == 8) {
    //Serial.println(ReceivedData);
    value.charByte[0] = char(ReceivedData[0]);
    value.charByte[1] = char(ReceivedData[1]);
    value.charByte[2] = char(ReceivedData[2]);
    value.charByte[3] = char(ReceivedData[3]);
    Data0 = value.valLong;
    value.charByte[0] = char(ReceivedData[4]);
    value.charByte[1] = char(ReceivedData[5]);
    value.charByte[2] = char(ReceivedData[6]);
    value.charByte[3] = char(ReceivedData[7]);
    Data1 = value.valLong;
    Serial.println(Data0);
    Serial.println(Data1);
    ReceivedData = "";
  nextion.print("n2.val=");
  nextion.print(Data0);
  nextion.print(Data1);
  nextion.write(0xFF);
  nextion.write(0xFF);
  nextion.write(0xFF);
  }


  if (ReceivedData.endsWith(endChar)) {
    Serial.println(ReceivedData);
    Serial.println("error");
    ReceivedData = "";
  }
}

Funktionsweise

Die SoftwareSerial wird inkludiert, zwei Strings angelegt endChar ist für eine Errorbehandlung da, für dieses Projekt nicht relevant. ReceivedData, hier werden die Empfangenen Daten gespeichert.SoftwareSerial an Pin 6 und 5 erstellt, int Data0 und Data1 hier werden die Werte aus n0 und n1 gespeichert.

Das union wir verwendet und die Werte in die int Data zu speichern.

#include <softwareserial.h>
String endChar = String(char(0xff)) + String(char(0xff)) + String(char(0xff));
String ReceivedData = "";

SoftwareSerial nextion(6, 5); // RX, TX
int Data0;
int Data1;

union {
  char charByte[8];
  long valLong;
} value;


Im Setup wird die Serielle Schnittstelle für den Seriellen Monitor und für das Nextion angelegt. Das Serial.beginn(9600); könnte man weglassen, ist nur für das Debug da.

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


Hier wird die Serielle Schnittstelle abgefragt, wenn Daten vorhanden sind, werden diese in ReceivedData gespeichert. Wenn die Datenlänge von ReceivedData größer 8 ist, wird ReceivedData wieder geleert.

void loop() {
if (nextion.available()) {
  ReceivedData += char(nextion.read());
  if (ReceivedData.length() > 8) ReceivedData = "";
}


Wenn die Datenlänge = 8 Bytes entspricht, wird Byte für Byte in das value.charByte Array übertragen. Mit dem Befehlt Data0 = value.valLong bzw. mit dem union von oben werden die 4 Bytes in Data0 geschrieben. Das gleiche passiert dann nochmal mit Data1. Wenn Ihr hier mehr Daten benötigt, müsst Ihr euch den Code entsprechend anpassen.

Zum Schluss werden dann die Data0 und Data1 an das Nextion gesendet und um n2 ausgegeben.

if (ReceivedData.length() == 8) {
  //Serial.println(ReceivedData);
  value.charByte[0] = char(ReceivedData[0]);
  value.charByte[1] = char(ReceivedData[1]);
  value.charByte[2] = char(ReceivedData[2]);
  value.charByte[3] = char(ReceivedData[3]);
  Data0 = value.valLong;
  value.charByte[0] = char(ReceivedData[4]);
  value.charByte[1] = char(ReceivedData[5]);
  value.charByte[2] = char(ReceivedData[6]);
  value.charByte[3] = char(ReceivedData[7]);
  Data1 = value.valLong;
  Serial.println(Data0);
  Serial.println(Data1);
  ReceivedData = "";
nextion.print("n2.val=");
nextion.print(Data0);
nextion.print(Data1);
nextion.write(0xFF);
nextion.write(0xFF);
nextion.write(0xFF);
}




Arduino Nextion Display

14 Kommentare

Hallo und vielen Dank für die tollen Tutorials!
Dieses hier konnte ich soweit nachbauen, alles hat geklappt.
Ich habe aber nicht verstanden, wie ich den code erweitern muss, wenn ich
z.B. zwei Datenfelder zusätzlich übermitteln möchte.
Also DATA2 und DATA3 zusätzlich zu DATA1 und DATA2.

Vielleicht könntest du das einmal kurz beschreiben.
Vielen Dank!

Grüße
Stephan

Stephan

Guten Tag
Ihr Tutorial ist hervorragend erklärt und hat mir sehr geholfen, Danke für Ihre Mühen.
Nun folgendes:
Ich steuere eine Sternwartenkuppel über mehrere Buttons, das funktioniert auch super.
Das Projekt besteht aus drei Seiten im Nextion , Seite 1 Steuerungsbuttons ; Seite 2 ebenfalls.
Auf der dritten Seite soll über ein Tastenfeld eine numerische Gradzahl, z.B. 320 Grand eingegeben werden.
Sobald ich das eingebe, ist eine Bedienung der Buttons auf den anderen beiden Seiten nicht mehr möglich.
Nach einem Reset des Arduino funktionieren S1+S2 wieder.
Was mache ich falsch oder versteh ich nicht richtig?
Arduino ohne die Nextion.h , ich verwende eine Mega .
Vielleicht haben Sie ja Zeit mich dahingehend zu unterstützen.

Frank

Frank Lorenz

Hallo Michael,
du kannst mir auch mal eine Sachen schicken dann guck es mal drüber.
Gruß
Tobias

arduino projekte

Hallo Tobias, das Tutorial #4 hat mir schon etwas weitergeholfen. Vielen Dank schonmal dafür! Allerdings steh ich gerade vor dem Problem, dass wenn ich Tutorial #6 und #4 miteinander verknüpfe, mir gleich zu Beginn dauerhaft Serial.println(“error”) angezeigt wird und ich nicht mehr damit weiter arbeiten kann…Unterschied zu #6 ist, dass ich Data 1 usw. in einen Speicher reinschriebe (NVS)Danke & GrußMichael

Michael Jue

Hallo Michael,
das Werte senden vom Arduino zum Display habe ich in dem Beitrag zum Gauge Zeiger schon mal gezeigt. Wenn das nicht hilft, kann ich gerne nochmal ein Video dazu machen.
https://arduino-projekte.info/tutorial-nextion-4-gauge-funktion-zeiger/

Gruß
Tobias

arduino projekte

Hinterlassen Sie einen Kommentar

Bitte beachten Sie, dass Kommentare vor der Veröffentlichung genehmigt werden müssen.