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

Hallo Gemeinde,
komme aus dem Maschinenbau und beschäftige mich seit ein Paar Wochen mit dem Arduino.
Projekt: Lichtspots mit dem Arduino schalten.
Beispiel: Taster 1: Spot 1-5
Taster 2: Spot 4-7
Taster 3: alles aus (als Beispiel)
Problem: Taster schalten nciht wie die sollen, oder
Relais schaltet nicht, nur die LED am Relais glimmt.
Relais hat eine eigene 5V Spannungsversorgung, Ground ist mit Ground Arduino verbunden. Sitze schon seit Tagen daran.....es muss doch einfach zu machen sein...

wollte die Pins in einer Liste als OUT bzw.INPUT zuweisen, das klappt gar nicht. also alles manuell....
Über ein Paar Tipps wäre ich sehr dankbar.....gestern mehre Stunden daran verbracht...die Frau macht schon Ärger :slight_smile:

Gruß,
Martin

//Konstanten
const int tasterpin10 = 10;   // pin des tasters
const int tasterpin11 = 11;   // pin des tasters
const int tasterpin12 = 12;   // pin des tasters
const int tasterpin13 = 13;   // pin des tasters
const int ledpin2 = 2;    //pin relais 
const int ledpin3 = 3;    //pin relais
const int ledpin4 = 4;    //pin relais
const int ledpin5 = 5;    //pin relais 

//Variablen
int tasterstatus10 = LOW;   //signal vom taster
int tasterstatus11 = LOW;   //signal vom taster
int tasterstatus12 = LOW;   //signal vom taster
int tasterstatus13 = LOW;   //signal vom taster

int zustand = LOW;
int tastergedrueckt10 = 0;  // abfragen ob taster gedrückt war
int tastergedrueckt11 = 0;  // abfragen ob taster gedrückt war
int tastergedrueckt12 = 0;  // abfragen ob taster gedrückt war
int tastergedrueckt13 = 0;  // abfragen ob taster gedrückt war
int lichtmodus1 = 0;       // lichtprogramme
int lichtmodus2 = 0;       // lichtprogramme
int lichtmodus3 = 0;       // lichtprogramme
int lichtmodus4 = 0;       // lichtprogramme
int ledstatus1 = LOW;      //aktueller zustand led
int ledstatus2 = LOW;      //aktueller zustand led
int ledstatus3 = LOW;      //aktueller zustand led
int ledstatus4 = LOW;      //aktueller zustand led

unsigned long tasterzeit10 = 0;       //zeit beim drücken des tasters
unsigned long tasterzeit11 = 0;       //zeit beim drücken des tasters
unsigned long tasterzeit12 = 0;       //zeit beim drücken des tasters
unsigned long tasterzeit13 = 0;       //zeit beim drücken des tasters
unsigned long entprellzeit = 200;   //entprellzeit, anpassen !!
unsigned long ledmillis = 1000;

//int zaehler = 0;

void setup() {
  Serial.begin(9600);
  pinMode(ledpin2,OUTPUT);   //ausgang
  pinMode(ledpin3,OUTPUT);
  pinMode(ledpin4,OUTPUT);
  pinMode(ledpin5, OUTPUT);
  pinMode(tasterpin10, INPUT_PULLUP);
  pinMode(tasterpin11, INPUT_PULLUP);
  pinMode(tasterpin12, INPUT_PULLUP);
  pinMode(tasterpin13, INPUT_PULLUP);
 
   
}

