2x6x6 Umschalter - Hilfe beim "merken" eines Status

Hallo zusammen,
ich baue einen Umschalter für ein Projekt. Der Sketch funktioniert auch schon genau so, wie er soll. Bis auf (Hoffentlich) eine "Kleinigkeit". Ich weiß leider nicht, wie ich vorgehen muss.

Wenn ich inputSwitchC1 schalte, dann schaltet auch der dazugehörige Ausgang outputC1.
Wenn ich inputSwitchC2 schalte, dann schaltet der dazugehörige Ausgang outputC1 und outputCIO.

Ich möchte mit den beiden InputSwitchC1 und InputSwitchC2 zwei Ausgänge von outputC1 gleichzeitig schalten.
Z.B Pin 38, 39. Wenn Pin 39 durch inputSwitchC2 ausgelöst wird, soll auch Pin 52 von outputCIO geschaltet sein.
Könnt Ihr mir helfen?

const byte inputSwitchG1 [6] = {A5, A4, A3, A2, A1, A0};
const byte inputSwitchG2 [6] = {A13, A12, A11, A10, A9, A8};
const byte inputSwitchC1 [6] = {8, 9, 10, 11, 12, 13};
const byte inputSwitchC2 [6] = {2, 3, 4, 5, 6, 7};
const byte outputG1 [6] = {27, 26, 25, 24, 23, 22};
const byte outputC1 [6] = {43, 42, 41, 40, 39, 38};
const byte outputGIO [6] = {32, 33, 34, 35, 36, 37};
const byte outputCIO [6] = {48, 49, 50, 51, 52, 53};
const byte sperrPin [6] = {19, 18, 17, 16, 15, 14};          
const byte noOfButtonssperr = 6;
const byte noOfButtons = 6;
//-------------------------------------------------
void setup()
{
  for (byte a = 0; a < noOfButtons; a++)
  {
    pinMode(inputSwitchG1[a], INPUT);
    pinMode(inputSwitchG2[a], INPUT);
    pinMode(inputSwitchC1[a], INPUT);
    pinMode(inputSwitchC2[a], INPUT);
    pinMode(outputG1[a], OUTPUT);
    pinMode(outputC1[a], OUTPUT);
    pinMode(outputGIO[a], OUTPUT);
    pinMode(outputCIO[a], OUTPUT);
    digitalWrite(outputG1[a], HIGH);
    digitalWrite(outputC1[a], HIGH);
    digitalWrite(outputGIO[a], HIGH);
    digitalWrite(outputCIO[a], HIGH);
  }
  for (byte z = 0; z < noOfButtonssperr; z++)
  {
    pinMode(sperrPin[z], INPUT);
    
  }
}

//--------------------------------------------------
void loop()
{
  bool merker1 = HIGH;
  bool merker2 = HIGH;
  for (byte b = 0; b < sizeof(inputSwitchG1); b++)     // durchlaufe alle Pins von inputSwitchG1
  {
    for (byte f = 0; f < sizeof(outputC1)              // durchlaufe alle Pins von outputC1
         / sizeof(outputC1[0]); f++)                   // wenn ein outputC1 auf LOW liegt,
    {
      if (!digitalRead(outputC1[f]))                   // wenn outputC1 auf LOW
      {
        merker1 = LOW;                                 // merke, das ein PIN LOW ist
        if (digitalRead(inputSwitchG1[b]))             // wenn Taster inputSwitchG1 gedrückt
        
          {
            delay(200);
            schalteG1(b);                              // gehe zu schalteG1
          }
      }
    }
  }

  for (byte c = 0; c < sizeof(inputSwitchC1); c++)     // durchlaufe alle Pins von inputSwitchC1
  {
    if (digitalRead(sperrPin[c]))                      // sperre gesetzt?
    {
      digitalWrite(outputC1[c], HIGH);
    }
    else if (digitalRead(inputSwitchC1[c]))            // Taste inputSwitchC1 gedrückt?    
      {
        delay(200);
        schalteC1(c);                                  //springe zu void schalteC1
      }
  }

  for (byte d = 0; d < sizeof(inputSwitchG2); d++)     // durchlaufe alle Pins von inputSwitchG2
  {
   for (byte g = 0; g < sizeof(outputC1)               // durchlaufe alle Pins von outputC1
        / sizeof(outputC1[0]); g++)                    // wenn ein outputC1 auf LOW liegt,
   {
     if (!digitalRead(outputC1[g]))                    // wenn outputC1 auf LOW
     {
       merker2 = LOW;                                  // merke, das ein PIN LOW ist
       if (digitalRead(inputSwitchG2[d]))              // wenn Taster inputSwitchG2 gedrückt
         {
           delay(200);
           schalteG2(d);                               // gehe zu schalteG2
         }
     }
   }
  }
  for (byte e = 0; e < sizeof(inputSwitchC2); e++)     // durchlaufe alle Pins von inputSwitchC2
  {
    if (digitalRead(sperrPin[e]))                      // sperre gesetzt?
    {
      digitalWrite(outputC1[e], HIGH);
    }
    else if (digitalRead(inputSwitchC2[e]))            // Taste inputSwitchC2 gedrückt?
      {
        delay(200);
        schalteC2(e);                                  //springe zu void schalteC2
      }
  }

  allesHigh1(merker1);                                 
  allesHigh2(merker2);
}

