Nextion Display 3,5"

Moin Leute,

ich nutze an meiner Wetterstation (ca. 2000 Zeilen Code in 13 Tabs daher wirds schwer das richtige zu Posten) ein Nextion HMI 3,5" Display.

Jetzt bekomme ich im Code die Wetterdaten von 5 Funkstationen und will diese Daten auf dem Display ausgeben lassen.

Als Hilfe zum ersten inbetriebnehmen nutzte ich dieses Video hier.

In einem Tab für die Nextion funktionen hab ich folgendes stehen:

void nextionTemp()
{
  memset(buffer, 0, sizeof(buffer));
  itoa(t1, buffer, 10);
  tempDisplay1.setText(buffer);

  memset(buffer, 0, sizeof(buffer));
  itoa(t2, buffer, 10);
  tempDisplay2.setText(buffer);

  memset(buffer, 0, sizeof(buffer));
  itoa(t3, buffer, 10);
  tempDisplay3.setText(buffer);

  memset(buffer, 0, sizeof(buffer));
  itoa(t4, buffer, 10);
  tempDisplay4.setText(buffer);

  memset(buffer, 0, sizeof(buffer));
  itoa(t5, buffer, 10);
  tempDisplay5.setText(buffer);
}

void nextionHum()
{
  memset(buffer, 0, sizeof(buffer));
  itoa(h1, buffer, 10);
  humDisplay1.setText(buffer);

  memset(buffer, 0, sizeof(buffer));
  itoa(h2, buffer, 10);
  humDisplay2.setText(buffer);

  memset(buffer, 0, sizeof(buffer));
  itoa(h3, buffer, 10);
  humDisplay3.setText(buffer);

  memset(buffer, 0, sizeof(buffer));
  itoa(h4, buffer, 10);
  humDisplay4.setText(buffer);

  memset(buffer, 0, sizeof(buffer));
  itoa(h5, buffer, 10);
  humDisplay5.setText(buffer);
}

void buttonHomePushCallback(void *ptr)
{
  page1.show();
  nexPage = 2;
}

void buttonBackPushCallback(void *ptr)
{
  page0.show();
  nexPage = 1;
}

Zur definierung dieses

// Nextion
//--------------------------------------------------------------------------------------

NexPage page0 = NexPage(0, 0, "page0");
NexPage page1 = NexPage(1, 0, "page1");

// Erstellt ein Objekt (SeitenID: 0, ObjektID: 2, ObjektName: ""
NexText tempDisplay1 = NexText(0, 1, "tempDisplay1");
NexText tempDisplay2 = NexText(0, 2, "tempDisplay2");
NexText tempDisplay3 = NexText(0, 3, "tempDisplay3");
NexText tempDisplay4 = NexText(0, 4, "tempDisplay4");
NexText tempDisplay5 = NexText(0, 5, "tempDisplay5");

NexText humDisplay1 = NexText(0, 1, "humDisplay1");
NexText humDisplay2 = NexText(0, 2, "humDisplay2");
NexText humDisplay3 = NexText(0, 3, "humDisplay3");
NexText humDisplay4 = NexText(0, 4, "humDisplay4");
NexText humDisplay5 = NexText(0, 5, "humDisplay5");

NexButton buttonHome = NexButton(0, 26, "buttonHome");
NexButton buttonBack = NexButton(1, 2, "buttonBack");

int nexPage = 1;

char buffer[10] = {0};

NexTouch *nex_listen_list[] =
{
  &tempDisplay1,
  &tempDisplay2,
  &tempDisplay3,
  &tempDisplay4,
  &tempDisplay5,

  &humDisplay1,
  &humDisplay2,
  &humDisplay3,
  &humDisplay4,
  &humDisplay5,

  &buttonHome,
  &buttonBack,

  NULL
};

Der Loop sieht (gekürzt) wie folgt aus:

void loop()
{
  nexLoop(nex_listen_list);
  nextionTemp();
  nextionHum();
  recieve();
}

Bei recieve(); werden nur die Daten via Funk empfangen und in ints gesteckt.

Mein Problem ist folgendes:

Ich bin auf der Ersten Seite (page0) des Displays. Alle Daten werden korrekt angezeigt.

Wechsle ich jetzt auf page1 des Displays, "hängt" das Display und ich muss mehrfach auf "zurück" hämmern bevor überhaupt (wenn überhaupt) was passiert.

Meistens kommt dann nur noch ein Restart des Arduinos in frage.

Im Serial monitor bekomme ich auf Page0 "recvRetCommandFinished ok" zurück.

Auf page1 kommt dann permanent "recvRetCommandFinished err".

Kann mir jemand helfen?

Ich habe noch keine praktische Erfahrung mit dem Nextion, da ich mein 7" Enhanced erst ende Februar geschenkt bekomme :wink:

Da der Code nicht vollständig ist, muss ich an einigen Stellen raten.

Mir eins auf, das kann aber auch am unvollständigen Code liegen:

Ich vermisse die Zuweisung der Callbacks an die Buttonobjekte im setup (das ist nicht mit dabei, dort mal schauen, ob es C&P-Fehler gibt)

buttonHome.attachPop(buttonHomePopCallback, &buttonHome);
buttonBack.attachPop(buttonBackPopCallback, &buttonBack);

Das Ganze natürlich auch für die Anzeigeobjekte.

Musst Du nicht auch die Pages mit CallBacks versehen und diese in die Liste aufnehmen?

Gruß Tommy

Hey, klar.

Im setup ist natülrich

  nexInit();
  buttonHome.attachPush(buttonHomePushCallback);
  buttonBack.attachPush(buttonBackPushCallback);

Also ich denke ja das liegt irgendwie am part wo gesendet wird, weil sobald ich den Sendepart auskommentiere, läuft der Seitenwechsel perfekt ab.

Welchen Teil meinst Du mit Sendepart?

Gruß Tommy

Damit meine ich nextion();

  memset(buffer, 0, sizeof(buffer));
  itoa(t1, buffer, 10);

Die memset()s sind völlig überflüssig.

meisterQ:
Damit meine ich nextion();

Die sehe ich aber in Deinem Code nicht.

Gruß Tommy

Sorry Männer, nextionTemp() und nextionHum()

Dann schrittweise einzelne Bestandtreile wieder einkommentieren und schauen, wo es hängt.

Gruß Tommy

Hab ich gemacht. Sobald ich eins davon

memset(buffer, 0, sizeof(buffer));
  itoa(t1, buffer, 10);
  tempDisplay1.setText(buffer);

einkommentiere, funktioniert es nicht mehr.

Probier mal ohne Memset einen einfachen konstanten Text auszugeben, um einzugrenzen, wo es liegt.

also tempDisplay1.setText("1234");

und strcpy(buffer,"1234");
tempDisplay1.setText(buffer);

Wen das schon nicht geht ist die Anbindung der Textfelder falsch.
Dann probier mal, die Textfelder aus der Liste nex_listen_list raus zu nehmen, die senden ja eigentlich keine Daten vom Nextion, sondrn nur dort hin.

Alles Vermutungen aber einen Versuch ist es wert.

Gruß Tommy

Bei tempDisplay1.setText("1234"); und bei strcpy(buffer,"1234");
tempDisplay1.setText(buffer); ist der Seitenwechsel auch wieder eher zufall.

Bei der nex_listen_list hab ich auch alles bis auf

NexButton buttonHome = NexButton(0, 26, "buttonHome");
NexButton buttonBack = NexButton(1, 2, "buttonBack");

rausgenommen.

Selbes spiel.

Ich glaube nicht das die Anbindung falsch ist, da der Seitenwechsel ja einwandfrei funktioniert, sobald ich die Funktionen nextionTemp und nextionHum auskommentiere.

Dann habe ich auch keine Idee mehr, höchstens noch Fehler im HMI.

Gruß Tommy

Ich denke ja irgendwie, dass der Arduino meine Seitenwechsel commands irgendwie nicht richtig überträgt, weil der Serialport evtl mit den tempDisplay1.setText(buffer); überlastet ist.

Glaube ich eigenmtlich nicht. Die sollten nacheinander abgearbeitet werden.
Ich weiiß es aber nicht.
Wieso steuerst Du den Seitenwechsel vom Arduino? Mach das das doch vom Nextion aus.

Gruß Tommy

Hm. Wie funktioniert das mit dem wechsel direkt vom Display aus?

Hab ich in meinen Tutorials nicht gesehen.

Du kannst doch das Nextion intern auch programmieren. Es gibt hier ein deutsches Tutorial.

Wie gesagt, ich bin noch in der Theoriephase.

Gruß Tommy

Ach, jo, hast ja recht.

Einfach "page page0,1,2,3 etc" eingeben beim button bei usercode.

So funktioniert es wunderbar.

Was mich allerdings trotzdem etwas stört:

Wenn ich Serial debug enabled hab, kommt halt auf page 0, wo auch die Textfelder zum Anzeigen der Variablen sind, immer "recvRetCommandFinished ok". Wenn ich dann auf Page 1 wechsle, zeigt er mir immer "recvRetCommandFinished err" an. Das ist nicht auch irgendwie zu beseitigen?

Was hast du für ein Vorhaben mit dem Display?

Bis jetzt noch nichts bestimmtes. Es interessiert mich einfach von der technischen Seite.
Da wird schon noch was kommen.

Gruß Tommy

Wenn Du einen funktionierenden Stand hast, wäre es schön, wenn Du den Sketch und die HMI-Datei hier rein stellst. Das hilft bestimmt vielen weiter.

Gruß Tommy