void loop() {

  // // taster 10  einlesen
 tasterstatus10 = digitalRead(tasterpin10);

  //wenn taster gedrückt ist
    if (tasterstatus10 == LOW)
  {
    tasterzeit10 = millis();  // aktualisiere tasterzeit
    tastergedrueckt10 = 1;  // speichert, dass taster gedrückt wurde
    
  }
  if ((millis() - tasterzeit10  > entprellzeit) && tastergedrueckt10 == 1)
  {
    lichtmodus1++;  // lichtmodus um 1 erhöht
    tastergedrueckt10 = 0;
  }
  Serial.println(lichtmodus1);

//**************************************  
 // taster 11  einlesen
 tasterstatus11 = digitalRead(tasterpin11);

  //wenn taster gedrückt ist
    if (tasterstatus11 == LOW)
  {
    tasterzeit11 = millis();  // aktualisiere tasterzeit
    tastergedrueckt11 = 1;  // speichert, dass taster gedrückt wurde
    
  }
  if ((millis() - tasterzeit11  > entprellzeit) && tastergedrueckt11 == 1)
  {
    lichtmodus2++;  // lichtmodus um 1 erhöht
    tastergedrueckt11 = 0;
  }
  Serial.println(lichtmodus2);

// // taster 12  einlesen
 tasterstatus12 = digitalRead(tasterpin12);

  //wenn taster gedrückt ist
    if (tasterstatus12 == LOW)
  {
    tasterzeit12 = millis();  // aktualisiere tasterzeit
    tastergedrueckt12 = 1;  // speichert, dass taster gedrückt wurde
    
  }
  if ((millis() - tasterzeit12  > entprellzeit) && tastergedrueckt12 == 1)
  {
    lichtmodus3++;  // lichtmodus um 1 erhöht
    tastergedrueckt12 = 0;
  }
  Serial.println(lichtmodus3);

//************************************** 
// // taster 13  einlesen
 tasterstatus13 = digitalRead(tasterpin13);

  //wenn taster gedrückt ist
    if (tasterstatus13 == LOW)
  {
    tasterzeit13 = millis();  // aktualisiere tasterzeit
    tastergedrueckt13 = 1;  // speichert, dass taster gedrückt wurde
    
  }
  if ((millis() - tasterzeit13  > entprellzeit) && tastergedrueckt13 == 1)
  {
    lichtmodus4++;  // lichtmodus um 1 erhöht
    tastergedrueckt13 = 0;
  }
  Serial.println(lichtmodus4);

//**************************************

//************************** Leuchtprogramme***************+


 
 //taster 10
//wenn taster nciht gedrückt, licht aus
if (lichtmodus1 == 0)
{
  digitalWrite(ledpin2, HIGH);
  digitalWrite(ledpin4, HIGH);  
}
if (lichtmodus1 == 1)  //led an
{
  digitalWrite(ledpin2, LOW);
  digitalWrite(ledpin4, LOW);
}

if (lichtmodus1 >= 2)
{
  //lichtmodus = 0;
  digitalWrite(ledpin2, HIGH);
  digitalWrite(ledpin4, HIGH);
  lichtmodus1 = 0;
}
   //taster 11 lichtmodus11111111111111111111111111111111111111111111
//wenn taster nciht gedrückt, licht aus
if (lichtmodus2 == 0)
{
  digitalWrite(ledpin2, HIGH);
  digitalWrite(ledpin5, HIGH);  
}
if (lichtmodus2 == 1)  //led an
{
  digitalWrite(ledpin2, LOW);
  digitalWrite(ledpin5, LOW);
}

if (lichtmodus2 >= 2)
{
  //lichtmodus = 0;
  digitalWrite(ledpin2, HIGH);
  lichtmodus2 = 0;
}

 //taster 12 lichtmodus3333333333 alles aus
//wenn taster nciht gedrückt, licht aus
if (lichtmodus3 == 0)
//{
  //digitalWrite(ledpin2, HIGH);
  //digitalWrite(ledpin4, HIGH);  
//}
if (lichtmodus3 == 1)  //led an
{
  digitalWrite(ledpin2, HIGH);
  digitalWrite(ledpin3, HIGH);
  digitalWrite(ledpin4, HIGH);
  digitalWrite(ledpin5, HIGH);
}

if (lichtmodus3 >= 2)
{
  //lichtmodus = 0;
  digitalWrite(ledpin2, HIGH);
  digitalWrite(ledpin4, HIGH);
  lichtmodus3 = 0;
}

  
 //taster 13 lichtmodus44444444444444444444444444444444444444444
//wenn taster nciht gedrückt, licht aus
if (lichtmodus4 == 0)
{
  digitalWrite(ledpin2, HIGH);
  digitalWrite(ledpin4, HIGH);  
}
if (lichtmodus4 == 1)  //led an
{
  digitalWrite(ledpin2, LOW);
  digitalWrite(ledpin4, LOW);
}

if (lichtmodus4 >= 2)
{
  //lichtmodus = 0;
  digitalWrite(ledpin2, HIGH);
  digitalWrite(ledpin4, HIGH);
  lichtmodus4 = 0;
}

}

Hallo,

wenn die Relais glimmen werden sie vermutlich ständig ein und aus geschaltet.

