Arduino ha una parte hardware "i componenti e il circuito" e una parte software "il programma", a volte si pensa che il problema sia il programma ma invece è la caratteristica del circuito.
Mi viene da pensare che le variabili confrontate negli if() assumano valori non previsti, prova a mettere dei Serial.println() che stampano i valori delle variabili utilizzate, questi valori potrebbero per qualche motivo sconosciuto o legato all'hardware cambiare, attivando una parte di codice e poi un altra.
Per trovare la parte di codice che da problemi, potresti commentare parte del codice in modo da stabilire il comportamento del restante codice.
Ossia invece di controllare tutte le funzioni che agiscono su i relé, le racchiudi tra commenti tutte tranne una e vedi il suo comportamento, in quella funzione userai dei serial.println() per vedere i valori assunti dalle variabili, e ti si potrebbero chiarire le cose.