Arduino-Nextion-externer Taster

Hallo Leute, kann mir bitte jemand einen Tipp geben, wie ich mit der Schaltfläche eines Nextion und einem externen Taster den gleichen Ausgang ansprechen kann? Ist sicher ganz einfach, ich bin aber absoluter Anfänger und finde nicht den richtigen Ansatz, es funktioniert nur immer eine Variante.

/*
  Anlage mit 4 Motoren, welche durch Umpolung
  ihre Drehrichtung ändern,
  es werden pro Motor also 2 Relais benötigt
  Die Korrekturbewegung wird stets durch Heben erzielt und Plattform nach erfolgter Ausrichtung abgesenkt.
  An der Plattform ist ein weiteter Wippschalter verbaut, welcher das Heben und Senken einer Rampe ermöglicht.

  In einer 2. Entwicklungsstufe soll ein Gyrosensor die Werte für ein automatisches Ausrichten liefern.

  Bezeichnung der Button auf dem Nextion

    senken/heben
        al-heb1  an
        al-heb0  aus

        al-senk1
        al-senk0

    kippen nach rechts und links (rollen)
        re-kipp1
        re-kipp0

        li-kipp1
        li-kipp0
    Kippen nach vorn und nach hinten (nicken)
        vorkipp1
        vorkipp0

        ruekipp1
        ruekipp0

    Kopfteil neigen
        Kopfheb1
        Kopfheb0

        Kopfauf1
        Kopfab0

   Ausgänge
    Relais Hauptrahmen
        vorn
            rechtes
                Rechtslauf   D27
                Linkslauf     D29
            links
                Rechtslauf  D31
                Linkslauf     D33
        hinten
            rechtes
                Rechtslauf  D35
                Linkslauf     D37
            links
                Rechtslauf  D39
                Linkslauf     D41

    Relais Rampe
        Rechtslauf             D43
        Linkslauf                  D45
*/
#include <SoftwareSerial.h>

SoftwareSerial nextion(10, 11); // RX, TX

String daten_display = "";