Mit den if Lichtmodus abfragen sitimmt was nicht.

Ich hab auch nicht verstande warum Du das so aufwendig machst. Muss doch mit 3 If gehen du has es ja fast schon geschrieben.

Taster 1-3 entprellen mit millis() ist schon mal super und auf die tasterstatus 1-3 legen.

Wenn Tasterstatus 1
LED1-5 an
LED 6,7 aus

wenn Tasterstatus 2
LED 4-7 an
LED 1,2,3 aus

Wenn Tasterstatus 3
taster 1-7 aus

Heinz

Hi

Warum Alles als int?
Ok, const int verschwindet eh, da vom Kompiler direkt im Code einbaubar.
Ein int auf LOW und 1 setzen, ist wiederum 'nicht normal' - also normal macht man Das nicht so :wink:
Klar, LOW ist unterm Rock auch nur '0' und HIGH wird wohl '1' sein (wie true und false auch) - trotzdem wird kaum Einer auf die Idee kommen, Seine LED auf wahr zu stellen, statt auf HIGH.

Du hast zwei Licht-Modi - Modus 0 (AUS) und 1 (AN) - ab Zwei schaltest Du aus und gehst wieder auf Null.
Warum nicht 'Wenn Modus==1, schalte Licht an, SONST Aus, Modus=0'?

Wenn Du Code hast, der mehrfach Verwendung findet, mache eine Funktion draus.

MfG

Hallo zusammen,

besten dank für die Infos.
werde mich mal dran machen und die Tipps versuchen zu verarbeiten.
Ich selbst habe das Programmieren nie gelernt, mache hier und da ein Tutorial, kopiere mir die Sachen zusammen und versuche die Lichter zum leuchten zu bringen.....Fange mit dem Programm von vorne an....für den besseren Überblick.

Frage: ist es möglich die Pins auf einmal zu deklarieren? Pin = { 2,3,4....} ? klappt bei mir nicht bzw. rufe
diese dann falsch auf

  • was wäre die bessere Alternative zu int?

Danke!

Eigentlich genau so … vll ohne die vielen Punkte :o

byte Pin [] = { 2,3,4,5} ;
...
setup(){
  for (byte u=0;u<sizeof(Pin)/sizeof(Pin[0]);u++){
    pinMode(Pin[u],INPUT_PULLUP);
  }
}
...
loop(){
...
}

u wird von 0 an hochgezählt, solange Es kleiner ist als
sizeof(Pin)/sizeof(Pin[9])
sizeof() gibt den Speicherverbrauch in Byte an.
sizeof(Pin) somit den Verbrauch von 4 Byte.
Da man aber auch INT, LONG, LONG LONG nehmen könnte, bedient man sich eines Trick:
Man teilt den Gesamt-Verbrauch durch den Einzel-Verbrauch - hier Pin[0] (das erste Element).
Das ergibt IMMER die Anzahl der enthaltenen Elemente.
Und da wir bei 0 anfangen zu Zählen, müssen wir auch aufhören, wenn u auf diese Zahl angewachsen ist.
Wenn nach dem 4.ten Durchlauf u auf 4 erhöht wurde, wird die FOR nicht mehr ausgeführt, weil u nicht mehr kleiner 4 ist - und wir sind mit dem Setzen der Pinne fertig.

Genau so kannst Du in loop() LED-Pins aus dem Array raus holen.
Wenn der 3.te Taster LOW ist, kannst Du im LED-Array ‘nachsehen’, welchen Pin Du für die LED schalten musst.

MfG

Vielen Dank. habe das Programm entspeckt :slight_smile: und Fehler gefunden und das PROBLEM erkannt, kann es aber nicht lösen:
Glimmen der LED am Relais kommt weil:

taster 9 schaltet Relais 1
taster 11 schaltet Relais 1+4+5

Problem: wenn taster 9 Relais 1 eingeschaltet hat → schaltet mir der Taster 11 mein Relais 1 wieder aus , es kommt zum flimmern

die Relais sollen unabhängig von einander geschaltet werden können. Ich glaube mit den “lichtmodus” werde ich das nicht lösen können…

//taster 9 lichtmodus4
//
if (lichtmodus4 == 0)
{
  digitalWrite(relais1, LOW);
   
}
if (lichtmodus4 == 1)  //led an
{
  digitalWrite(relais1, HIGH);
  
}

