Writing to and reading from a nextion screen problems

With help from Perry Bebbington I was able to send data to my nextion screen text and number boxes. I added my code to also read data coming in from the nextion screen and that was working great to until I put all my code together. Now data going to the screen works fine and data coming from the screen is intermittent at best. I will post my code below in it’s intirety but it is broken up due to the 9000 character post limit. Any advice or inout would be greatly appreciated!

PART 1

#include <SoftwareSerial.h>                                                 //LIBRARY
#include <DallasTemperature.h>                                              //LIBRARY
#include <OneWire.h>                                                        //LIBRARY
#include <AccelStepper.h>                                                   //LIBRARY
//DEFINITION                                                                //DEFINITION
#define motorPin1 4                                                         //MOTOR PIN DEFINITIONS
#define motorPin2 6                                                         //MOTOR PIN DEFINITIONS
#define motorPin3 7                                                         //MOTOR PIN DEFINITIONS
#define motorPin4 8                                                         //MOTOR PIN DEFINITIONS
#define HALFSTEP 8                                                          //MOTOR PIN DEFINITIONS
#define ONE_WIRE_BUS 12                                                     //ONE WIRE BUS DEFINITIONS
//DECLARATIONS                                                              //DECLARATIONS
OneWire oneWire(ONE_WIRE_BUS);                                              //ONE WIRE BUS DECLARATION
DallasTemperature sensors(&oneWire);                                        //DALLAS TEMPERATURE SENSOR DECLARATION
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);//MOTOR PIN DECLARATION
SoftwareSerial mySerial(10, 11);                                            //SCREEN SERIAL
//VARIABLES                                                                 //VARIABLES
int tps;                                                                    //TPS VARIABLES *
int newtps;                                                                 //TPS VARIABLES *
float O2;                                                                   //O2 VARIABLES *
float O2new;                                                                //O2 VARIABLES *
float O2set;                                                                //O2 VARIABLES *
float O2voltage;                                                            //O2 VARIABLES *
int O2heat;                                                                 //O2 VARIABLES *
int ets;                                                                    //ETS VARIABLES *
const int dataIN = 13;                                                      //RPM IR VARIABLES *
unsigned long prevmillis;                                                   //RPM IR VARIABLES *
unsigned long duration;                                                     //RPM IR VARIABLES *
unsigned long refresh;                                                      //RPM IR VARIABLES *
int rpm;                                                                    //RPM IR VARIABLES *
boolean currentstate;                                                       //RPM IR VARIABLES *
boolean prevstate;                                                          //RPM IR VARIABLES *
float enrich;                                                               //INJ PW VARIABLES *
float accel;                                                                //INJ PW VARIABLES *
float etsenrich;                                                            //INJ PW VARIABLES *
const int injpin = 5;                                                       //INJECTION VARIABLES *
float pw;                                                                   //INJECTION VARIABLES *
int fuelstan;                                                               //INJECTION VARIABLES *
int reqfuel;                                                                //INJECTION VARIABLES *
int ve;                                                                     //INJECTION VARIABLES *
int injopen;                                                                //INJECTION VARIABLES *
float hourmeter;                                                            //HOURMETER VARIABLES
float minutes;                                                              //HOURMETER VARIABLES
float prevhourmeter;                                                        //HOURMETER VARIABLES
int oc;                                                                     //HOURMETER VARIABLES
int gc;                                                                     //HOURMETER VARIABLES
String message;                                                             //SCREEN VARIABLES
int numMessages;                                                            //SCREEN VARIABLES
int numBytes;                                                               //SCREEN VARIABLES
int endBytes;                                                               //SCREEN VARIABLES
byte inByte;                                                                //SCREEN VARIABLES
byte pageNum;                                                               //SCREEN VARIABLES
byte buttonNum;                                                             //SCREEN VARIABLES
//SETUP                                                                     //SETUP
void setup() {                                                              //SETUP
  stepper1.setMaxSpeed(1500);                                               //THROTTLE STEPPER SETTINGS
  stepper1.setAcceleration(1500);                                           //THROTTLE STEPPER SETTINGS
  pinMode(A0, INPUT);                                                       //SETUP
  pinMode(dataIN, INPUT);                                                   //IR SENSOR INPUT
  prevmillis = 0;                                                           //RPM VARIABLES
  prevstate = LOW;                                                          //RPM VARIABLES
  pinMode(2, OUTPUT);                                                       //SETUP
  pinMode(5, OUTPUT);                                                       //SETUP
  Serial.begin(57600);                                                      //SERIAL BEGIN
  while (!Serial) {                                                         //SCREEN SERIAL
    ;                                                                       //SCREEN SERIAL
  }                                                                         //SCREEN SERIAL
  Serial.println("Serial On");                                              //SCREEN SERIAL
  mySerial.begin(9600);                                                     //SCREEN SERIAL
  numMessages, endBytes = 0;                                                //VARAIBALE INITIALIZATION
  pageNum, buttonNum = 255;                                                 //VARAIBALE INITIALIZATION
}//SETUP                                                                    //SETUP
//LOOP                                                                      //LOOP

