Arduino Mega and Mux please help

Hi to everybody,
I have a problem at my home with Arduino Mega, 2 Mux (1 for input and 1 for output) e 3 shields with 16 relay for everyone.

When I switch on 1 relay in a shield and then switch on another one on an other shield they sometime shut off, sometime switchon another relay and so on.
I post the code, maybe there is a problem with mux digital write, i don't know.
Please help because this circuit doesn't Work in my home and my Wife wants kill me :slight_smile:

void relayControl(int* digitalVals, int* relayType, int* relayVals, unsigned long* relayTimes, int chan)
{
for (int i=0; i<16; i++)
{
  digitalVals[i] = muxShieldInput.digitalReadMS(chan, i);
  
  switch(relayType[i])
  {
    case 0:
    {
      if((digitalVals[i] != relayVals[i]))
      {
        relayVals[i] = digitalVals[i];
        muxShieldOutput.digitalWriteMS(chan, i, !digitalVals[i]);
      }
      break;
    }
    case 1:
    {
      if(digitalVals[i] == 0)
      {
        break;
      }
      if(relayVals[i] == 0)
      {
        if(digitalVals[i] == 1)
        {
          relayVals[i] = 1;
          muxShieldOutput.digitalWriteMS(chan, i, relayVals[i]);
        }
        
      }
      else if(relayVals[i] == 1)
      {
        if(digitalVals[i] == 1)
        {
          relayVals[i] = 0;
          muxShieldOutput.digitalWriteMS(chan, i, relayVals[i]);
        }
        
      }
      delay(1000);
      break;
    }
    case 2:
    {
      if(digitalVals[i] == 1)
      {
        if(relayVals[i + 1] == 1)
        {
          muxShieldOutput.digitalWriteMS(chan, i, HIGH);
          muxShieldOutput.digitalWriteMS(chan, i + 1, HIGH);
          relayVals[i + 1] = 0;
          delay(1000);
          break;
        }
        if(relayVals[i] == 1)
        {
          muxShieldOutput.digitalWriteMS(chan, i, HIGH);
          muxShieldOutput.digitalWriteMS(chan, i + 1, HIGH);
          relayVals[i] = 0;
        }else{
          muxShieldOutput.digitalWriteMS(chan, i, LOW);
          muxShieldOutput.digitalWriteMS(chan, i + 1, HIGH);
          relayTimes[i] = millis();
          relayVals[i] = digitalVals[i];
        }
        delay(1000);
      break;
      }
    }
    case 3:
    {
      if(digitalVals[i] == 1)
      {
        if(relayVals[i - 1] == 1)
        {
          muxShieldOutput.digitalWriteMS(chan, i, HIGH);
          muxShieldOutput.digitalWriteMS(chan, i - 1, HIGH);
          relayVals[i - 1] = 0;
          delay(1000);
          break;
        }
        if(relayVals[i] == 1)
        {
          muxShieldOutput.digitalWriteMS(chan, i, HIGH);
          muxShieldOutput.digitalWriteMS(chan, i - 1, HIGH);
          relayVals[i] = 0;
        }else{
          muxShieldOutput.digitalWriteMS(chan, i, LOW);
          muxShieldOutput.digitalWriteMS(chan, i - 1, HIGH);
          relayTimes[i] = millis();
          relayVals[i] = digitalVals[i];
        }
        delay(1000);
      break;
      }
    }
  }
}
}

void loop() {

tapparellaTimeCheck(IO1RelayType, IO1RelayTimes, IO1TapparellaDelay, 1);
tapparellaTimeCheck(IO2RelayType, IO2RelayTimes, IO2TapparellaDelay, 2);
tapparellaTimeCheck(IO3RelayType, IO3RelayTimes, IO3TapparellaDelay, 3);

relayControl(IO1DigitalVals, IO1RelayType, IO1RelayVals, IO1RelayTimes, 1);
relayControl(IO2DigitalVals, IO2RelayType, IO2RelayVals, IO2RelayTimes, 2);
relayControl(IO3DigitalVals, IO3RelayType, IO3RelayVals, IO3RelayTimes, 3);

}

16-relay boards are problematic, because they have no opto isolation. And you use three of them?
Post a diagram, showing how you have connected them.
Especially power and ground.
Leo..

Hi mate, here's the diagram.

netrising86:
I have a problem at my home with Arduino Mega, 2 Mux (1 for input and 1 for output) e 3 shields with 16 relay for everyone.

When I switch on 1 relay in a shield and then switch on another one on an other shield they sometime shut off, sometime switchon another relay and so on.

Are you saying you use that shield to directly drive relays?
Or do you use a relay board.
Leo..

Max 6mA output current?