if (lichtmodus4 >= 2)
{
   lichtmodus4 = 0;
}
 
 
   //taster 11 lichtmodus2
//
if (lichtmodus2 == 0)
{
  digitalWrite(relais1, LOW);
  digitalWrite(relais4, LOW);
  digitalWrite(relais5, LOW);  
}
if (lichtmodus2 == 1)  //led an
{
  digitalWrite(relais1, HIGH);
  digitalWrite(relais4, HIGH);
  digitalWrite(relais5, HIGH);
}

if (lichtmodus2 >= 2)
{
   lichtmodus2 = 0;
}

Hallo Profis :slight_smile:
vielen Dank, das Programm schaltet schon mal viel bessre als am Anfang, dank Euch.

Jedoch habe ich ein neus Problem: ÜBERLAGERUNG der HIGH / LOW Befehle

Mein Gedanke: taster9=HIGH --> Relais1=HIGH --> alle anderen Lichtmodus (1-3) aus

Folge: Modus 1-3 lässt sich nciht mehr einschalten; Als ich die Lichtmoduse (Mehrzahl) nicht ausgeschaltet habe hat sich Relais 1 mit Taster 9 und Taster 11 überschnitten mit der Folge, dass die LED am Relais geglimmt hat (Taster 9 schaltet ein, Taster 11 weil nicht gedrückt aus)
Wie kann man das lösen?

//Konstanten
const int tasterpin9 = 9;   // pin des tasters
const int tasterpin10 = 10;   // pin des tasters
const int tasterpin11 = 11;   // pin des tasters
const int tasterpin12 = 12;   // pin des tasters

const int relais1 = 2;    //pin relais 
const int relais2 = 3;    //pin relais
const int relais3 = 4;    //pin relais
const int relais4 = 5;    //pin relais 
const int relais5 = 6;    //pin relais
const int relais6 = 7;    //pin relais
const int relais7 = 8;    //pin relais

//Variablen
int tasterstatus9 = HIGH;   //signal vom taster
int tasterstatus10 = HIGH;   //signal vom taster
int tasterstatus11 = HIGH;   //signal vom taster
int tasterstatus12 = HIGH;   //signal vom taster

int zustand = LOW;
int tastergedrueckt9 = 0;  // abfragen ob taster gedrückt war
int tastergedrueckt10 = 0;  // abfragen ob taster gedrückt war
int tastergedrueckt11 = 0;  // abfragen ob taster gedrückt war
int tastergedrueckt12 = 0;  // abfragen ob taster gedrückt war

int lichtmodus1 = 1;       // lichtprogramme
int lichtmodus2 = 1;       // lichtprogramme
int lichtmodus3 = 1;       // lichtprogramme
int lichtmodus4 = 1;       // lichtprogramme
int relaisstatus1 = HIGH;      //aktueller zustand led
int relaisstatus2 = HIGH;      //aktueller zustand led
int relaisstatus3 = HIGH;      //aktueller zustand led
int relaisstatus4 = HIGH;      //aktueller zustand led
int relaisstatus5 = HIGH;      //aktueller zustand led
int relaisstatus6 = HIGH;      //aktueller zustand led
int relaisstatus7 = HIGH;      //aktueller zustand led


unsigned long tasterzeit9 = 0;       //zeit beim drücken des tasters
unsigned long tasterzeit10 = 0;       //zeit beim drücken des tasters
unsigned long tasterzeit11 = 0;       //zeit beim drücken des tasters
unsigned long tasterzeit12 = 0;       //zeit beim drücken des tasters

unsigned long entprellzeit = 300;   //entprellzeit, anpassen !!
unsigned long ledmillis = 1000;

//int zaehler = 0;

void setup() {
  Serial.begin(9600);
  pinMode(relais1,OUTPUT);   //ausgang
  pinMode(relais2,OUTPUT);
  pinMode(relais3,OUTPUT);
  pinMode(relais4, OUTPUT);
  pinMode(relais5, OUTPUT);
  pinMode(relais6, OUTPUT);
  pinMode(relais7, OUTPUT);

  pinMode(tasterpin9, INPUT_PULLUP);
  pinMode(tasterpin10, INPUT_PULLUP);
  pinMode(tasterpin11, INPUT_PULLUP);
  pinMode(tasterpin12, INPUT_PULLUP);
  
 // formelaufstellung
// void entprell(int taster, int stat,
      
}