PART 2

void loop() {                                                               //LOOP
  String n2val = "";                                                        //RPM SCREEN SERIAL
  n2val = "page1.n2.val=";                                                  //RPM SCREEN SERIAL
  n2val.concat(rpm);                                                        //RPM SCREEN SERIAL
  writeString(n2val);                                                       //RPM SCREEN SERIAL
  String n6val = "";                                                        //ETS SCREEN SERIAL
  n6val = "page1.n6.val=";                                                  //ETS SCREEN SERIAL
  n6val.concat(ets);                                                        //ETS SCREEN SERIAL
  writeString(n6val);                                                       //ETS SCREEN SERIAL
  HMI_display_page1(O2new);                                                 //AFR SCREEN SERIAL
  HMI_display_page2(minutes);                                               //HOURMETER SCREEN SERIAL
  if (minutes >= 50)                                                        //OIL CHANGE WARNING MESSAGE
  { //OIL CHANGE WARNING MESSAGE                                            //OIL CHANGE WARNING MESSAGE
    HMI_display_page3(oc);                                                  //OIL CHANGE WARNING MESSAGE
  }                                                                         //GALLEY CHANGE WARNING MESSAGE
  if (minutes >= 500)                                                       //GALLEY CHANGE WARNING MESSAGE
  { //GALLEY CHANGE WARNING MESSAGE                                         //GALLEY CHANGE WARNING MESSAGE
    HMI_display_page4(gc);                                                  //GALLEY CHANGE WARNING MESSAGE
  }                                                                         //GALLEY CHANGE WARNING MESSAGE
  if (numMessages == 1) {                                                   //COMP ID MESSAGE
    numMessages = 0;                                                        //COMP ID MESSAGE
    if (pageNum == 1 && buttonNum == 23) {                                  //WAS THE PAGE NUMBER 1 AND BUTTON 23
      message = "";                                                         //CLEAR THE MESSAGE
      pageNum = 255;                                                        //RESET VARIABLES
      buttonNum = 255;                                                      //RESET VARIABLES
      page1_button23();                                                     //GO TO PAGE 1 CODE
    }                                                                       //GO TO PAGE 1 CODE
    if (pageNum == 2 && buttonNum == 2) {                                   //WAS THE PAGE NUMBER 2 AND BUTTON 2
      message = "";                                                         //CLEAR THE MESSAGE
      pageNum = 255;                                                        //RESET VARIABLES
      buttonNum = 255;                                                      //RESET VARIABLES
      page2_button2();                                                      //GO TO PAGE 2 CODE
    }                                                                       //GO TO PAGE 2 CODE
  }                                                                         //SCREEN INPUTS
  if (mySerial.available()) {                                               //IS DATA COMING IN FROM NEXTION
    inByte = mySerial.read();                                               //CAPTURE INBOUD DATA BIT
    if (inByte > -1 && inByte < 255) {                                      //COMP ID MESSAGE
      numBytes = numBytes + 1;                                              //KEEP TRACK OF DATA BITS
    }                                                                       //KEEP TRACK OF DATA BITS
    else if (inByte == 255) {                                               //IS IT AN END BIT
      endBytes = endBytes + 1;                                              //INCREMENT END BITS
    }                                                                       //INCREMENT END BITS
    if (numBytes == 2) {                                                    //The second data bit is always the pageID in "Send component ID"
      pageNum = inByte;                                                     //Assign the page number
    }                                                                       //Assign the page number
    if (numBytes == 3) {                                                    //The 3rd data bit is always the buttonID in "Send component ID"
      buttonNum = inByte;                                                   //Assign the button number
    }                                                                       //Assign the button number
    if (inByte == 255 && endBytes == 3) {                                   //Has the entire message been received.
      numMessages = numMessages + 1;                                        //Increment numMessages
      endBytes = 0;                                                         //Re-initialise counter variables
      numBytes = 0;                                                         //Re-initialise counter variables
    }                                                                       //Re-initialise counter variables
  }                                                                         //Re-initialise counter variables
  //Re-initialise counter variables
  hourmeter = millis();                                                     //HOURMETER
  minutes = hourmeter / 3600000;                                            //HOURMETER
  rpm = 0;                                                                  //RPM MEASUREMENT
  currentstate = digitalRead(dataIN);                                       //RPM MEASUREMENT
  if ( prevstate != currentstate)                                           //RPM MEASUREMENT
  { //RPM MEASUREMENT                                                       //RPM MEASUREMENT
    if ( currentstate == HIGH )                                             //RPM MEASUREMENT
    { //RPM MEASUREMENT                                                     //RPM MEASUREMENT
      duration = ( micros() - prevmillis );                                 //RPM MEASUREMENT
      rpm = (60000000 / duration);                                          //RPM MEASUREMENT
      prevmillis = micros();                                                //RPM MEASUREMENT
    }                                                                       //RPM MEASUREMENT
  }                                                                         //RPM MEASUREMENT
  prevstate = currentstate;                                                 //RPM MEASUREMENT
  //O2 SENSOR                                                               //O2 SENSOR
  analogReference(INTERNAL);                                                //USE INTERNAL REFERENCE TO GET BETTER ACCURACY FOR O2 SENSORS
  O2 = analogRead(A0);                                                      //READ O2 SENSOR
  O2voltage = O2 * (1.1 / 1023);                                            //CHECK NEW O2 VALUE
  O2new = map(O2voltage, 0.100, 1.100, 17.00, 13.00);                       //MAP O2 VALUE
  analogReference(DEFAULT);                                                 //RETURN ANALOG REFERENCE TO DEFAULT
  //ETS                                                                     //ETS
  sensors.requestTemperatures();                                            //REQUEST ETS SENSOR BEGIN
  ets = sensors.getTempFByIndex(0);                                         //READ ETS
  //PW MATH                                                                 //PW MATH
  //REMOVE SLASHS etsenrich = map(etsnew, etsmin, etsmax, 257, -67);        //REMAP ETS SENSOR FOR ENRICHMENT RATIO
  //REMOVE SLASHS enrich = (O2/O2set)*(etsenrich/100);                      //CALC FOR GAMMA E
  //REMOVE SLASHS accel = tps/tpsprev;                                      //CALC FOR ACCELERATION RATIO
  //REMOVE SLASHS pw = reqfuel * ve * enrich * accel + injopen;             //INJ PW EQUATION REQFUEL, VE AND INJOPEN SET IN FUEL INJ SETTINGS ON TOUCH DISPLAY
  //REMOVE SLASHS while (millis()<=(millis()+pw){                           //START COUNTING FOR INJ PW
  //REMOVE SLASHS injpin = HIGH;                                            //SET INJECTOR PIN HIGH FOR DURATION OF ABOVE
  //REMOVE SLASHS }                                                         //PW MATH
  //REMOVE SLASHS injpin = LOW;                                             //SET INJECTOR PIN BACK TO LOW

PART 3

//REMOVE SLASHS Serial.print("inj pw = ");                                //REMOVE AFTER DEBUGGING
  //REMOVE SLASHS Serial.println(pw);                                       //REMOVE AFTER DEBUGGING
  // SCREEN INPUTS                                                          //SCREEN INPUTS
  //SCREEN FUNCTION
}
void writeString(String stringData) {                                       //SCREEN FUNCTION
  for (int i = 0; i < stringData.length(); i++)                             //SCREEN FUNCTION
  { //SCREEN FUNCTION                                                       //SCREEN FUNCTION
    mySerial.write(stringData[i]);                                          //SCREEN FUNCTION
  }//SCREEN FUNCTION                                                        //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
}//SCREEN FUNCTION                                                          //SCREEN FUNCTION
void HMI_display_page1(float O2new) {                                       //SCREEN FUNCTION
  mySerial.print(F("page1.t1.txt=\""));                                     //SCREEN FUNCTION
  mySerial.print(O2new);                                                    //SCREEN FUNCTION
  mySerial.print(F("\""));                                                  //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
}                                                                           //SCREEN FUNCTION
void HMI_display_page2(float minutes) {                                     //SCREEN FUNCTION
  mySerial.print(F("page1.t2.txt=\""));                                     //SCREEN FUNCTION
  mySerial.print(minutes);                                                  //SCREEN FUNCTION
  mySerial.print(F("\""));                                                  //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
}                                                                           //SCREEN FUNCTION
void HMI_display_page3(int oc) {                                            //SCREEN FUNCTION
  mySerial.print(F("t5.txt=\""));                                           //SCREEN FUNCTION
  mySerial.print(F("OIL CHANGE DUE"));                                      //SCREEN FUNCTION
  mySerial.print(oc);                                                       //SCREEN FUNCTION
  mySerial.print(F("\""));                                                  //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
}                                                                           //SCREEN FUNCTION
void HMI_display_page4(int gc) {                                            //SCREEN FUNCTION
  mySerial.print(F("t5.txt=\""));                                           //SCREEN FUNCTION
  mySerial.print(F("GALLEY CHANGE DUE"));                                   //SCREEN FUNCTION
  mySerial.print(gc);                                                       //SCREEN FUNCTION
  mySerial.print(F("\""));                                                  //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
  mySerial.write(0xff);                                                     //SCREEN FUNCTION
}
int getMessage() {                                                          //This function will be called in each page_button combo to capture the relevant data coming from the Nextion
  int val;                                                                  //Declare the return variable
  val = 0;                                                                  //Initialise the return variable
  while (endBytes < 3) {                                                    //While the message isn't complete
    if (mySerial.available()) {                                             //Is data coming from the Nextion
      inByte = mySerial.read();                                             //Assign the incoming data bit.
      if (inByte > 47 && inByte < 58) {                                     //Is the data a character between 0 and 9?
        message.concat(char(inByte));                                       //Construct the message piece by piece
      }                                                                     //Construct the message piece by piece
      if (inByte == 255) {                                                  //Is it an end byte?
        endBytes = endBytes + 1;                                            //Is it an end byte?
      }                                                                     //Is it an end byte?
      if (inByte == 255 && endBytes == 3) {                                 //Has the whole message been received
        val = message.toInt();                                              //Convert and assign the message to the return variable
        message = "";                                                       //Clear the message
        endBytes = 0;                                                       //Clear the message
        return val;                                                         //Return the value received
      }                                                                     //Return the value received
    }                                                                       //Return the value received
  }                                                                         //Return the value received
  endBytes = 0;                                                             //Just making sure end bytes is 0
}
void page1_button23() {                                                     //Code for the specific component
  while (mySerial.read() == 255) {                                          //This while ensures that the program waits here until new data from the Nextion is received. If no new data is received the Arduino will just keep reading the last value which is "255".*/
  }                                                                         //This while ensures that the program waits here until new data from the Nextion is received. If no new data is received the Arduino will just keep reading the last value which is "255".*/
  tps = getMessage();                                                       //Assign the returned value from getMessage() to your variable
  Serial.print("TPS: ");                                                    //DEBUGGING
  Serial.println(tps);                                                      //DEBUGGING
  //      newtps = map(tps, 0, 100, 0, 1600);                                     //TPS AND STEPPER
  //      stepper1.runToNewPosition(newtps);                                      //TPS AND STEPPER
}                                                                           //Assign the returned value from getMessage() to your variable
void page2_button2() {                                                      //Code for the relevant component
  while (mySerial.read() == 255) {                                          //Code for the relevant component
  }                                                                         //Code for the relevant component
  O2set = getMessage();                                                     //Code for the relevant component
  O2heat = getMessage();                                                    //Code for the relevant component
  fuelstan = getMessage();                                                  //Code for the relevant component
  reqfuel = getMessage();                                                   //Code for the relevant component
  ve = getMessage();                                                        //Code for the relevant component

PART 4

  injopen = getMessage();                                                   //Code for the relevant component
  O2set = O2set / 10;                                                       //Code for the relevant component
  Serial.print("O2 SET: ");                                                 //DEBUGGING
  Serial.println(O2set);                                                    //DEBUGGING
  Serial.print("O2 HEAT: ");                                                //DEBUGGING
  Serial.println(O2heat);                                                   //DEBUGGING
  Serial.print("FUEL START ANGLE: ");                                       //DEBUGGING
  Serial.println(fuelstan);                                                 //DEBUGGING
  Serial.print("REQUIRD FUEL: ");                                           //DEBUGGING
  Serial.println(reqfuel);                                                  //DEBUGGING
  Serial.print("VE %: ");                                                   //DEBUGGING
  Serial.println(ve);                                                       //DEBUGGING
  Serial.print("INJECOR OPEN TIME: ");                                      //DEBUGGING
  Serial.println(injopen);                                                  //DEBUGGING
}