void setup() {
  Serial.begin(9600);
  nextion.begin(9600);

  pinMode( 27 , OUTPUT);//vorn rechts heben
  pinMode( 29 , OUTPUT);//vorn rechts senken
  pinMode( 31 , OUTPUT);//vorn links heben
  pinMode( 33 , OUTPUT);//vorn links senken
  pinMode( 35 , OUTPUT);//hinten rechts heben
  pinMode( 37 , OUTPUT);//hinten rechts senken
  pinMode( 39 , OUTPUT);//hinten links heben
  pinMode( 41 , OUTPUT);//hinten links senken
  pinMode( 43 , OUTPUT);//Kopfteil heben
  pinMode( 45 , OUTPUT);//Kopfteil senken

  pinMode(7, INPUT);//INPUT_PULLUP
  pinMode(8, INPUT);

  Serial.begin(9600);
  nextion.begin(9600);
}
void loop()
{

  if (nextion.available() > 0)
  {
    daten_display += char (nextion.read());

  }
  // alles heben
  if (daten_display == "al-heb1") {
    Serial.println("alles-heben on");
    delay(10);                        // nur 10ms oder 100
    digitalWrite(27, HIGH);
    digitalWrite(31, HIGH);
    digitalWrite(35, HIGH);
    digitalWrite(39, HIGH);
    // delay(10);                        // ev. um die Datenübertragung zu stabilisieren
    daten_display = "";
    // delay(10);                        // ev. um die Datenübertragung zu stabilisieren
  }

  if (daten_display == "al-heb0") {
    Serial.println("alles-heben off");
    delay(10);
    digitalWrite(27, LOW);
    digitalWrite(31, LOW);
    digitalWrite(35, LOW);
    digitalWrite(39, LOW);
    daten_display = "";
  }

  //  alles senken
  if (daten_display == "al-senk1") {
    Serial.println("alles heben on");
    delay(10);
    digitalWrite(29 , HIGH);
    digitalWrite(33 , HIGH);
    digitalWrite(37 , HIGH);
    digitalWrite(41 , HIGH);
    daten_display = "";
  }
  if (daten_display == "al-senk0") {
    Serial.println("alles heben off");
    delay(10);
    digitalWrite(29 , LOW);
    digitalWrite(33 , LOW);
    digitalWrite(37 , LOW);
    digitalWrite(41 , LOW);
    daten_display = "";
  }

  //  nach rechts kippen
  if (daten_display == "re-kipp1") {
    Serial.println("nach rechts kippen on on");
    delay(10);
    digitalWrite(31 , HIGH);
    digitalWrite(39 , HIGH);
    daten_display = "";
  }
  if (daten_display == "re-kipp0") {
    Serial.println("nach rechts kippen on off");
    delay(10);
    digitalWrite(31 , LOW);
    digitalWrite(39 , LOW);
    daten_display = "";
  }
  //  nach links kippen
  if (daten_display == "li-kipp1") {
    Serial.println("nach links kippen on on");
    delay(10);
    digitalWrite(27 , HIGH);
    digitalWrite(35 , HIGH);
    daten_display = "";
  }
  if (daten_display == "li-kipp0") {
    Serial.println("nach links kippen on off");
    delay(10);
    digitalWrite(27 , LOW);
    digitalWrite(35 , LOW);
    daten_display = "";
  }
  //  nach vorn kippen
  if (daten_display == "vorkipp1") {
    Serial.println("nach vorn kippen on on");
    delay(10);
    digitalWrite(35 , HIGH);
    digitalWrite(39 , HIGH);
    daten_display = "";
  }
  if (daten_display == "vorkipp0") {
    Serial.println("nach vorn kippen on off");
    delay(10);
    digitalWrite(35 , LOW);
    digitalWrite(39 , LOW);
    daten_display = "";
  }
  //  nach hinten kippen
  if (daten_display == "ruekipp1") {
    Serial.println("nach vorn kippen on on");
    delay(10);
    digitalWrite(27 , HIGH);
    digitalWrite(31 , HIGH);
    daten_display = "";
  }
  if (daten_display == "ruekipp0") {
    Serial.println("nach vorn kippen on off");
    delay(10);
    digitalWrite(27 , LOW);
    digitalWrite(31 , LOW);
    daten_display = "";
  }
  //  Rampe heben
  if (daten_display == "kopfauf1") {
    Serial.println("Kopfteil heben on");
    delay(10);
    digitalWrite(43 , HIGH);
    daten_display = "";
  }
  if (daten_display == "kopfauf0") {
    Serial.println("Kopfteil heben off");
    delay(10);
    digitalWrite(43 , LOW);
    daten_display = "";
  }
  //  Rampe senken
  if (daten_display == "kopfab1") {
    Serial.println("Kopfteil senken on");
    delay(10);
    digitalWrite(45 , HIGH);
    daten_display = "";
  }
  if (daten_display == "kopfab0") {
    Serial.println("Kopfteil senken off");
    delay(10);
    digitalWrite(45 , LOW);
    daten_display = "";
  }

  // Unterprogramm für Taster
  if (digitalRead(7) == LOW ) {
    digitalWrite( 43 , LOW );
    Serial.print("LED off    |");
  }
  while (digitalRead(7) == HIGH) {
    Taster();
    delay( 100 );
  }
}
void Taster() {
  if (digitalRead(7) == HIGH) {
    digitalWrite( 43 , HIGH );
    Serial.println("Taster/LED on");
  }
  if (digitalRead(7) == LOW) {
    digitalWrite( 43 , LOW );
    Serial.println("LED off");
  }
}