void loop() {

  // // taster 9  einlesen  ist lichtmodus 4
 tasterstatus9 = digitalRead(tasterpin9);

  //wenn taster gedrückt ist
    if (tasterstatus9 == LOW)
  {
    tasterzeit9 = millis();  // aktualisiere tasterzeit
    tastergedrueckt9 = 1;  // speichert, dass taster gedrückt wurde
    
  }
  if ((millis() - tasterzeit9  > entprellzeit) && tastergedrueckt9 == 1)
  {
    lichtmodus4++;  // lichtmodus um 1 erhöht
    tastergedrueckt9 = 0;
  }
  Serial.println(lichtmodus4);

//**************************************  
  
  // // taster 10  einlesen
 
 tasterstatus10 = digitalRead(tasterpin10);

  //wenn taster gedrückt ist
    if (tasterstatus10 == LOW)
  {
    tasterzeit10 = millis();  // aktualisiere tasterzeit
    tastergedrueckt10 = 1;  // speichert, dass taster gedrückt wurde
    
  }
  if ((millis() - tasterzeit10  > entprellzeit) && tastergedrueckt10 == 1)
  {
    lichtmodus1++;  // lichtmodus um 1 erhöht
    tastergedrueckt10 = 0;
  }
  Serial.println(lichtmodus1);

//**************************************  
 // taster 11  einlesen
 tasterstatus11 = digitalRead(tasterpin11);

  //wenn taster gedrückt ist
    if (tasterstatus11 == LOW)
  {
    tasterzeit11 = millis();  // aktualisiere tasterzeit
    tastergedrueckt11 = 1;  // speichert, dass taster gedrückt wurde
    
  }
  if ((millis() - tasterzeit11  > entprellzeit) && tastergedrueckt11 == 1)
  {
    lichtmodus2++;  // lichtmodus um 1 erhöht
    tastergedrueckt11 = 0;
  }
  Serial.println(lichtmodus2);

// // taster 12  einlesen
 tasterstatus12 = digitalRead(tasterpin12);

  //wenn taster gedrückt ist
    if (tasterstatus12 == LOW)
  {
    tasterzeit12 = millis();  // aktualisiere tasterzeit
    tastergedrueckt12 = 1;  // speichert, dass taster gedrückt wurde
    
  }
  if ((millis() - tasterzeit12  > entprellzeit) && tastergedrueckt12 == 1)
  {
    lichtmodus3++;  // lichtmodus um 1 erhöht
    tastergedrueckt12 = 0;
  }
  Serial.println(lichtmodus3);



//**************************************

//************************** Leuchtprogramme***************+

//taster 9 lichtmodus4
//
if (lichtmodus4 == 0)
{
  //digitalWrite(relais1, LOW);
   
}
if (lichtmodus4 == 1)  //led an
{
  digitalWrite(relais1, HIGH);
  lichtmodus1 = 0;
  lichtmodus2 = 0;
  lichtmodus3 = 0;
}

if (lichtmodus4 >= 2)
{
  digitalWrite(relais1, LOW);
   lichtmodus4 = 0;
}
 
 
   //taster 11 lichtmodus2
//
if (lichtmodus2 == 0)
{
 // digitalWrite(relais1, LOW);
  //digitalWrite(relais4, LOW);
  //digitalWrite(relais5, LOW);  
}
if (lichtmodus2 == 1)  //led an
{
  digitalWrite(relais1, HIGH);
  digitalWrite(relais4, HIGH);
  digitalWrite(relais5, HIGH);
  lichtmodus4 = 0;
  lichtmodus1 = 0;
  lichtmodus3 = 0;
}

if (lichtmodus2 >= 2)
{
  digitalWrite(relais1, LOW);
  digitalWrite(relais4, LOW);
  digitalWrite(relais5, LOW);
   lichtmodus2 = 0;
}
//taster 10
//
if (lichtmodus1 == 0)
{
  // digitalWrite(relais2, LOW);
  //digitalWrite(relais3, LOW);  
}
if (lichtmodus1 == 1)  //led an
{
  digitalWrite(relais2, HIGH);
  digitalWrite(relais3, HIGH);
  lichtmodus2 = 0;
  lichtmodus3 = 0;
  lichtmodus4 = 0;

}

if (lichtmodus1 >= 2)
{
  
  digitalWrite(relais2, LOW);
  digitalWrite(relais3, LOW);  
  lichtmodus1 = 0;
}
}

