Hallo,
Ich arbeite derzeit an einem Cocktailautomaten. Als Interface habe ich mich für ein Nextion NX8048K070_011C entschieden.
Dieses soll durch das Menü führen und bei Cocktailauswahl die Variable "drink" im Mega ändern. Der Mega steuert dann die entsprechenden Pumpen für die Zutaten an und sendet per I2C ein Signal an einen ProMini, der einen WS2812B Strip ansteuert.
Nun funktioniert eigentlich alles, das Display steuert den Mega an, der wiederum den ProMini und der den Strip.
Das Problem was ich habe ist, dass das Display sehr träge ist, was das ändern der Variablen betrifft. Manchmal funktioniert es direkt bei drück und loslassen, manchmal erst nach fünf bis 10mal...
Ich weiss leider nicht woran das liegt und frage deshalb hier. Baud von Display und Mega sind 9600.
Die Methode Communication(char) gibt hierbei an, welche Farbe an den ProMini gesendet wird und ist in einem anderen Tab definiert.
Code Nextion und Setup:
short drink = 0;
short orderbtn = 1;
// short checkcooling = 0;
//TFT Display
NexButton p1_b0 = NexButton(1,3,"b0");
NexButton p1_b1 = NexButton(1,4,"b1");
NexTouch *nex_listen_list[] = {
&p1_b0,
&p1_b1,
NULL
};
void p1_b0_release(void *ptr) {
drink = 1;
}
void p1_b1_release(void *ptr) {
drink = 0;
}
void setup() {
Serial.begin(9600);
Wire.begin();
nexInit();
p1_b0.attachPop(p1_b0_release, &p1_b0);
p1_b1.attachPop(p1_b1_release, &p1_b1);
}
//Code loop:
void loop() {
nexLoop(nex_listen_list);
if (true) { //while Endschalter des Gehäuses ist geschlossen
if (orderbtn == 1) { //wenn Order ausgeloest wurde
//drinklist(); //gewaehlten Drink abfragen und herstellen
Serial.println(drink);
if(drink == 1) {
Communication('s');
}
else if(drink == 0){
Communication('g');
}
Serial.println(drink);
}
}
while (0 == 1) { // Automat offen
}
}
//Communication Methode:
void Communication(char LEDstate) {
Wire.beginTransmission(8);
Wire.write(LEDstate);
Wire.endTransmission();
}
Ich habe ein bisschen rumprobiert und mir einfach mal den ankommenden Wert vom Nextion in einer Variable speichern lassen und die ausgegeben. Dabei habe ich auch den Fehler entdeckt: das Nextion sendet nicht di button ID oder den Befehl dem man ihn eingibt (z.B print 0 oder print 1) sondern auch andere, willkürliche Zahlen. So hatte ich: 0, dann 1, dann 32, dann 54, dann 127, dann 1, dann 2, dann mal 0 und soweiter. Die Werte die nicht 0 und nicht 1 sind, mit denen konnte der Mega natürlich nix anfangen.
Weiss jemand, warum oder wie diese Werte zustande kommen?
Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.
Schau Dir mal das Tutorial zum Nextion an. Diese Zeichen sind Bestandteil des Übertragungsprotokolls.
Weiterführende Infos gibt es beim Hersteller.
Gruß Tommy
vincenthaude:
Weiss jemand, warum oder wie diese Werte zustande kommen?
Wahrscheinlich, weil du etwas falsch machst.
Leider ist dein Sketch so nicht richtig zu lesen.
Wie Tommy schon geschrieben hat, setze den in Code-Tags, dann ist er auch lesbar.
Was man aber erkennen kann, der ist nicht vollständig. Somit fällt die Hilfe schwer.
Ich sehe keine Verbindung zum Nextion.
Tommy56:
Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.
Schau Dir mal das Tutorial zum Nextion an. Diese Zeichen sind Bestandteil des Übertragungsprotokolls.
Weiterführende Infos gibt es beim Hersteller.
Gruß Tommy
Hallo,
danke für die Links.
Ich mache es so, dass ich nur den seriellen Port auswerte, das müsste doch auch gehen oder nicht?
PS.: hoffe das haut so hin mit den Code Tags
Das solltest Du doch selbst sehen können, dass das nicht hinhaut.
Korrigiere das bitte.
Gruß Tommy
Wer lesen kann ist klar im Vorteil. 
Sieh dir doch mal deine Code-Tags an und vergleiche die mit Tommys Beispiel.
In deinem Sketch kann ich nicht erkennen, wo du Daten von der seriellen in dein Nextion übergibst.
Also wie soll das funktionieren ?
HotSystems:
Wer lesen kann ist klar im Vorteil. 
Sieh dir doch mal deine Code-Tags an und vergleiche die mit Tommys Beispiel.
In deinem Sketch kann ich nicht erkennen, wo du Daten von der seriellen in dein Nextion übergibst.
Also wie soll das funktionieren ?
Der Nextion bekommt nichts über die serielle. Er gibt etwas in die serielle rein und der Mega liest es aus.
Beispiel:
Der Drink PinaColada wurde gewählt. Der Nextion übergibt an den Mega über serielle Schnittstelle eine "1". Der Mega empfängt diese und weiss nun, dass ein PinaColada geordert wurde, weil ihm vorher gesagt wurde, dass die 1 für PinaColada steht.
Wie gesagt manchmal kommt die "1" ja auch an, oftmals jedoch leider nicht.
Ich habe das ganze jetzt mal ohne library wiefolgt aufgebaut, das Ergebnis bleibt leider das gleiche....
Vor der Setup-Schleife:
void Display() {
if (Serial2.available() > 0) {
String Received = Serial2.readString();
drink = int (Received[0]);
}
}
Innerhalb der Loopschleife:
void loop() {
Display();
Serial.println(drink);
drinklist(); //gewaehlten Drink abfragen und herstellen + LED ansteuern
}
die drinklist-Funktion:
void drinklist() {
switch (drink) {
case 0: sendCommand("page 0"); break;
case 1: Communication('s'); Pina_Colada(); break;
case 2: Communication('f'); Tequila_Sunrise(); break;
case 3: Communication('g'); Sex_on_the_Beach(); break;
case 4: Communication('s'); Seabreeze_(); break;
case 5: Communication('s'); Caipirinha_(); break;
case 6: Communication('s'); Margarita_(); break;
case 7: Communication('s'); Mojito_(); break;
case 8: Communication('s'); Daiquiri_(); break;
case 9: Communication('s'); Cinderella_(); break;
case 10: Communication('s'); Erdbeer_Daiquiri(); break;
case 11: Communication('s'); Swimmingpool_(); break;
case 12: Communication('s'); Zombie_(); break;
case 13: Communication('s'); Bahama_Mama(); break;
case 14: Communication('s'); Cosmopolitan_(); break;
case 15: Communication('s'); Long_Island_Iced_Tea(); break;
case 16: Communication('s'); Mai_Tai(); break;
}
}
Drinklist reagiert quasi einfach auf einen bestimmten Wert der Variable drink. Zum Einen werden dann per "Communication('s');" die LEDs auf eine bestimmte Farbe eingestellt, zum Anderen der Drink zubereitet.
Dein Codefragment zeigt, dass Du Dir das von mir verlinkte Tutorial nicht angeschaut oder es nicht verstanden hast.
Wie bildest Du denn aus der Betätigung der "Taste" auf dem Nextion den zu sendenden Wert '1'?
Da gibt es mehrere Möglichkeiten, die alle etwas anderes tun, als nur '1' zu senden.
Gib Dir doch einfach mal alles, was vom Nextion kommt als HEX auf Serial aus:
if (Serial2.available() > 0) {
char c = Serial2.read();
Serial.println(c,HEX);
Die Verwendung von String solltest Du auf dem Arduino abgewöhnen.
Gruß Tommy
vincenthaude:
.....
Wie gesagt manchmal kommt die "1" ja auch an, oftmals jedoch leider nicht.
void Display() {
if (Serial2.available() > 0) {
String Received = Serial2.readString();
drink = int (Received[0]);
}
}
Ja, so einfach geht das nicht. So liest du immer nur ein Zeichen von der seriellen.
Du musst die in einer Schleife auslesen, damit du den kompletten String empfängst.
readString() liest schon eine komplette Zeile an. Ist allerdings blockierend. Besser ist readStringUntil() und ein Linefeed als Endzeichen, oder die char Array Version readBytesUntil()
Was nicht so einfach geht ist die Konvertierung mit einem Cast. Das ist auch von man mit der String Klasse ganz schnell am Ende ist, da die bei Konvertierung und Parsen versagt. Mit char Arrays gibt es da zahlreiche Optionen.
Wobei es auch generell Unsinn ist ein Zeichen rauszunehmen, das auf int zu casten und dann wieder als char zu behandeln. Da kann man auch gleich das machen:
switch (Received[0])