Ich würde gerne vom Arduino aus per Taster die Nextion Seiten umschalten (Enhanced NX4832K035).
Als Basis habe ich mal das StateChangeDetection Beispiel aus der IDE versucht, und um einen 2.Taster erweitert.
Hab da schon einiges probiert wie zB das zufügen von Serial.print("page 2"); - leider aber ohne Erfolg.
Was fehlt dem Sketch noch um damit die Nextion Seiten umschalten zu können?
const int buttonPin1 = 2; // the pin that the pushbutton is attached to
const int buttonPin2 = 3;
//const int ledPin = 13; // LED PIN Nr
int buttonPushCounter = 0; // counter for the number of button presses
int buttonState1 = 0; // current state of the button
int lastButtonState1 = 0; // previous state of the button
int buttonState2 = 0; // current state of the button
int lastButtonState2 = 0; // previous state of the button
void setup() {
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
// pinMode(ledPin, OUTPUT);
Serial.begin(115200);
}
void loop() {
buttonState1 = digitalRead(buttonPin1);
if (buttonState1 != lastButtonState1) {
if (buttonState1 == HIGH) {
buttonPushCounter++;
Serial.println("on"); // Taste = gedrückt
Serial.print("buttonPushCounter: ");
Serial.println(buttonPushCounter); // druckt Anzahl der Tastendrücke
}
else {
Serial.println("off"); // Taste = losgelassen
}
}
lastButtonState1 = buttonState1;
buttonState2 = digitalRead(buttonPin2);
if (buttonState2 != lastButtonState2) {
if (buttonState2 == LOW) {
buttonPushCounter--;
Serial.println("off"); // Taste = losgelassen
Serial.print("buttonPushCounter: ");
Serial.println(buttonPushCounter); // druckt Anzahl der Tastendrücke
}
else {
Serial.println("on"); // Taste = gedrückt
}
}
lastButtonState2 = buttonState2;
}
Wenn ich den Sketch jeweils mit
Serial.print("page 2");
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
ergänze, wird keine Seite umgeschaltet.
im Seriellen Monitor kann ich sehen das die Taster hoch und runter gezählt werden. Irgendwas fehlt da wohl noch...
Vielleicht hat hier jemand den entscheidenden Tipp - oder einen besseren / einfacheren Vorschlag zum umschalten der Seiten?
Nextion läuft Seriel über RX TX.
Arduino ist ein UNO.
Die Baudraten stehen bei beiden auf 115200, der verwendete COM Port auch.
EIne RX TX Vertauschung zwischen UNO und Nextion kann ich ausschließen da andere
Projekte mit identischer Verkabelung funktionieren.
Taster kann ich leider nicht direkt ans Nextion anschliessen - da fehlt mir der passende Adapter - daher der "Tasterumweg" über den UNO...
Debug über serielle Verbindung zum PC, sowie das Hochladen neuer Sketches erscheint mir problematisch, wenn man das Nextion an die USB Serielle hängt,
auf einem UNO wäre u.U. Soft-Serial (mit 19200 Baud) sinnvoll.
Noch sinnvoller wäre der Einsatz eines Ardunios mit zwei physikalischen seriellen Schnittstellen.
Ich wechsle die Seiten zumeist über Buttons oder Hotspots.
beim debuggen oder hochladen auf den UNO ist die Verbindung zum Nextion natürlich getrennt...
ich hatte das Nextion auch schon mit Softserial (9600) angeschlossen - muss ich nochmal zusammen mit den Tastern am UNO testen.
Seitenwechsel auf dem Nextion mache ich auch problemlos über Buttons oder Hotspots.
Ich brauche aber genau die andere Richtung: per Taster die Seiten am Nextion weiterschalten.
Könnt Ihr mal einen genaueren Blick auf den Sketch werfen ?
Der lässt sich zwar kompilieren - bedeutet aber nicht zwingend das dass dann auch wie gewünscht funktioniert...
Die gewünschte Grundfunktion, zumindest was das weiterschalten bzw up / down schalten per Taster betrifft hat der Code ja schon.
Mit "buttonPushCounter" wird aber so nur die Anzahl der Tastendrücke ausgegeben...
Die Frage ist wie sich das weiterschalten der Seiten per Arduino Taster da zusätzlich integrieren lässt?
Wenn ich direkt nach buttonPushCounter++
Serial.print("page 2");
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
schreibe,
und nach nach buttonPushCounter--
Serial.print("page 8");
verwende, kann ich zummindest zwischen diesen beiden Seiten umschalten.
Das gewünschte weiterschalten bzw durch steppen der Nextion Seiten nach dem Motto page++ geht so aber leider nicht...
Sorry, hatte das falsch verstanden.
Der Tipp von wno158 sollte funktionieren. Du musst dabei nur das Leerzeichen zwischen "page " und dem Counter berücksichtigen.
Bis aufs noch fehlende entprellen funktionierts so weit - Vielen Dank !
Sketch:
const int buttonPin1 = 2; // the pin that the pushbutton is attached to
const int buttonPin2 = 3;
uint8_t pageCounter = 0; // Seiten Zähler
int buttonPushCounter = 0; // counter for the number of button presses
int buttonState1 = 0; // current state of the button
int lastButtonState1 = 0; // previous state of the button
int buttonState2 = 0; // current state of the button
int lastButtonState2 = 0; // previous state of the button
void setup() {
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
Serial.begin(115200);
}
void loop() {
buttonState1 = digitalRead(buttonPin1);
if (buttonState1 != lastButtonState1) {
if (buttonState1 == HIGH) {
pageCounter++;
Serial.print("page ");
Serial.print(pageCounter);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
}
lastButtonState1 = buttonState1;
buttonState2 = digitalRead(buttonPin2);
if (buttonState2 != lastButtonState2) {
if (buttonState2 == LOW) {
pageCounter--;
Serial.print("page ");
Serial.print(pageCounter);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
lastButtonState2 = buttonState2;
}
}
Eine Kleinigkeit ist mir noch aufgefallen:
Ich muss offenbar noch die Laufweite des Zählers begrenzen bzw an die Menge der Seiten anpassen damit die Tastendrücke nicht ins leere laufen.
Kann sonst passieren wenn man auf der letzten Seite noch zB 5mal auf "Up" klickt, das
die Down Funktion eben erst diese 5 Klicks benötigt um wieder eine Seite zurück zu schalten...
Das hier funktioniert leider so nicht:
if (pageCounter > 0 || pageCounter < 30);
pageCounter++;
if (pageCounter < 30 || pageCounter >0);
pageCounter--;
Da das ein uint8_t ist, führt -- immer auf den Wert 255. Negativ kann der Zähler nicht werden.
Wenn er also im Kreise herumlaufen soll und es auch eine page 0 gibt, geht für die Abfrage nach Inkrement:
const int buttonPin1 = 2; // the pin that the pushbutton is attached to
const int buttonPin2 = 3;
uint8_t pageCounter = 0; // Seiten Zähler
uint8_t numberOfPages = 0;
int buttonPushCounter = 0; // counter for the number of button presses
int buttonState1 = 0; // current state of the button
int lastButtonState1 = 0; // previous state of the button
int buttonState2 = 0; // current state of the button
int lastButtonState2 = 0; // previous state of the button
void setup() {
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
Serial.begin(115200);
}
void loop() {
buttonState1 = digitalRead(buttonPin1);
if (buttonState1 != lastButtonState1) {
if (buttonState1 == HIGH) {
pageCounter++;
pageCounter = pageCounter <= numberOfPages ? 0 : pageCounter;
Serial.print("page ");
Serial.print(pageCounter);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
}
lastButtonState1 = buttonState1;
buttonState2 = digitalRead(buttonPin2);
if (buttonState2 != lastButtonState2) {
if (buttonState2 == LOW) {
pageCounter--;
pageCounter = pageCounter <= numberOfPages ? 30 : pageCounter;
Serial.print("page ");
Serial.print(pageCounter);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
lastButtonState2 = buttonState2;
}
}
Das nextion hat bei meinem Projekt inzwischen 30 Seiten...
Durchsteppen der Seiten funktioniert jetzt bis auf ne Kleinigkeit:
Ich hab immer noch den Effekt wenn ich nach Seite 30 zB 10 mal weiterklicke das die Down Funktion erst wieder nach diesen 10 Klicks greift...
das ist auch meine Vermutung.
Lässt sich das ganze nicht nach dem Endlos Encoder Prinzip einstellen ?
zB:
Bei Up folgt nach Seite 30 wieder die Seite 0, bei Down folgt nach Seite 0 wieder Seite 30 ?
Dann dürfte die Sendequeue doch eigentlich kein Problem mehr haben ...
Hab das schon mit den verschiedensten Kombinationen nach lastButtonState erfolglos probiert, zB:
if (numberOfPages >= 30)
numberOfPages == 0;
if (numberOfPages == 0)
numberOfPages == 30;
kann eigentlich nicht so schwer sein - steh da nur gerade aufm Schlauch...
Du könntest neue page Befehle unterdrücken, wenn der serielle Puffer noch etwas enthält,
und dann später direkt eine unter Umständen höhere Seite anfordern.
Ich glaube, da sind mehrere Kinken drin und brauche noch mehr Informationen:
Wie sind die Seiten nummeriert? 0...29 oder 1...30?
Soll beim Überlauf das jeweils andere Ende angezeigt werden (hoch: 29 -> 0, runter: 0 -> 29)?
Ist der Button 2 (LOW) anders aktiv als Button 1 (HIGH)?
Der Code ist irgendwie unvollständig. buttonPushCounter wird gar nicht verwendet.
Problem Nr 1:
uint8_t numberOfPages = 0;
Das sollte erstens ein const sein und zweitens (viel Wichtiger) den Wert 30 haben (wenn denn das HMI auf dem Nextion 30 Seiten hat).
Im Code aus #13 wird das auf 0 gesetzt und nie verändert - nur zum Vergleich herangezogen.
Nr. 2 sehe ich hier: Zeile 34/35 sollten vertauscht werden - so wie es jetzt ist, wird lastButtonState1 in jeder loop gesetzt.
lastButtonState1 = buttonState1;
}
Nr. 3 sind die Bedingungen.
Vielleicht besser, die auszuformulieren. Dabei habe ich numberOfPages entsorgt.
constexpr uint8_t minPage {0}; // hier ggf. ändern auf 1
constexpr uint8_t maxPage {29}; // hier ggf. ändern auf 30
Hi wno158,
erstmal vielen Dank für Deine Unterstützung !
die Nextion Seiten sind mit 0 bis 30 durch nummeriert, - sind also insgesamt sogar 31 Seiten.
Beim Überlauf soll jeweils das andere Ende angezeigt werden.
Button 1 + 2 sollen beide HIGH aktiv sein - habs gerade gesehen...
buttonPushCounter stammt noch aus dem StateChangeDetection Beispiel aus der IDE,
das ich als Basis genommen hatte.
nochmal vielen Dank - hätte ich ohne Deine Hilfe nicht hinbekommen !
Muss mich jetzt dringend noch ums Entprellen der Taster kümmern...
Vielleicht hast Du da auch nen guten Tipp ?
hier mal der aktuelle, bis aufs Entprellen funktionierende Sketch:
const int buttonPin1 = 2; // the pin that the pushbutton is attached to
const int buttonPin2 = 3;
uint8_t pageCounter = 0; // Seiten Zähler
constexpr uint8_t minPage {1}; // hier ggf. ändern auf 1
constexpr uint8_t maxPage {30}; // hier ggf. ändern auf 30
//int buttonPushCounter = 0; // counter for the number of button presses
int buttonState1 = 0; // current state of the button
int lastButtonState1 = 0; // previous state of the button
int buttonState2 = 0; // current state of the button
int lastButtonState2 = 0; // previous state of the button
void setup() {
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
Serial.begin(115200);
}
void loop() {
buttonState1 = digitalRead(buttonPin1);
if (buttonState1 != lastButtonState1) {
if (buttonState1 == HIGH) {
if (pageCounter == maxPage) {
pageCounter = minPage;
}
else {
pageCounter++;
}
Serial.print("page ");
Serial.print(pageCounter);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
lastButtonState1 = buttonState1;
}
buttonState2 = digitalRead(buttonPin2);
if (buttonState2 != lastButtonState2) {
if (buttonState2 == HIGH) {
if (pageCounter == minPage) {
pageCounter = maxPage;
}
else {
pageCounter--;
}
Serial.print("page ");
Serial.print(pageCounter);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
lastButtonState2 = buttonState2;
}
}
hatte noch versucht lastButtonState1 = buttonState1; wie vonDir vorgeschlagen zu tauschen.
Funktioniert dann aber nicht mehr.