That's all of it. I know its a lot to look at and I hope to make it more efficient once everything is working. Thanks in advance for all your help and advice.

Hello,
I’m glad you got the sending to the Nextion working OK :slight_smile:

What are you sending from the Nextion to the Arduino? There’s more than 1 way to do it, how are you doing it? What data are you sending?

If you remove from your code all the repeated comments then it might fit 9000 characters, or if not, at least you wouldn’t need to split it up as much.

I was hoping someone else would reply as I am not good at reading other people’s code to find problems. I struggle to find problems in my own code and I know how that’s supposed to work!

Did you use auto format on your code in the IDE (tools > auto format or control T)? Please do so, it makes it easier to read and easier to spot mistakes.

You have a lot going on inside the main loop. My advice would be to take as much out of there as possible and out into separate functions. That way it is easy to comment out a function call to see the effect of removing the function from the program. Once you have done that you can easily remove everything that isn’t there to control the Nextion, which makes finding the problem a lot easier. You then add stuff back in until the problem occurs.

One thing that stands out as possibly causing a problem is this:

  while (endBytes < 3) {                                                    //While the message isn't complete

You program will get stuck there waiting for bytes that might never come. Even if they do come you have many milliseconds waiting for them while nothing else can happen. The way to do it is to check for a received byte, if it’s there do something with it, if not then return and do all the other stuff, then come back and check again.

Please do not split up your code or remove comments.

Yes, it is wise to tidy up your code. People are more inclined to read it if you make it attractive to read.
This means sensible indentation, comments, whitespace e.g. press ctrl-T

If it is too big to paste, attach as a ZIP.

During your tidying attempt you will read it yourself.
This often means you improve your logic flow. And solve it by yourself.

David.

Please do not split up your code or remove comments.

To be clear, I don’t want hcm2011 to remove all the comments, just the multiple duplications.

PerryBebbington:
What are you sending from the Nextion to the Arduino? There’s more than 1 way to do it, how are you doing it? What data are you sending?

On my second page I have textboxes for variables that will only be changed once in a great while. There’s a button I call save that sends the variables to the arduino via send component id and get.

If you remove from your code all the repeated comments then it might fit 9000 characters, or if not, at least you wouldn’t need to split it up as much.

I worked on removing double comments and cleaning up yesterday and got the characters down from about 30,000 to about 12,000. Much cleaner looking as well.

Did you use auto format on your code in the IDE (tools > auto format or control T)? Please do so, it makes it easier to read and easier to spot mistakes.

I do use autoformat every time I write new code. It has helped me find problems in my code.

You have a lot going on inside the main loop. My advice would be to take as much out of there as possible and out into separate functions. That way it is easy to comment out a function call to see the effect of removing the function from the program. Once you have done that you can easily remove everything that isn’t there to control the Nextion, which makes finding the problem a lot easier. You then add stuff back in until the problem occurs.

I will be writing functions in the next couple days to help with this.

One thing that stands out as possibly causing a problem is this:

  while (endBytes < 3) {                                                    //While the message isn't complete.

You program will get stuck there waiting for bytes that might never come. Even if they do come you have many milliseconds waiting for them while nothing else can happen. The way to do it is to check for a received byte, if it’s there do something with it, if not then return and do all the other stuff, then come back and check again.

I played with this a bit last night but haven’t gotten a chance to test yet in my hardware.
Thanks for your advice!

You have a lot going on inside the main loop. My advice would be to take as much out of there as possible and out into separate functions. I will be writing functions in the next couple days to help with this.

I should add, I always make my main loop contain only calls to functions and nothing else. Every test; IF, ELSE, or MAYBE every loop; FOR, WHILE or WHATEVER happens inside functions, not in the main loop.