Steuerung eines AirHockey Tisch, Probleme bei Kommunikation mit Nextion Display

Hallo liebe Community,

vorab muss ich kurz erwähnen, dass wir keinerlei Erfahrung mit dem Programmieren haben und der komplette Code quasi nur durch das anschauen von YouTube Tutorials entstanden ist, es ist also wahrscheinlich sehr fehlerbehaftet und alles andere als optimal.

Also; wir haben folgendes Problem:
Wir haben als Projekt selbst einen AirHockey Tisch gebaut. Der Grundrahmen besteht aus item-Aluleisten, die Verkleidung aus Kunststoffplatten und die Spielplatte haben wir uns bohren lassen. Als Lüfter nutzen wir einfach ein Ersatzteil von einem kaufbaren AirHockey Tisch.
Zur Bedienung und zur Anzeige des Spielstandes nutzen wir ein Touch Display von Nextion (NX8048T070_011) und zur Steuerung nutzen wir einen Controllino Mini. Die Tore sollen erkannt und gezählt werden durch 2 Lichtschranken.

Jetzt zu unserem Problem; wir wollen die EasyNextionLibrary nutzen für die Kommunikation zwischen Display und Controllino. Ich lade euch Fotos von der Oberfläche für das Nextion hoch.
(Es gibt noch eine page0, auf dieser ist aber nur ein "Start" Button, welcher im Programm nicht verwendet wird und ich kann hier nur 3 Bilder hochladen).

Man soll auswählen können zwischen "Punktespiel", bei dem gespielt wird bis jemand 10 Punkte erreicht und dem "Zeitspiel", bei dem 5 Minuten gespielt wird. Jeder Button schickt einen vordefinierten Code über die Serielle Schnittstelle, welcher für einen bestimmten Trigger steht, der am Controllino dann verwendet werden kann, um den dazugehörigen Code auszuführen (wenn ich das richtig verstanden habe). Startet man ein Spiel, soll der Lüfter anlaufen (dieser ist mit dem Relais an Pin D3 verbunden und wurde auch auf Funktion getestet) und wieder stoppen, wenn entweder die 10 Punkte im Punktemodus erreicht sind oder die 5 Minuten im Zeitmodus abeglaufen sind. Außerdem gibt es noch auf jeder Seite einen "Reset" Button, dieser soll Punktzahl und Zeit zurücksetzen. Zum Erkennen der Tore werden Lichtschranken verwendet, im Programm nutzen wir die Bounce2 Bibliothek für die Lichtschranken, dass immer nur einmal gezählt wird beim Flankenwechsel. Die Lichtschranken funktionieren auch und die Signale kommen am Controllino an den richtigen Pins an.
Unser Problem ist, dass der Controllino und das Nextion wohl nicht miteinander kommunizieren. Wenn man am Display die Buttons drückt, passiert nichts, der Lüfter läuft nicht an und die Punktzahl wird auch nicht auf das Display geschrieben. Wir haben testweise ein Programm auf den Controllino geladen, welches einfach nur den Lüfter einschaltet, das funktioniert problemlos.

Hier ist das ganze Programm:`

#include <Nextion.h>
#include <SPI.h>
#include <Controllino.h>
#include <EasyNextionLibrary.h>
#include <trigger.h>
#include <Bounce2.h>


int lsredPin = CONTROLLINO_D5;
int lsbluePin = CONTROLLINO_D4;
int scorered = 0;
int scoreblue = 0;
int timer = 0;
Bounce entpreller = Bounce();
Bounce2::Button entprellerred = Bounce2::Button();
Bounce2::Button entprellerblue = Bounce2::Button();


EasyNex myNex(Serial);

void setup() {

  pinMode(CONTROLLINO_D3, OUTPUT);
  pinMode(lsredPin, INPUT);
  entprellerred.attach(lsredPin);
  entprellerred.interval(5);
  entprellerred.setPressedState(LOW);
  pinMode(lsbluePin, INPUT);
  entprellerblue.attach(lsbluePin);
  entprellerblue.interval(5);
  entprellerblue.setPressedState(LOW);
  myNex.begin(9600);
}

void loop() {
  myNex.NextionListen();  // This function must be called repeatedly to response touch events
                          // from Nextion touch panel. Actually, you should place it in your loop function.
}

void trigger1() {

  if (scorered <= 9 and scoreblue <= 9) {
    digitalWrite(CONTROLLINO_D3, HIGH);
  }

  entprellerred.update();
  if (entprellerred.pressed() & scorered <= 9) {
    scorered++;
    myNex.writeNum("n4.val=", scorered);

    if (scorered == 10) {
      digitalWrite(CONTROLLINO_D3, LOW);
    }
  }


  entprellerblue.update();
  if (entprellerblue.pressed() & scoreblue <= 9) {
    scoreblue++;
    myNex.writeNum("n5.val=", scoreblue);

    if (scoreblue == 10) {
      digitalWrite(CONTROLLINO_D3, LOW);
    }
  }
}

void trigger2() {

  timer++;
  delay(1000);
  if (timer <= 10) {
    digitalWrite(CONTROLLINO_D3, HIGH);
  } else {
    digitalWrite(CONTROLLINO_D3, LOW);
  }

  entprellerred.update();
  if (entprellerred.pressed()) {
    scorered++;
    myNex.writeNum("n4.val=", scorered);
  }


  entprellerblue.update();
  if (entprellerblue.pressed()) {
    scoreblue++;
    myNex.writeNum("n5.val=", scoreblue);
  }
}


void trigger3() {
  digitalWrite(CONTROLLINO_D3, LOW);
  scorered = 0;
  scoreblue = 0;
  timer = 0;
}

void trigger4() {
  digitalWrite(CONTROLLINO_D3, LOW);
  scorered = 0;
  scoreblue = 0;
  timer = 0;
}

void trigger5() {
  digitalWrite(CONTROLLINO_D3, LOW);
  scorered = 0;
  scoreblue = 0;
  timer = 0;
}

void trigger6() {
  digitalWrite(CONTROLLINO_D3, LOW);
  scorered = 0;
  scoreblue = 0;
  timer = 0;
}

`

