Probleme mit Nextion Touch Display

Hallo.
Ich habe mir einen Nextion Touch Display besorgt nur bin ich aufgrud der verwirrend api langsam am verzweifeln

Mein Bild sieht so aus : Siehe Anhang

Wenn ich auf Test klicke soll der ARduino in den Test Modus gehen.
Dort will ich dann auf heat klick oder cool und er soll die Werte der Beiden Schiebebaren als PWM werte nutzen. Ich habe mehre Sachen ausprobiert über Softerserial Nextion liabry etc nichts hat geholfen kann mir jemand helfen?

Mein Code:

// Project: DIY Thermocyler V2.0 Arduino
// Creator: Tobias and Torben
// Date of Creation: 10.12.16

//#include <Wire.h>
#include <SoftwareSerial.h>
#include "NexButton.h"
SoftwareSerial softser(2,3); //RX,TX



int cycle = 0;
int cycle_help = 0;
int cycle_temp[] = {};
int cycle_time[] = {}; 
String softread = "";

//Nextions Display Buttons
char buffer[100] = {0};
NexButton b4 = NexButton(0, 6, "b4");

NexTouch *nex_listen_list[] = 
{
    &b4,
    NULL
};

void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
  while (!Serial){
    
  }
  Serial.print("test");
   softser.begin(9600);
   
  nexInit();
  

  
}
void b0PopCallback(void *ptr)
{
    NexButton *btn = (NexButton *)ptr;
    memset(buffer, 0, sizeof(buffer));
    btn->getText(buffer, sizeof(buffer));
    if (strcmp(buffer,"ON"))
    {
        digitalWrite(9, HIGH);
        strcpy(buffer, "ON");
    }
    else
    {
        digitalWrite(9, LOW);
        strcpy(buffer, "OFF");
    }
    btn->setText(buffer);
   
}

void loop() {
 
  if (softser.available()){
    softread = softser.read();
    Serial.print(softser.read());
  }
  if (softread == "test_mode"){
  
    test_mode();
  }
  
  if (softread == "cycle"){
    while (1){
    cycle = softser.read();  
      if (cycle > 0){
        break;  
      }
    
    }
  }
  if (softread == "temp"){
    while(1){
        
        //myNextion.print("Value" + cycle_help);
        cycle_temp[cycle_help] = softser.read();
        cycle_help++;
        if (cycle_help == cycle){
          cycle_help = 0;
          break;
        } 
      
    }
    
  }
  if (softread == "time"){
    while(1){
        
        //softserial.print("Value" + cycle_help);
        cycle_time[cycle_help] = softser.read();
        cycle_help++;
        if (cycle_help == cycle){
          break;
        } 
      
    }
  }
 
    
   if (softread == "go"){
      sendData();
   }     
 
}

void sendData(){
int temp_ok = 0;
int time_ok = 0;


while(!Serial){
  
 }
  
  
  while(temp_ok == 0){
  Serial.print("Ready");  
  temp_ok  = Serial.read();
      
  }
  int i;
  for (i = 0; i < sizeof(cycle_temp); i++) {
  Serial.print(cycle_temp[i]);
  }
  i = 0;
 
  while(time_ok == 0){
  time_ok = Serial.read();  
  }

  for (i = 0; i < sizeof(cycle_time); i++) {
  Serial.print(cycle_time[i]);
  }
  delay(100);
  Serial.print("Finished");
  
}
void test_mode(){
  
  Serial.begin(9600);
  Serial.print("Entered test_mode");

  if (softser.read()=="heat"){
    Serial.print("heat");
  }
  if (softser.read()=="cool"){
    Serial.print("cool"); 
   }
  if (softser.read()=="pwm_fan"){
    Serial.print("pwm_fan");
    Serial.print(softser.read());
   }else if(softser.read()=="pwm_heat"){
    Serial.print("pwm_heat");
    Serial.print(softser.read()); 
   }
  
  
  
  
  
}

Ich nutze die offizelle Itea Nextion Libary

home.PNG

test.PNG

Die serielle Einlese-Routine ist Unsinn. read() liest nur ein Zeichen ein.

strcmp() liefert übrigens bei Gleichheit 0. Nicht true

Bei sowas fragt man am besten auf ein Endzeichen wie LF oder CR am Ende der seriellen Übertragung ab:

const int SERIAL_BUFFER_SIZE = 30;
char serialBuffer[SERIAL_BUFFER_SIZE];

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

void loop()
{
  if (readSerial(Serial) == true)
  {
    if (strcasecmp(serialBuffer, "Test") == 0)
    {
      Serial.println(F("Ok"));
    }
    else
    {
      Serial.println(F("Unbekanntes Kommando"));
    }
  }
}

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;
      return true;
    }
  }
  return false;
}

Ansonsten gibt es in der Serial Library noch blockierende Funktionen um C Strings oder Arduino Strings einzulesen. Aber dazu solltest du unbedingt die Timeout Zeit gewaltig nach unten setzen. Die ist standardmäßig 1 Sekunde was viel zu lange ist. Siehe Doku.

Der Abschluß der seriellen Zeichenketten ist in beide Richtungen immer 3 mal 0xFF.
Hier gibt es ein gutes Tutorial.

Gruß Tommy

Tommy56:
Der Abschluß der seriellen Zeichenketten ist in beide Richtungen immer 3 mal 0xFF.

Ok, dann geht das oben so direkt nicht um Strings vom Display zu empfangen. Aber man kann auch sehr einfach abfragen ob dreimal 0xFF kommt (eine Variable inkrementieren und fragen ob sie 3 ist). Und dann zur Auswertung übergehen.

Es geht eher ums Prinzip nicht-blockierend in ein Array einzulesen.

Wenn ich im DIsplay den Befehel : print"heat"
mache bekomme ich über serial ganz normal heat ausgegeben.
Mach ich jedoch den hacken bei send component id oder print temp.val
kommt irgendein völlig schwachsininge zeichenkette raus