Problema nell'eseguire delle funzioni

Salve a tutti è la prima volta che scrivo, ho un problema in uno sketch e sono diversi giorni che non riesco a trovare una soluzione.
Lo scopo del progetto è quello di avere 2 sequenze di accensione e 2 sequenze di spegnimento di 8 relè, per richiamare le 4 sequenze avrò 4 pulsanti ognuno corrispondente a una sequenza; premendolo dovrebbe richiamarla ma se i relè sono spenti e premo il pulsante relativo ad una sequenza si spegnimento non mi deve accadere niente. Ovvero se sono nella fase in cui ho i relè sono accessi mi devono funzionare solo i due pulsanti di spegnimento o viceversa se sono nella fase in cui ho i relè sono spenti mi devono funzionare solo i due pulsanti di accensione. Ma ancora purtroppo non riesco ad escludere i pulsanti come descritto sopra. Via allego lo sketch e vi dico che sono con un arduino mega.
Vi ringrazio in anticipo!!

const int buttonPin1 = 50;   
const int buttonPin2 = 51;  
const int buttonPin3 = 52;  
const int buttonPin4 = 53;           
      
int buttonState1; 
int buttonState2; 
int buttonState3; 
int buttonState4;
unsigned inputVariable = 100;

void apertura1()
{delay (100);
  digitalWrite(22,LOW);
    delay(100);
    digitalWrite(23,LOW);
    delay(100);
    digitalWrite(24,LOW);
    delay(100);
    digitalWrite(25,LOW);
    delay(100);
    digitalWrite(26,LOW);
    delay(100);
    digitalWrite(27,LOW);
    delay(100);
    digitalWrite(28,LOW);
    delay(100);
    digitalWrite(29,LOW);
      }

void apertura2()
{delay (200);
  digitalWrite(22,LOW);
 digitalWrite(23,LOW);
 digitalWrite(24,LOW);
 digitalWrite(25,LOW);
 digitalWrite(26,LOW);
 digitalWrite(27,LOW);
 digitalWrite(28,LOW);
 digitalWrite(29,LOW);
      }
void chiusura1()

  {delay (200);
    digitalWrite(22,HIGH);
    delay(200);
    digitalWrite(23,HIGH);
    delay(400);
    digitalWrite(24,HIGH);
    delay(300);
    digitalWrite(25,HIGH);
    delay(200);
    digitalWrite(26,HIGH);
    delay(600);
    digitalWrite(27,HIGH);
    delay(400);
    digitalWrite(28,HIGH);
    delay(600);
    digitalWrite(29,HIGH);
      }
void chiusura2()
{delay (200);
  digitalWrite(22,HIGH);    
    digitalWrite(23,HIGH);    
    digitalWrite(24,HIGH);    
    digitalWrite(25,HIGH);    
    digitalWrite(26,HIGH);   
    digitalWrite(27,HIGH);
    digitalWrite(28,HIGH);    
    digitalWrite(29,HIGH);  
    }


     
void setup() {
    
     pinMode(buttonPin1, INPUT); 
     pinMode(buttonPin2, INPUT); 
     pinMode(buttonPin3, INPUT); 
     pinMode(buttonPin4, INPUT);       
     pinMode(22, OUTPUT); //RELE
     pinMode(23, OUTPUT); //RELE
     pinMode(24, OUTPUT); //RELE
     pinMode(25, OUTPUT); //RELE
     pinMode(26, OUTPUT); //RELE
     pinMode(27, OUTPUT); //RELE
     pinMode(28, OUTPUT); //RELE
     pinMode(29, OUTPUT); //RELE
    
 }

void loop() {
buttonState1 = digitalRead(buttonPin1);
buttonState2 = digitalRead(buttonPin2);
buttonState3 = digitalRead(buttonPin3);
buttonState4 = digitalRead(buttonPin4);
  
   if (buttonState1 == HIGH && inputVariable == 98)
  {inputVariable = 100;      
  apertura1();
   }
 
 if (buttonState2 == HIGH && inputVariable == 98)
  {  inputVariable = 100;   
    apertura2();
     }
 if (buttonState3 == HIGH && inputVariable == 100)
  { inputVariable = 98; 
    chiusura1();
     }
  if (buttonState4 == HIGH && inputVariable == 100 )
  { inputVariable = 98; 
    chiusura2();
        }
   
}

io, a parte una certa confusione del programma non noto errori
descrivi bene cosa succede, eventualmente aggiungi delle stampe durante le vaie fasi e vedi cosa dice il monitor seriale
Stai usando una MEGA, vero?
controlla bene lo schema, anzi: postalo

unsigned inputVariable = 100;

Manca il tipo di variabile ( int long ecc)

Hai messo delle resistenze pulldown sulle entrate dei pulsanti?

Ciao Uwe

Int è sottinteso se metti unsigned o long

