AJUDA EM CONTROLE DE NIVEL ARDUINO

TENHO UM TRABALHO DE ESCOLA PRA FAZER QUE FUNCIONA ASSIM:

Existe um sistema de reservatório composto de uma válvula de entrada P, duas bombas (acionadas por M1 e M2), um alarme A, e quatro sensores de nível (S1, S2, S3, S4). As condições de funcionamento são as seguintes: se o nível for S1, então fecha-se a válvula P; Se o nível for inferior a S2, então abre-se a válvula P; Nível acima de S2, M1 e M2 bombeiam; Nível abaixo de S2, somente M1 bombeia; Nível abaixo de S3 soa o alarme A; e Nível abaixo de S4, nenhuma das bombas deverá funcionar.

EU CONSEGUI FAZER O CODIGO QUE SEGUE ABAIXO, MAS TENHO DUVIDAS SE É POSSIVEL SIMPLIFICAR ESSE CODIGO. OBRIGADO A QUEM PUDER ME AJUDAR.

// OS NUMEROS NA FRENTE REPRESENTAM OS PINOS DO ARDUINO
// VARIAVEIS QUE REPRESENTAM OS SENSORES
int chaveA = 2; // SENSOR S1
int chaveB = 3; // SENSOR S2
int chaveC = 4; // SENSOR S3
int chaveD = 5; // SENSOR S4

// VARIAVEIS QUE REPRESENTAM O NIVEL QUE ESTÁ O TANQUE
// OS LEDS FORAM ADICIONADOS PARA REPRESENTAR VISUALMENTE O NIVEL DO TANQUE
int ledA = 6; // LED ACESO NO NIVEL DE S1
int ledB = 7; // LED ACESO NO NIVEL DE S2
int ledC = 8; // LED ACESO NO NIVEL DE S3
int ledD = 9; // LED ACESO NO NIVEL DE S4

int motorA = 10; // MOTOR 1
int motorB = 11; // MOTOR 2
int valvula = 12; // VALVULA P
int alarme = 13; // ALARME

// VARIAVEIS QUE ARMAZENAM QUAIS CHAVES ESTÃO ACIONADAS
int nivelA; // TODAS CHAVES ACIONADAS
int nivelB; // CHAVES B,C,D ACIONADAS
int nivelC; // CHAVES C,D ACIONADAS
int nivelD; // CHAVE D ACIONADA
int nivelvazio; // NENHUMA CHAVE ACIONADA

void setup()
{
pinMode(chaveA, INPUT); // ENTRADAS
pinMode(chaveB, INPUT);
pinMode(chaveC, INPUT);
pinMode(chaveD, INPUT);
pinMode(ledA, OUTPUT); // SAIDAS
pinMode(ledB, OUTPUT);
pinMode(ledC, OUTPUT);
pinMode(ledD, OUTPUT);
pinMode(motorA, OUTPUT);
pinMode(motorB, OUTPUT);
pinMode(valvula, OUTPUT);
pinMode(alarme, OUTPUT);
}