//--------------------------------------------------
void allesHigh1(const bool neuMerker1)                 // Übergeben wird der merker
{
  static bool lastMerker1 = LOW;                       // Inhalt darf nicht verloren gehen
  if (neuMerker1 != lastMerker1)                       // neuer Status?....
  {
    lastMerker1 = neuMerker1;                          // .... Status merken UND ....
    if (neuMerker1)                                    // .... nur wenn HIGH
      for (byte b = 0; b < sizeof(outputG1)
           / sizeof(outputG1[0]); b++)
      {
        digitalWrite(outputG1[b], HIGH);
      }
  }
}

//--------------------------------------------------
void allesHigh2(const bool neuMerker2)                 // Übergeben wird der merker
{ 
  static bool lastMerker2 = LOW;                       // Inhalt darf nicht verloren gehen
  if (neuMerker2 != lastMerker2)                       // neuer Status?....
  {
    lastMerker2 = neuMerker2;                          // .... Status merken UND ....
    if (neuMerker2)                                    // .... nur wenn HIGH
      for (byte b = 0; b < sizeof(outputG1)
           / sizeof(outputG1[0]); b++)
      {
        digitalWrite(outputG1[b], HIGH);
      }
  }
}
//--------------------------------------------------
void schalteG1(const byte aPin)                        // übergeben werden die Pins
{
  for (byte i = 0; i < sizeof(inputSwitchG1); i++)     // durchlaufe Pins
  {
    if (i != aPin)                                     // ist i ungleich Taster aus Loop
      digitalWrite(outputG1[i], HIGH);                 // dann lösche den Status
    else
    {
      digitalWrite(outputG1[i], LOW);                  // wenn der Pin stimmt, dann setze ihn
      digitalWrite(outputGIO[i], HIGH);
    }
  }
}

//--------------------------------------------------
void schalteG2(const byte bPin)                        // übergeben werden die Pins
{
  for (byte i = 0; i < sizeof(inputSwitchG2); i++)     // durchlaufe Pins
  {
    if (i != bPin)                                     // ist i ungleich Taster aus Loop
      digitalWrite(outputG1[i], HIGH) ;                // dann lösche den Status
    else
    {
      digitalWrite(outputG1[i], LOW);                  // wenn der Pin stimmt, dann setze ihn
      digitalWrite(outputGIO[i], LOW);
    }
  }
}

//--------------------------------------------------
void schalteC1(const byte cPin)                        // übergeben wird der Pin
{
  for (byte j = 0; j < sizeof(inputSwitchC1); j++)     // durchlaufe Pins
  {
    if (j != cPin)                                     // ist j ungleich Taster aus Loop
      digitalWrite(outputC1[j], HIGH);                 // dann lösche den Status
    else
    {
      digitalWrite(outputC1[j], LOW);                  // wenn der Pin stimmt, dann setze ihn
      digitalWrite(outputCIO[j], HIGH);
    
    }
  }
}