Anch'io vorrei vedere lo schema

Non capisco il problema: se un relè è spento e tu scrivi nuovamente
digitalWrite(x, LOW);
comunque non succede nulla, quindi puoi anche non prendere alcuna precauzione...

Tieni presente che, durante le sequenze di apertura1 e chiusura1 e i 200ms di apertura2 e chiusura2, le operazioni sui pulsanti vengono ignorate.

Visto che come già stato detto il programma in se non ha errori logici la butto lì: il tuo problema è per caso il fatto che mentre è attiva la sequenza di apertura se premi il pulsante per la chiusura questo non "sente" la pressione finché la procedura di apertura non è terminata?

marco63:
se i relè sono spenti e premo il pulsante relativo ad una sequenza si spegnimento non mi deve accadere niente. Ovvero se sono nella fase in cui ho i relè sono accessi mi devono funzionare solo i due pulsanti di spegnimento o viceversa se sono nella fase in cui ho i relè sono spenti mi devono funzionare solo i due pulsanti di accensione.

Non è molto chiaro, ma concordo con quanto ti ha scritto fabpolli, ossia il codice in sé non sembra avere criticità se non per il fatto che mentre è in corso una sequenza essendoci dei delay() il programma non "sente" le pressioni dei tasti. Ma questo è normale, diciamo che i tasti agiscono solo quando non è attiva nessuna sequenza.

Se non è questo il problema, potrebbe dipendere da come hai connesso i pulsanti, ossia come ha chiesto uwefed, se non hai messo delle resistenze di pulldown sui 4 pin il digitalRead() non ti dà valori affidabili quindi ti consiglio o di mettere queste resistenze (tra pin e GND, mentre il pulsante va tra pin e +5V) o di impostare gli ingressi con la resistenza di pullup interna (INPUT_PULLUP) e quindi la logica sarà invertita (pulsante alzato=HIGH, pulsante premuto=LOW).

Quindi per prima cosa ti consiglio sempre di usare la seriale come debug, mettendo qualcosa che ti faccia capire cosa sta facendo, e magari un LED per indicare che sta "lavorando" e quindi non va premuto nessun tasto (in ogni caso verrà ignorato). Inoltre ti consiglio di parametrizzare meglio i programmi soprattutto quando hai parecchi pin mettendoli in un array, e posibilmente di indentare in modo standard (dall'IDE premi Ctrl-T e te lo fa lui, poi però continua in quel modo).

Vedi ad esempio questo codice, ricavato dal tuo ma sul quale ho fatto alcune modifiche (e che potrebbe funzionare, verificalo tu), chiedi tranquillamente se c'è qualcosa che ti incuriosisce:

const byte btn[4] = {50,51,52,53};
const byte rly[8] = {22,23,24,25,26,27,28,29};
bool rlyON = false;
const byte led = 21; // Qui metti un pin non usato
void setup() 
{
  Serial.begin(9600);
  for(int i=0; i<4; ++i)
    pinMode(btn[i], INPUT);
  for(int i=0; i<8; ++i)
    pinMode(rly[i], OUTPUT); //RELE
  Serial.println("Setup completato");
}

void loop() 
{
  if ( !rlyON )
  {
    if (digitalRead(btn[0]) == HIGH)
      apertura(100);
    if (digitalRead(btn[1]) == HIGH)
      apertura(0);
  }
  else
  {
    if (digitalRead(btn[2]) == HIGH)
      chiusura(200);
    if (digitalRead(btn[3]) == HIGH)
      chiusura(0);
  }
}

void apertura(int ritardo)
{
  Serial.println("Inizio apertura...");
  digitalWrite(led, HIGH);
  delay(100);
  for(int i=0; i<8; ++i)
  {
    delay(ritardo);
    digitalWrite(rly[i],LOW);
  }
  rlyON = true;
  Serial.println("  ...fine sequenza.");
  digitalWrite(led, LOW);
}

void chiusura(int ritardo)
{
  Serial.println("Inizio chiusura...");
  digitalWrite(led, HIGH);
  delay(200);
  for(int i=0; i<8; ++i)
  {
    delay(ritardo);
    digitalWrite(rly[i],HIGH);
  }
  rlyON = false;
  Serial.println("  ...fine sequenza.");
  digitalWrite(led, LOW);
}

EDIT: nella chiusura2() tu fai dei delay diversi prima di ogni relè, se ti serve in quel modo dovresti modificare il mio programma aggiungendo un nuovo array con gli 8 delay associati ad ogni relé, ed usare quelli al posto del delay parametrico che avevo impostato. Una volta che vedi che il listato che ti ho postato qui ti funziona, prova a modificarlo tu per aggiugnere questa feature (e se hai problemi ovviamente posta la tua versione e dicci cosa fa o non fa, e vediamo di darti una mano)