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!