void loop()
{
// SE O TANQUE ESTIVER VAZIO
if (chaveA == LOW && chaveB == LOW && chaveC == LOW && chaveD == LOW)nivelvazio=1;
if(nivelvazio == 1)
{
digitalWrite(ledA, LOW);
digitalWrite(ledB, LOW);
digitalWrite(ledC, LOW);
digitalWrite(ledD, LOW);
digitalWrite(motorA, LOW);
digitalWrite(motorB, LOW);
digitalWrite(valvula, HIGH);
digitalWrite(alarme, HIGH);
}
// SE O TANQUE ESTIVER EM S4
if (chaveA == LOW && chaveB == LOW && chaveC == LOW && chaveD == HIGH)nivelD=1;
if(nivelD == 1)
{
digitalWrite(ledA, LOW);
digitalWrite(ledB, LOW);
digitalWrite(ledC, LOW);
digitalWrite(ledD, HIGH);
digitalWrite(motorA, HIGH);
digitalWrite(motorB, LOW);
digitalWrite(valvula, HIGH);
digitalWrite(alarme, HIGH);
}
// SE O TANQUE ESTIVER EM S3
if (chaveA == LOW && chaveB == LOW && chaveC == HIGH && chaveD == HIGH)nivelC=1;
if(nivelC == 1)
{
digitalWrite(ledA, LOW);
digitalWrite(ledB, LOW);
digitalWrite(ledC, HIGH);
digitalWrite(ledD, HIGH);
digitalWrite(motorA, HIGH);
digitalWrite(motorB, LOW);
digitalWrite(valvula, HIGH);
digitalWrite(alarme, LOW);
}
// SE O TANQUE ESTIVER EM S2
if (chaveA == LOW && chaveB == HIGH && chaveC == HIGH && chaveD == HIGH)nivelB=1;
if(nivelB == 1)
{
digitalWrite(ledA, LOW);
digitalWrite(ledB, HIGH);
digitalWrite(ledC, HIGH);
digitalWrite(ledD, HIGH);
digitalWrite(motorA, LOW);
digitalWrite(motorB, LOW);
digitalWrite(valvula, LOW);
digitalWrite(alarme, LOW);
// SE O TANQUE ESTIVER EM S1
if (chaveA == LOW && chaveB == LOW && chaveC == LOW && chaveD == LOW)nivelA=1;
if(nivelA == 1)
{
digitalWrite(ledA, HIGH);
digitalWrite(ledB, HIGH);
digitalWrite(ledC, HIGH);
digitalWrite(ledD, HIGH);
digitalWrite(motorA, HIGH);
digitalWrite(motorB, HIGH);
digitalWrite(valvula, LOW);
digitalWrite(alarme, LOW);
}
// SE O TANQUE ESTIVER EM OUTRA CONDIÇÃO
else
{
digitalWrite(ledA, LOW);
digitalWrite(ledB, LOW);
digitalWrite(ledC, LOW);
digitalWrite(ledD, LOW);
digitalWrite(motorA, LOW);
digitalWrite(motorB, LOW);
digitalWrite(valvula, LOW);
digitalWrite(alarme, HIGH);
}
}
}

Alguns dos int’s podem ser const int.

Porque é que isto:

  // SE O TANQUE ESTIVER EM S1
    if (chaveA == LOW && chaveB == LOW && chaveC == LOW && chaveD == LOW)nivelA=1;
    if(nivelA == 1)
    {
    digitalWrite(ledA, HIGH);
    digitalWrite(ledB, HIGH);
    digitalWrite(ledC, HIGH);
    digitalWrite(ledD, HIGH);
    digitalWrite(motorA, HIGH);
    digitalWrite(motorB, HIGH);
    digitalWrite(valvula, LOW);
    digitalWrite(alarme, LOW);
    }

Não é isto:

  // SE O TANQUE ESTIVER EM S1
    if (chaveA == LOW && chaveB == LOW && chaveC == LOW && chaveD == LOW)
    {
        nivelA=1;
        digitalWrite(ledA, HIGH);
        digitalWrite(ledB, HIGH);
        digitalWrite(ledC, HIGH);
        digitalWrite(ledD, HIGH);
        digitalWrite(motorA, HIGH);
        digitalWrite(motorB, HIGH);
        digitalWrite(valvula, LOW);
        digitalWrite(alarme, LOW);
    }

PERFEITO. OBRIGADO. ERREI MESMO. ARRUMEI AQUI. ACHO QUE É ISSO.

if (chaveA == HIGH && chaveB == HIGH && chaveC == HIGH && chaveD == HIGH)nivelA=1;
if(nivelA == 1)
{
digitalWrite(ledA, HIGH);
digitalWrite(ledB, HIGH);
digitalWrite(ledC, HIGH);
digitalWrite(ledD, HIGH);
digitalWrite(motorA, HIGH);
digitalWrite(motorB, HIGH);
digitalWrite(valvula, LOW);
digitalWrite(alarme, LOW);
}