Hi

MALE Dir auf, Was Wann passieren soll.

Wenn die LED in LichtModi 1-3 und 9 an sein soll: Dann schreibe Das so!
Und schalte die eine LED an EINEM Punkt im Programm, nicht an Dreizehn!
Dann bleibt die LED nämlich an oder aus, aber nicht 'so lala', weil sich zwei Abfragen gegenseitig den Ausgang umschalten.

MfG

Deinem Code fehlt es an Übersichlichkeit und Struktur.

  • sich wiederholende Abläufe sollte man in eigene Funktionen packen, evtl. mit Parametern (Tasten lesen, Relais setzen), Schleifen einsetzen

  • trenne das Einlesen der Tasten (Zwischenspeichern in globale Variable), die logischen Verknüpfungen (Ablegen der Ergebnisse in globaler Variable) und die Ausgabe zu den Ralais ("abarbeiten" der lokalen Variable) von einander

  • mache fürs Debugging Ausgaben auf den seriellen Monitor

Besten Dank für die Info.
Das hatte ich vermutet, dass ich auf eine gemeinsame Variable zugreifen muss weil mir die verschiedenen immer unabhängig voneinander die Relais schalten.

kurze Beschreibung zum Vorhaben:

-Taster als Schalter

  • 4 Relais schalten

z.B. Taster 1: alle 4 an
Taster 2: Relais 1 an
Taster 3: Relais 1 und 2 an
Taster 4: alle aus

Problem bis jetzt: wenn Taster 2 "Status an" hatte, hat mir Taster 1 Relais 1 wieder ausgeschaltet.

Ich hoffe, dass es mit den globalen funktioniert, muss mich da aber noch reinarbeiten...auch in die Funktionen incl. Entprellen der Taster.
Muss wohl das Programm neu aufsetzen.

....bräuchte Hilfe..
Habe ein Problem bei dem Aufbau der Logik...wie kann es umgesetzt werden, dass ich unabhängig von dem einem Taster, der als Schalter dienen soll, einen anderen drücke, der dann gilt und der andere nicht mehr gültig ist.
Beipiel: Taster 1: Relais 1+2+3+4 an
Taster 2: Relais 1 an (2+3+4 aus)
Taster 3: alle aus

Ich müsste doch eine gemeinsame Variable jedes mal überschreiben, oder? Das Relais soll auch an sein wenn der Taster nicht mehr gedrückt wird.
Für michist es noch sau schwer das umzusetzten wobei es gar nicht so schwer sein kann, vermute ich....
Würde mich über kleine Anleitung freuen.
Danke.

Nimm doch für die Tastaturabfrage eine Library, mach eine Funktion für die Kontrolle der Relais,
fertig ist die Laube.

(ungetestet)

#include <Bounce2.h>

const uint8_t tastenPins[] = { 9, 10, 11, 12 };
const uint8_t relaisPins[] = { 2, 3, 4, 5, 6, 7, 8 };

Bounce Taste[sizeof(tastenPins)];

void setup() {
  Serial.begin(250000);
  for (uint8_t i = 0; i < sizeof(tastenPins); i++) {
    Taste[i].attach(tastenPins[i], INPUT_PULLUP);
  }
  for (uint8_t i = 0; i < sizeof(relaisPins); i++) {
    digitalWrite(relaisPins[i], HIGH);
    pinMode(relaisPins[i], OUTPUT);
  }
}

void loop() {
  for (uint8_t i = 0; i < sizeof(tastenPins); i++) {
    Taste[i].update();
  }
  if (Taste[0].fell()) {  // Taster 1: alle 4 an
    switchRelais(true, true, true, true);
  }
  if (Taste[1].fell()) {  // Taster 2: Relais 1 an
    switchRelais(true, false, false, false);
  }
  if (Taste[2].fell()) {  // Taster 3: Relais 1 und 2 an
    switchRelais(true, true, false, false);
  }
  if (Taste[3].fell()) {  // Taster 4: alle aus
    switchRelais(false, false, false, false);
  }
}

void switchRelais(bool r1, bool r2, bool r3, bool r4) {
  digitalWrite(relaisPins[0], !r1);
  digitalWrite(relaisPins[1], !r2);
  digitalWrite(relaisPins[2], !r3);
  digitalWrite(relaisPins[3], !r4);
}