Hier ein Beispiel zu deiner Frage:

  if (daten_display == "al-heb1") || (digitalRead(7) == LOW ) {

Ob das in deinen Sketch so passt, musst du schauen.

Davon abegesehen, das Du nicht schreibst welcher Taster Dein Ereignis auslösen soll, wird das nichts:

  if (digitalRead(7) == LOW ) {
    digitalWrite( 43 , LOW );
    Serial.print("LED off    |");
  }
  while (digitalRead(7) == HIGH) {
    Taster();
    delay( 100 );
  }
}
void Taster() {
  if (digitalRead(7) == HIGH) {
    digitalWrite( 43 , HIGH );
    Serial.println("Taster/LED on");
  }
  if (digitalRead(7) == LOW) {
    digitalWrite( 43 , LOW );
    Serial.println("LED off");
  }
}

D7 ist der Taster, je nach dem wie ich den Sketch umstelle, funktioniert entweder der Befehl des Tasters oder der des Nextion. (Die "ODER" Variante hatte ich auch schon versucht.) Da ich das Unterprogramm mit D7 auch einschalte, wird die LED nicht LOW gesetzt, wenn ich den Taster wieder öffne. Wenn ich nach dem Unterprogramm die LED auf LOW setze, ist diese für den Nextion-Befehl verloren.

Das kann ich in deinem Sketch nicht erkennen.
Wenn das bei dir nicht funktioniert, ist da noch etwas falsch.

Hallo,
nutze zwei neue Hilfsvariable vom Typ bool und verknüpfe diese beiden logisch mit oder an der Stelle wo der Ausgang geschaltet wird, etwa so:

// im allgemeinTeil

bool help1,help2; 

.
.
// dann im loop 
if (daten_display == "kopfauf1") {
    Serial.println("Kopfteil heben on");
    delay(10);
    help1=HIGH;
    daten_display = ""; geändert letzter Stand Zeile wieder aktiviert
  }
  if (daten_display == "kopfauf0") {
    Serial.println("Kopfteil heben off");
    delay(10);
    help1=LOW;
    daten_display = "";  letzter Stand Zeile wieder aktiviert
  }

help2=digitalRead(7);

if( help1 | help2){
digitalWrite( 43 , HIGH );
}
else digitalWrite(43,LOW);

Nachtrag
letzter Stand die beiden Zeilen sind wieder aktiviert worden

das klingt gut, werde ich gleich mal ausprobieren, ist das das übliche Prozedere welches man nutzt, wenn man einen Ausgang mit 2 Tastern schalten will?

Das habe ich dir in #2 gezeigt.
Wenn du aber nicht deine Versuche/Beispiel zeigst, ist es immer schwer zu helfen.

geht leider auch nicht, die LED geht kurz an und wird dann wieder (vom anderen "Taster") auf LOW gesetzt.

Ich habe nun mal versucht, das Problem in einem anderen einfachen Programm abzubilden und Deinen Lösungsvorschlag dort eingebaut (vermutlich aber etwas falsch).
Diesmal habe ich einen UNO verwendet. Die LED wechselt bei gedrücktem Taster zwischen LOW und HIGH, die eingebauten Pausen machen das deutlich.

[code]
/*
   Tastertest
   author:	RGoo
   2 Taster ein Ausgang
   date:	08.07.2021
   version:	0.1
*/

bool help1, help2;


void setup() {
  Serial.begin(9600);

  pinMode(6, INPUT);//Taster 1 (alt. Nextion)
  pinMode(7, INPUT);//Taster 2

  pinMode(2, OUTPUT);//LED
}

void loop() {
  if (digitalRead(6)) {     //Taster 1
    digitalWrite( 2 , HIGH );
    Serial.print("Taster 1 on     ||   ");
    delay( 100 );

    help1 = true;
  }
  if ( digitalRead(6) == LOW ) {
    digitalWrite( 2 , LOW );
    Serial.print("Taster 1    off ||   ");
    delay( 100 );

    help1 = false;
  }
  help2 = digitalRead(7);

  if ( help1 | help2 ) {
    digitalWrite( 2 , HIGH );
  }
  else {
    digitalWrite( 2 , LOW );
  }
  if (digitalRead(7)) {
    digitalWrite( 2 , HIGH );
    Serial.println("Taster 2 on ");
    delay( 100 );
  }
  if ( digitalRead(7) == LOW) {
    digitalWrite( 2 , LOW );
    Serial.println("Taster 2    off ");
    delay( 100 );
  }
}


