Ich Bitte euch um Hilfe, bin echt schon verzweifelt und weis nicht mehr weiter.
Wie wäre hier der richtige Befehl, wenn man mit einen Taster 2 Ausgänge schalten will, es sollen aber nachher mit anderen taster die Relais einzeln auch geschaltet werden können.
1 Taster = 2 Ausgänge
Die gleichen Ausgänge auch mit anderen 2 Taster getrennt schaltbar machen.
wenn ich mehrere Relais ansteuern möchte und jeden Relais einen Taster zuweise Funktioniert das super. Ich möchte gerne mit einen zusätzlichen Taster 2 von den Relais die schon einen anderen Taster zugewiesen sind schalten lassen.
Jedes mal wenn ich das versuche geht dann der ursprüngliche Taster nicht mehr (reagiert nicht).
Wie lassen sich Taster und die dazugehörigen Ausgänge mischen? Hardware ist denke ich nicht drann schuld, ich kann jede Funktion durch Spannung am Sockel belibig ansteuern.
Schwierig zu sagen, was das Problem ist, ohne den Code zu sehen. Denke aber, dass die Eingabe und Ausgabe nicht wirklich abgetrennt ist und sich deshalb die verschiedenen Eingaben gegenseitig beeinflussen.
Ziemlich einfach lassen sich solche Sachen realisieren, indem du eine Variable machst, in der die Relaiszustände gespeichert werden. Eine Funktion fragt diese Variable bei jedem Loopdurchgang ab und stellt die Relais dementsprechend ein. Die Variable selbst kann dann von beliebig vielen anderen Funktionen verändert werden, ob nun ein Taster mehrere Zustände ändert oder was auch immer.
Mal eine Wahrheitstabelle:
Output1 HIGH wenn
value1 == HIGH && value2 == LOW
Output1 LOW wenn
value1 == LOW && value2 == LOW
value1 == HIGH && value2 == HIGH
value1 == LOW && value2 == LOW
also HIGH in einem Fall und LOW in 3 Fällen.
Das gleiche gilt für die anderen IF's.
Du mußt die LOW-setzen-Bedingung auch explizit ausschreiben und nicht durch else machen.
SkobyMobil:
P.S.
Hallo Uwe
verrate mir den Trick mit Taster 2
Der Trick ist daß die Tastatur 102 Tasten (geschätzt und nicht gezählt) hat man aber wenn man den Text kopiert und nicht verändert immernoch eine "2" dasteht anstatt die gedachte "3".
Habs ausgebessert.
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