Tutorial Nextion #6 – Send Value to Arduino

Tutorial Nextion #6 – Send Value to Arduino
Inhaltsverzeichnis

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.

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.
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);
  }
				
			
Folgende Bauteile wurden verwendet: