mehrere Relais mit mehreren Tastern schalten......

Whandall:
Diese Version empfinde ich als vergleichsweise unleserlich,
auch weil sie den ganzen Entprell- Status- Tasten-Kode enthält.

Es geht auch etwas komprimierter:

const unsigned long debounceDelay = 50;
unsigned long jetzt;                     // Variable für den aktuellen Zeitpunkt
const uint8_t relaisPins[] = { 2, 3, 4, 5, 6, 7, 8 };

struct Taster                            // Struktur mit Konstanten, Variablen und Methoden
{ Taster(const byte pin, const byte relaisZustaende): pin(pin), relaisZustaende(relaisZustaende), aktZustand(0), altZustand(0), vorhin(0) {}

  void init()
  { pinMode(pin, INPUT_PULLUP);
    aktZustand = !digitalRead(pin);
    altZustand = aktZustand;
    vorhin = jetzt;
  }

  void run()
  { altZustand = aktZustand;
    if (jetzt - vorhin >= debounceDelay)    // Entprellen
    { aktZustand = !digitalRead(pin);       // Tasterzustände aktualisieren
      if (altZustand != aktZustand) vorhin = jetzt;
    }
    if (!altZustand && aktZustand)          // steigende Flanke
    { byte j = 0;
      for (auto &r : relaisPins) digitalWrite(r, relaisZustaende & (1 << j++));
    }
  }

  const byte pin, relaisZustaende;
  bool aktZustand, altZustand;
  unsigned long vorhin;
};

Taster taster[]
{ // Taster-Pin, relaisZustaende
  { 9, 0b0001111},
  {10, 0b0000001},
  {11, 0b0000011},
  {12, 0b0000000}
};

void setup()
{ for (auto &r : relaisPins) pinMode(r, OUTPUT);
  for (auto &t : taster) t.init();
}

void loop()
{ jetzt = millis();
  for (auto &t : taster) t.run();
}

Whandall:
Du musst mir das Versehen nicht erklären, ich wollte nur auf das andere Verhalten hinweisen.

Man kann das Ausrufezeichen leicht übersehen, daher erschien mir ein Hinweis angebracht.

Meine Variante sollte nicht die Aussage beinhalten, sie sei ganz toll. So richtig kann ich mich noch nicht für OOP auf Arduinos erwärmen. Aber Varianten, die man nicht kennt, kann man auch nicht vergleichen. Und da der OOP-Anteil in diesem Forum nicht so groß ist, muß ich mir die Vergleichsvariante halt selbst machen. Schaden tut's mir nicht :slight_smile:

agmue:
Man kann das Ausrufezeichen leicht übersehen, daher erschien mir ein Hinweis angebracht.

Ja, habe ich zum Beispiel. :wink:

Das macht den Kode völlig unverständlich ohne einen fetten Kommentar
dass die Tastenzustände logisch und nicht physikalisch sind.

Beim Nachsehen ist mir noch aufgefallen, dass du anscheinend die Relais umgekehrt schaltest,
da fehlt dir ein !.

      byte j = 0;
      for (auto &r : relaisPins) digitalWrite(r, relaisZustaende & (1 << j++));

Whandall:
Beim Nachsehen ist mir noch aufgefallen, dass du anscheinend die Relais umgekehrt schaltest,
da fehlt dir ein !.

Da fällt mir die Werbung ein: "Ich habe gar kein Auto!"

Meine "Relais" sind LEDs, da sind leuchtende schöner zu sehem. Wenn Relais mittels GND aktiviert werden, muß man die Ausgabe halt negieren.

SCHEIß die Wand an ! :slight_smile: :slight_smile: :slight_smile:

Vielen Dank! es läuft, musste nur bei " digitalWrite(pin, HIGH); " von HIGH auf LOW schalten, die Relais sollen im Anfangszustand aus sein ; Man war ich Meilen weit von der Lösung entfernt. .......

Verstehe das Programm noch nicht ganz, werde mich aber mit den Befehlen befassen.

Wenn einer von Euch aus der Nähe von Gießen kommt gebe ich ein Bier aus ! (oder aus 2 :slight_smile: )

Gruß und schönes Wochenende!

Ich weiss nicht genau von welcher Variante du jetzt redest.

ardu2020:
musste nur bei " digitalWrite(pin, HIGH); " von HIGH auf LOW schalten, die Relais sollen im Anfangszustand aus sein

Soweit ich es verstanden habe, werden deine Relais bei LOW aktiv,
das war also schon richtig mit dem digitalWrite(pin, HIGH) (im setup denke ich),
vielleicht fehlt sogar das digitalWrite(pin, HIGH); nach dem pinMode().