Es gibt seit C++11 auch "for each". Damit geht das einfacher:

https://en.cppreference.com/w/cpp/language/range-for

Serenifly:
Es gibt seit C++11 auch “for each”. Damit geht das einfacher:

Range-based for loop (since C++11) - cppreference.com

Findest du?

#include <Bounce2.h>

const uint8_t tastenPins[] = { 9, 10, 11, 12 };
const uint8_t relaisPins[] = { 2, 3, 4, 5, 6, 7, 8 };

Bounce Taste[sizeof(tastenPins)];

void setup() {
  Serial.begin(250000);
  uint8_t pNum = 0;
  for (auto pin : tastenPins) {
    Taste[pNum++].attach(pin, INPUT_PULLUP);
  }
  for (auto pin : relaisPins) {
    digitalWrite(pin, HIGH);
    pinMode(pin, OUTPUT);
  }
}

void loop() {
  for (auto& taste : Taste) {
    taste.update();
  }
  if (Taste[0].fell()) {  // Taster 1: alle 4 an
    switchRelais(true, true, true, true);
  }
  if (Taste[1].fell()) {  // Taster 2: Relais 1 an
    switchRelais(true, false, false, false);
  }
  if (Taste[2].fell()) {  // Taster 3: Relais 1 und 2 an
    switchRelais(true, true, false, false);
  }
  if (Taste[3].fell()) {  // Taster 4: alle aus
    switchRelais(false, false, false, false);
  }
}

void switchRelais(bool r1, bool r2, bool r3, bool r4) {
  digitalWrite(relaisPins[0], !r1);
  digitalWrite(relaisPins[1], !r2);
  digitalWrite(relaisPins[2], !r3);
  digitalWrite(relaisPins[3], !r4);
}

Ich finde das ist nur teilweise besser lesbar oder bequemer zu programmieren,
Anfänger könnte die zusätzliche neue Syntax vielleicht eher verwirren.

Abgesehen von dem ersten Fall ist es wesentlich einfacher lesbar wenn man die Syntax versteht.

Der Code wird erheblich "robuster" gegen Flüchtigkeitsfehler.

Da hätte ich dann noch eine Variante, die auf combies Vorschlag von vor ein paar Wochen basiert und die Methoden einer Struktur nutzt:

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()
  {
    aktualisieren();                        // Tasterzustände aktualisieren
    if (steigend())
    {
      byte j = 0;
      for (auto &r : relaisPins) digitalWrite(r, relaisZustaende & (1 << j++));
    }
  }

  void aktualisieren()
  {
    altZustand = aktZustand;
    if (jetzt - vorhin >= debounceDelay)    // Entprellen
    {
      aktZustand = !digitalRead(pin);
      if (altZustand != aktZustand)
      {
        vorhin = jetzt;
      }
    }
  }

  bool steigend()                           // steigende Signalflanke
  {
    if (!altZustand && aktZustand)
    {
      return true;
    }
    return false;
  }
  /* nicht benutzt
    bool zustand()
    {
    return aktZustand;
    }

    bool fallend()
    {
      if (altZustand && !aktZustand)
      {
        return true;
      }
      return false;
    }
  */
  const byte pin;
  const byte relaisZustaende;
  bool aktZustand = 0;
  bool altZustand = 0;
  unsigned long vorhin = 0;
};

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();
}

agmue:
Da hätte ich dann noch eine Variante, die auf combies Vorschlag von vor ein paar Wochen basiert und die Methoden einer Struktur nutzt:

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

Außerdem schaltet sie beim Loslassen der Tasten... ;).

Whandall:
Außerdem schaltet sie beim Loslassen der Tasten... ;).

Das kommt von INPUT_PULLUP, der Taster schaltet gegen GND, weil ich keine externen PullDowns verwende. Wenn man bei [color=red]![/color][color=blue]digitalRead(pin);[/color] das Ausrufezeichen entfernt, wird die Logik gedreht.

agmue:
Das kommt von INPUT_PULLUP, der Taster schaltet gegen GND, weil ich keine externen PullDowns verwende. Wenn man bei [color=red]![/color][color=blue]digitalRead(pin);[/color] das Ausrufezeichen entfernt, wird die Logik gedreht.

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