Wir sind leider mit unserm Latein am Ende und wissen nicht, wie wir das ganzen ans Laufen bekommen und sind offen für Tipps aller Art.

Schonmal vielen Dank im Vorraus!

Mein Tipp:
Baue zuvor ein Beispiel aus der Nextion-Library auf, damit du die Kommunikation zwischen dem Nextion und Arduino lernst. Dazu musst du auch serielle Ausgaben auf den seriellen Monitor einbauen, um zu erkennen, was da abläuft.
Und verwende für die Kommunikation zum Nextion eine andere UART (serielle Schnittstelle) als zu m debuggen.

Wenn das funktioniert, dann kannst du das um deine Spielefunktionen erweitern.

Ich kann nicht verstehen, wie jemand bei dem Programm irgendeine Aktion erwartet.

Ich bezweifle, dass die EasyNextionLibrary so easy ist.

Bounce funktioniert besser, wenn die update Funktion aufgerufen wird.

Wer ruft die ganzen triggerX Funktionen auf?

Ich würde auch empfehlen, keine Library für das Display zu verwenden.

Senden zum Display ist (fast) trivial, die API ist hier aufgeschrieben.
Beim Empfangen kommt es darauf an, was ihr vom Nextion aus schicken lasst; es hängt also von Eurer Programmierung des Displays ab. Die Bytefolge auf den Button-Press kann man sich im Nextion-Editor im Simulationsmodus leicht anschauen.

Wenn die "Easy" Lib diese hier ist, die ich auf die Schnelle gefunden habe:
Die listen()-Methode erwartet als erstes Zeichen #; der Kollege fährt da ein eigenes Protokoll, das natürlich vom Display unterstützt werden muss:

    while(_start_char != '#'){            
      _start_char = _serial->read();        // whille the start_char is not the start command symbol 
                                           //  read the serial (when we read the serial the byte is deleted from the Serial buffer)
      if((millis() - _tmr1) > 100UL){     //   Waiting... But not forever...... 
        break;                            
      }   
    }

Wow ! Da habt ihr euch ja was vorgenommen.
Man bekommt hier Hilfe. Wie umfangreich die Hilfe sein wird hängt im wesentlichen davon ab,
ob die anderen User erkennen können, dass ihr selbst dazu lernt.

Konjunktiv:
Wenn das so ablaufen würde:
Jemand schreibt euch einen Programmteil ihr probiert das auf eurer Hardware aus und als Antwort kommt dann nur
"funktioniert nicht" Ende der Mitteilung

Dann würde sich die Hilfe schnell auf posten von Links wo ihr das selber nachlesen könnt beschränken.

Viel bessere Hilfe - wenn es sein muss auf hunderte Fragen - bekommt ihr wenn die anderen User erkennen können das ihr programmieren lernt.

Das erkennt man einfach daran dass ihr eine neue wenigstens leicht erweiterte Programmfunktion postet und dann eine konkrete Frage dazu stellt.

Ich empfehle auch auf die EasyNection library zu verzichten.
Man muss zuerst die Namen und die Syntax der ganzen functions dieser library lernen bevor man das vernünftig benutzen kann.

Man kann die Daten die auf den jeweiligen Bildschirm-Touch gesendet werden im Nextion-Editor auch selbst festlegen und dann entsprechend auswerten.

Jetzt von dieser Stelle aus weiter zu programmieren würde bedeuten ca. 50 bis 100 Stunden Grundlagen lernen und dann erst weiter programmieren zu können.

Es wird einfacher wenn ihr als ersten Schritt ein viiiiel einfacheres Testprogramm, mit dem man das Prinzip der Kommunikation zwischen Nextion und Controllino kennenlernt benutzt.

So als nächstes wird von euch ist ein Stück Engagement erwartet.

Aufgabe: 30 Minuten googeln - Das ist ja wohl nicht zu viel verlangt -
nach Nextion-Display Kommunikation
Auch auf englisch. Wenn ihr wenig englisch könnt google-translate benutzen.

Dann die Fundstellen hier präsentieren und konkrete Fragen dazu stellen.
An der Konkretheit der Fragen kann man erkennen ob ihr euch wirklich damit auseinander gesetzt habt oder nur so tut als ob.

Schöne Grüße
Stefan

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.