Kleines Beispiel zu meinem Ansatz. Anstatt direkt if (tasterabfrage) -> Relais = high oder low würde ich das ganze auftrennen:
int relaisPin [] = {x, y, z …}; // deklariert ein Array mit den Pins, an die deine Relais angeschlossen sind
byte relaisState = B00000000; // deklariert Variable, in der festgehalten wird, ob das Relais angezogen werden soll oder nicht. Jede Ziffer der Binärzahl steht für ein Relais, 1 = eingeschaltet, 0 = ausgeschaltet, von rechts nach links.
void setup {
// setup
}
void loop () {
poll(); // hierfür eine lustige Funktion schreiben, die deine Taster abfragt und gegebenenfalls in einer Variablen speichert
if (Taste 1 gedrückt) { // hier wird auf die Tasteninputs reagiert und die Variable relaisState verändert. Somit kannst du so viele Taster, wie du willst, so viele Dinge tun lassen, wie du willst.
relaisState = relaisState ^ B00000100; // z.B. wird hier Relais Nr. 3 umgeschaltet
}
if (Taste 2 gedrückt) {
relaisState = relaisState ^ B00000011; // da werden Relais 1 und 2 umgeschaltet.
} // so kannst du auch Infraroteingaben, Mikrofongeräusche und alles Mögliche auch nachträglich noch einbauen, die deine Relaisvariable beeinflussen können.
if (Notfall) {
relaisState = B00000000; // oder Sonstiges, wie eine Fehlerbehandlung, die die Relais in jedem Fall ausschalten soll
}
setRelais (); // Das ist die Funktion, die bei jedem Durchlauf von Loop die Relais gemäss der Variable relaisState einstellt
}
void setRelais () { // Die Funktion zum Schalten der Relais
for (int i = 0; i < anzahl Relais; i++) { // geht ein Relais nach dem anderen durch,
if (bitRead(relaisState, i) == 1) { // prüft, ob das Bit an der Stelle, die zum Relais gehört 1 ist (1. Relais = bit ganz rechts usw.)
digitalWrite(relaisPin[i], HIGH); // und schaltet es gegebenenfalls ein
}
else { // steht da ne 0
digitalWrite(relaisPin[i], LOW); // wirds abgeschaltet
}
}
}
edit: sorry, das mit dem Formatieren des Codes und den Kommentaren hab ich noch nicht so im Griff ![]()