[/code]

Hallo,
Na ja ich vermute jetzt mal Du willst es speichernd. Versuch doch mal Deine Aufgabe mit den beiden Tastern verbal zu beschreiben. Ich sehe da zwei Varianten.
Taster 1 oder Taster 2 drücken LED ein
Variante 1
den gedrückten Taster wieder loslassen LED soll anbleiben ?? (wann soll sie dann wieder ausgehen ? )
Variante 2
den gedrückten Taster wieder loslassen die LED soll ausgehen ?
Heinz

Hallo ,

ich habe meinen Vorschlag in 6 geändert versuche das mal .
Heinz

Hallo Heinz,
ja genau Variante 2, und darin liegt wohl auch das Problem(chen).
Es handelt sich um 2 Taster, aus Gründer der Sicherheit darf der Ausgang nur HIGH sein, wenn der eine oder der andere Taster "aktiv" gedrückt wird. In Realität handelt es sich um ein Nextion Display, welches bei Betätigung einer Schaltfläche einen Wert sendet und beim Loslassen auch einen, also als Taster fungiert. Und weiterhin um einen zusätzlichen Taster, der unabhängig von Display an einer anderen Stelle den gleichen Vorgang auslösen soll.

der Befehl daten_display = ""; ist notwendig, um die Variable wieder zu leeren

Ja da muss wohl auch so sein damit der Taster im Nexton als Taster wirkt. Aber dann müsste mein erster Vorschlag aus #6 doch gehen ? Ist doch dann nichts anderes als das, oder hab ich noch was nicht verstanden.

const byte btnpin1 = 2;
const byte btnpin2 = 3;
const byte led = 13;

bool bedingung1, bedingung2;

void setup() {
  // put your setup code here, to run once:
  pinMode(btnpin1, INPUT_PULLUP);
  pinMode(btnpin2, INPUT_PULLUP);
  pinMode (led, OUTPUT);
}

void loop() {

  bedingung1 = !digitalRead(btnpin1); //Hier taster 1
  bedingung2 = !digitalRead(btnpin2);

  if (bedingung1 || bedingung2) {
    digitalWrite(led, HIGH);

  }
  else digitalWrite(led, LOW);


}
1 Like

Muss noch mal nachfragen . wie hast Du die Taster angeschlossen ? .Du hast im pinMode INPUT also hast Du einen externen PULLDOWN Widerstand und fragst auf H ab ?

Heinz

ja, ich habe einen externen PULLDOWN Widerstand genutzt
ich habe nun Dein Programm mit dem internen PULLUP getestet
UND HURRA es funktioniert, vielen, vielen Dank, nun hoffe ich es auch in das Original übertragen zu können (denn Dein Code ist doch eine Stufe zu hoch für meine kurzen Beine) aber ich versuche es

Da steckt dein Fehler , nich an einer andern Stelle mach nur eine Stelle draus .

na ja das geht nicht so einfach, einmal habe ich das Nextion Display und dann noch den separaten Taster, für das Nextion die Kommunikation über die Schnittstelle und der Taster hängt an einem Eingang
mit an einer anderen Stelle war der räumliche Bezug gemeint, der Taster ist vom Display entfernt angebracht, sorry, war blöd ausgedrückt

Hallo
Ok sorry, dachte andere Stelle im Sketch, hattest Du ja auch so :wink:

Heinz

Kann es sein, das hier ein | fehlt?

[eigentlich wollte ich den löschen - weil ihr schon durch ward, in der Zeit wo ich das noch analysieren wollte - aber nu...]