//--------------------------------------------------
void schalteC2(const byte dPin)                        // übergeben wird der Pin
{
  for (byte j = 0; j < sizeof(inputSwitchC2); j++)     // durchlaufe Pins
  {
    if (j != dPin)                                     // ist j ungleich Taster aus Loop
      digitalWrite(outputC1[j], HIGH);                 // dann lösche den Status
    else
    {
      digitalWrite(outputC1[j], LOW);                  // wenn der Pin stimmt, dann setze ihn
      digitalWrite(outputCIO[j], LOW);
    }
  }
}

Jein. Formuliere Deine Beschreibung nochmal besser, dann wird es Dir vielleicht klarer.

Ich sehe nichts, was irgendwie nach "funktionieren" aussieht.

Ersetze einfach mal die Pin Nummern durch die entsprechenden InputSwitchXY[z] und Ausgänge entsprechend.

Kannst Du mal eine Tabelle machen, welche Inputs, welche Outputs schalten sollen?

Beispiel:
inC1.5 -> outC1.5, outCIO.5
Oder die reinen PIN-Nummern:
in 12 -> out 39, 52

Hallo threewood

Wofür ist der Sketch im echten Leben?

Ich kann die Logik nicht aus deinem Text ablesen.

mal rauskopiert:

const byte inputSwitchC1 [6] = {8, 9, 10, 11, 12, 13};
const byte inputSwitchC2 [6] = {2, 3, 4, 5, 6, 7};
const byte outputC1 [6] = {43, 42, 41, 40, 39, 38};
const byte outputCIO [6] = {48, 49, 50, 51, 52, 53};

Willst du das?

WENN
.InputSwitchC1[4] (also Pin12) ODER InputSwitchC2[4] (Pin 6)
DANN
.setze outputC1[4] (also Pin 39)
.setze outputCIO[4] (also Pin52)
SONST
.lösche outputC1[4] (also Pin 39)
.lösche outputCIO[4] (also Pin52)

?

ein Schalter von inputSwitchC1 oder inputSwitchC2 muss gesetzt sein um beide Ausgänge aus outputC1 und outputCIO zu setzen.

Hallo zusammen. Schonmal vielen Dank für eure Mühe.
Ich mache gleich ein Video von dem Aufbau. Dann wird hoffentlich klar, was ich meine.

@paulpaulson
Das wird eine digitale Patchbay für NF Signale.

Hallo threewood

C++ und ich lieben funktionale Namen.

Was beschreiben die folgenden Abkürzungen?

G1, G2, C1, C2, GIO und CIO? 

InputSwitch G1, G2, C1, C2 und sperrpin sind jeweils 6 Taster.
An die output G1, G2 kommen jeweils Relais. Ein/Aus.
An die output GIO, CIO kommen jeweils Wechsler Relais 1xum.

Du setzt einen Ausgang und löscht alle anderen.
Mit dieser Funktion kannst Du keine 2 Pins setzen.

Ändere die Logik:
Funktion um alle Pins zu löschen
Funktion um ein Pin zu setzen.

Die Funktion um ein Pin zu setzen kannst Du öfters mit verschiedenen Parametern aufrufen.

Grüße Uwe

Was muß da geschaltet werden, um eine Verbindung herzustellen? Welche einfachen Relais, welcher Wechser?

NF-Signal vorne rein, hinten raus.
Wege werden mit UM-Relais festgelegt.

Wieso nicht?
Ein Merker rein, dass der Pin bereits von einem anderem Steuersignal ausgelöst wurde und gut ist.

Und jetzt nochmal zur Beschreibung, den Pins und Relais des TO. Es wird ja wohl kaum 1 Relais für jede mögliche Verbindung verbaut.

Genau! Ihr habt das alles richtig erkannt.
@uwefed
Das ist anscheinend genau mein Problem. Ich habe leider keinen Ansatz wie ich das ändern kann. Wonach muss ich suchen?
Gibt es einen Skatch bei dem ich abgucken und lernen kann?

Irgendwie so:

void schalteG2(const byte bPin)                        // übergeben werden die Pins
{
  bool isSet[sizeof(inputSwitchG2)] = {0, 0, 0, 0, 0, 0,};
  for (byte i = 0; i < sizeof(inputSwitchG2); i++)     // durchlaufe Pins
  {
    if (i != bPin)                                     // ist i ungleich Taster aus Loop
    {
      if (!isSet[i])
      {
        digitalWrite(outputG1[i], HIGH) ;
      }                // dann lösche den Status
    }
    else
    {
      digitalWrite(outputG1[i], LOW);                  // wenn der Pin stimmt, dann setze ihn
      digitalWrite(outputGIO[i], LOW);
      if (i == 5)
      {
        digitalWrite(outputGI1[5], LOW);
        isSet[i] = true;
      }
    }
  }
}

Nur zum zeigen, wie der Merker funktioniert.
Ich wollte eine Zuordnungstabelle - die hab ich nicht bekommen, darum jetzt nur rudimentär.

Und wie sieht die Relaisschaltung dazu aus?
Wie wird mehr als eine Verbindung gleichzeitig hergestellt?

Hab ich geschrieben - ich kenn die Anforderung nicht! Das ist raten auf niedrigem Niveau.

Vermutlich wird das eine 2x2 Matrix -> 2 in auf 2 out - mit der Idee, dass wenn irgendein IN auf einen bestimmten OUT gesetzt wird ein weiterer OUT aufgemacht wird -> Aber mit einem anderen IN. Also so eine Art Macro...

Vor zwei Jahren gab es schon mal ein ähnliches Vorhaben.
Darin wurden mehrere Ansätze dargestellt.

einfache if, Strukturen und Objekte.
Alles vorliegend.
Du bräuchtest dich nur bedienen, Fragen stellen oder Fragen die dir gestellt werden beantworten.

@noiasca Genau. Der Skatch hat immer gut funktioniert und ich benutze den bis heute. Es wird aber Zeit für ein Upgrade. :wink:

Ich habe eben den Schaltplan quick and dirty gezeichnet. Hoffe ihr werdet daraus schlau.

Edit: Die Relais G0-G5 und C0-C5 sollen in Ruhestellung offen sein. Ist leider falsch gezeichnet.

Bei jedem Input Pin von "C Input 0-5" können 2 verschiedere Signale ankommen. Natürlich nicht zeitgleich. Diese sollen auf die beiden Busse (Signal 1 und Signal 2) geroutet werden. Von da aus können die beiden Signale auf je einer der G output geroutet werden.
Also 2 unterschiedliche Signale an C Input 0-5 rein, 2 unterschiedliche Signale am G Output 0-5 raus.
Wenn z.B. an Output 0 bereits Signal 1 anliegt und ich Signal 2 auch auf Output 0 schalten möchte, dann soll GIO0 einfach umschalten. Demnach habe ich dann nur ein Signal bei G output 0-5 anliegen bis ich den Bus "Signal 2" an einen anderen Output schalte.

Der Skatch, den ich eingangs gepostet habe, kann ein Signal in dem Schaltplan schalten. Ich hätte aber gerne 2 Signale gleichzeitig.

Ich würde euch gerne mein Projekt einfacher erklären. Wenn ich nur wüsste wie. Logic ist nicht so meins. Das ist die Tragik. :wink:

1 Bild sagt mehr als 1000 Worte :slight_smile:

Zwischen den G und C Eingängen gibt es eigentlich keinen Unterschied. Die Schaltung erlaubt 2 Eingänge aus beiden Gruppen auf die Ausgänge zu schalten.

Grundsätzlich sollten die Relais so geschaltet werden, daß es im ausgeschalteten Zustand keine Kurzschlüsse gibt.

Bei Änderungen würde ich zuerst alle einfachen (C und G) Relais abschalten, dann die Wechsler in die neue Lage bringen, und dann die angewählten einfachen Relais einschalten. Ggf. berücksichtigen, daß Relais nicht sofort abschalten und bei Änderungen eine kurze Pause vor dem Einschalten des neuen Kanals einbauen.