VI AGORA A SUA SIMPLIFICAÇÃO. VALEU!!

Simplifiquei mais um pouco. Não testei mais não deveria ter problemas:

// VARIAVEIS QUE REPRESENTAM OS SENSORES 
int chaveA = 2;  // SENSOR S1
int chaveB = 3;  // SENSOR S2
int chaveC = 4;  // SENSOR S3
int chaveD = 5;  // SENSOR S4

// VARIAVEIS QUE REPRESENTAM O NIVEL QUE ESTÁ O TANQUE
// OS LEDS FORAM ADICIONADOS PARA REPRESENTAR VISUALMENTE O NIVEL DO TANQUE
int ledA = 6;  // LED ACESO NO NIVEL DE S1
int ledB = 7;  // LED ACESO NO NIVEL DE S2
int ledC = 8;  // LED ACESO NO NIVEL DE S3
int ledD = 9;  // LED ACESO NO NIVEL DE S4

int motorA = 10;  // MOTOR 1
int motorB = 11;  // MOTOR 2
int valvula = 12;  // VALVULA P
int alarme = 13;  // ALARME 

// VARIAVEIS QUE ARMAZENAM QUAIS CHAVES ESTÃO ACIONADAS
int nivelA;  // TODAS CHAVES ACIONADAS
int nivelB;  // CHAVES B,C,D ACIONADAS
int nivelC;  // CHAVES C,D ACIONADAS
int nivelD;  // CHAVE D ACIONADA
int nivelvazio;  // NENHUMA CHAVE ACIONADA


void setup()
{ 
  pinMode(chaveA, INPUT); // ENTRADAS
  pinMode(chaveB, INPUT);
  pinMode(chaveC, INPUT);
  pinMode(chaveD, INPUT);
  pinMode(ledA, OUTPUT); // SAIDAS
  pinMode(ledB, OUTPUT);
  pinMode(ledC, OUTPUT);
  pinMode(ledD, OUTPUT);
  pinMode(motorA, OUTPUT);
  pinMode(motorB, OUTPUT);
  pinMode(valvula, OUTPUT);
  pinMode(alarme, OUTPUT);
} 

void loop()
{
	// SE O TANQUE ESTIVER VAZIO
	if (chaveA == LOW && chaveB == LOW && chaveC == LOW && chaveD == LOW){
		acao (0,0,0,0,0,0,1,1);
	} 
	// SE O TANQUE ESTIVER EM S4
	if (chaveA == LOW && chaveB == LOW && chaveC == LOW && chaveD == HIGH){
		acao (0,0,0,1,1,0,1,1);
	} 
	// SE O TANQUE ESTIVER EM S3
	if (chaveA == LOW && chaveB == LOW && chaveC == HIGH && chaveD == HIGH){
		acao (0,0,1,1,1,0,1,0);
	} 
	// SE O TANQUE ESTIVER EM S2
	if (chaveA == LOW && chaveB == HIGH && chaveC == HIGH && chaveD == HIGH){
		acao (0,1,1,1,0,0,0,0);
	}
	// SE O TANQUE ESTIVER EM S1
	if (chaveA == LOW && chaveB == LOW && chaveC == LOW && chaveD == LOW){
		acao (1,1,1,1,1,1,0,0);
	} 
	// SE O TANQUE ESTIVER EM OUTRA CONDIÇÃO
	else
	{
		acao (0,0,0,0,0,0,0,1);
	}  
}

void acao (int es_ledA,int es_ledB,int es_ledC,int es_ledD,int es_motorA,int es_motorB,int es_valvula,int es_alarme){
	digitalWrite(ledA, es_ledA);
    digitalWrite(ledB, es_ledB);
    digitalWrite(ledC, es_ledC);
    digitalWrite(ledD, es_ledD);
    digitalWrite(motorA, es_motorA);
    digitalWrite(motorB, es_motorB);
    digitalWrite(valvula, es_valvula);
    digitalWrite(alarme, es_alarme);
}

POXA, VALEU! SIMPLIFICOU BEM.