/*
   Placa:     Arduino Nano w/ ATmega328
   Ficheiro:  Bombas.ino
   Versión:   0.2 beta
   Autor:     Pablo César Galdo Regueiro ([email protected])
 
    LICENSE - LICENZA
 
    Copyright 2016 Pablo César Galdo Regueiro
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

    Tradución non oficial:

    Este programa é un software libre; vostede pode redistribuilo e/ou 
    modificalo dentro dos termos da Licenza Pública Xeral GNU 
    publicada pola Fundación do Software Libre (FSF); na versión 3 da 
    Licenza, ou (á súa elección) calquera versión posterior.

    Este programa é distribuído coa esperanza de que poda ser útil, 
    mais SEN NINGUNHA GARANTÍA; sen garantia implícita de ADAPTACIÓN
    a calquer MERCADO ou APLICACIÓN EN PARTICULAR. Vexa a
    Licenza Pública Xeral GNU para maiores detalles.

    Vostede debeu recibir unha copia da Licenza Pública Xeral GNU xunto
    con este programa. Se non, mire <http://www.gnu.org/licenses/>.
 */
 
/*
 * Librarías necesarias
 */
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Bounce2.h>

/*
 * Conexión de pantalla LCD 20x4 en enderezo 0x27 por protocolo I2C
 */
LiquidCrystal_I2C lcd(0x27,20,4);

/*
 * Definición de límites de nivel (cm)
 */
int n1i = 3;      // Nivel 1 inferior
int n1s2i = 7;    // Nivel 1 superior / Nivel 2 inferior
int n2s3i = 15;   // Nivel 2 superior / Nivel 3 inferior
int n3s4i = 20;   // Nivel 3 superior / Nivel 4 inferior
int n4s5i = 25;   // Nivel 4 superior / Nivel 5 inferior
int n5s = 30;     // Nivel 5 superior

/*
 * Definición de intervalo de lecturas de nivel (s)
 */
long temponivel = 5;      // Tempo entre lecturas en segundos

/*
 * Definición de entradas analóxicas e factores de conversión
 */
int EA_sensor = A0;         // Pin de entrada do sensor analóxico 0-5 V
float valorsensor = 0;      // Variable para almacenar o valor do sensor en escala de 0 a 1023
float valornivelfloat = 0;  // Variable para almacenar o valor do nivel
int valornivelaint = 0;     // Variable para convertir o velor de nivel a número enteiro
int valornivel = 0;         // Variable para almacenar o valor de nivel redondeado en centímetros

/* 
 * Definición de entradas dixitais
 */
int E_rearme = 2;   // Pin de rearme do sistema
int E_relet1 = 3;   // Pin de salto de relé térmico 1
int E_relet2 = 4;   // Pin de salto de relé térmico 2
int E_nivels = 5;   // Pin de nivel de seguranza
int E_mmotor1 = 6;  // Pin de marcha manual motor 1
int E_mmotor2 = 7;  // Pin de marcha manual motor 2

/* 
 * Debouncing de entradas dixitais
 */
int intervalodb = 500;        // Tempo de botón premido
Bounce DB_rearme = Bounce();  // Instancia de debouncing de rearme do sistema
Bounce DB_relet1 = Bounce();  // Instancia de debouncing de relé térmico 1
Bounce DB_relet2 = Bounce();  // Instancia de debouncing de relé térmico 2
Bounce DB_nivels = Bounce();  // Instancia de debouncing de nivel de seguranza
Bounce DB_mmotor1 = Bounce(); // Instancia de debouncing de marcha manual motor 1
Bounce DB_mmotor2 = Bounce(); // Instancia de debouncing de marcha manual motor 2

/* 
 * Definición de entradas dixitais tras debouncing
 */
bool V_rearme = 0; // Pin de rearme do sistema
bool V_relet1 = 0; // Pin de salto de relé térmico 1
bool V_relet2 = 0; // Pin de salto de relé térmico 2
bool V_nivels = 0; // Pin de nivel de seguranza
bool V_mmotor1 = 0; // Pin de marcha manual motor 1
bool V_mmotor2 = 0; // Pin de marcha manual motor 2

/* 
 * Definición de saídas dixitais
 */
int S_motor1 = 12; // Pin de marcha/paro motor 1
int S_motor2 = 11; // Pin de marcha/paro motor 2
int S_alarmafe = 10; // Pin de alarma de fallo eléctrico
int S_alarmanivel = 9; // Pin de alarma de nivel

/*
 * Definición de etapas do GRAFCET
 */
bool etapa0 = 0;   // Etapa 0 (Inicial)
bool etapa1 = 0;   // Etapa 1 (Espera nivel analóxico)
bool etapa2 = 0;   // Etapa 2 (Nivel 1 - N1)
bool etapa3 = 0;   // Etapa 3 (Nivel 2 - N2)
bool etapa4 = 0;   // Etapa 4 (Nivel 3 - N3)
bool etapa5 = 0;   // Etapa 5 (Nivel 4 - N4)
bool etapa6 = 0;   // Etapa 6 (Nivel 5 - N5)
bool etapa7 = 0;   // Etapa 7 (Alarma fallo sensor analóxico)
bool etapa8 = 0;   // Etapa 8 (Temporización nivel analóxico)
bool etapa9 = 0;   // Etapa 9 (Espera nivel de seguranza)
bool etapa10 = 0;  // Etapa 10 (Temporización nivel de seguranza)
bool etapa11 = 0;  // Etapa 11 (Reset nivel de seguranza)
bool etapa12 = 0;  // Etapa 12 (Espera fallo eléctrico)
bool etapa13 = 0;  // Etapa 13 (Alarma fallo eléctrico motor 1)
bool etapa14 = 0;  // Etapa 14 (Alarma fallo eléctrico motor 2)
bool etapa15 = 0;  // Etapa 15 (Alarma fallo eléctrico ambos motores)
bool etapa16 = 0;  // Etapa 16 (Espera marcha motores)
bool etapa17 = 0;  // Etapa 17 (Nivel baixo)
bool etapa18 = 0;  // Etapa 18 (Paro)
bool etapa19 = 0;  // Etapa 19 (Temporización Paro-Nivel baixo)
bool etapa20 = 0;  // Etapa 20 (Determinación estado de alternancia)
bool etapa21 = 0;  // Etapa 21 (Alternancia 0)
bool etapa22 = 0;  // Etapa 22 (Alternancia 1)
bool etapa23 = 0;  // Etapa 23 (Simultaneidade)
bool etapa24 = 0;  // Etapa 24 (Nivel alto)
bool etapa25 = 0;  // Etapa 25 (Espera rearme)
bool etapa26 = 0;  // Etapa 26 (Espera marcha manual motor 1)
bool etapa27 = 0;  // Etapa 27 (Marcha manual motor 1)
bool etapa28 = 0;  // Etapa 28 (Espera marcha manual motor 2)
bool etapa29 = 0;  // Etapa 29 (Marcha manual motor 2)

/*
 * Definición de estado de alternancia
 */
bool alternancia = 0;   // Estado de alternancia

/* ------------------------------------------------
 * VOID SETUP: Código executado no ciclo de inicio
 * ------------------------------------------------*/
void setup() {

/*
 * Desactivar saídas a relé durante o inicio
 */
  digitalWrite(S_motor1, LOW); // Paro motor 1
  digitalWrite(S_motor2, LOW); // Paro motor 2
  digitalWrite(S_alarmafe, LOW); // Paro fallo eléctrico
  digitalWrite(S_alarmanivel, LOW); // Paro alarma de nivel

/*
 * Definición de entradas dixitais
 */
  pinMode(E_rearme,INPUT); // Pin de rearme do sistema
  // Deboucing (para evitar interferencias e rebotes ao premer os botóns)
  DB_rearme.attach(E_rearme);
  DB_rearme.interval(intervalodb); // intervalo en ms
  
  pinMode(E_relet1,INPUT); // Pin de salto de relé térmico 1
  // Deboucing (para evitar interferencias e rebotes ao premer os botóns)
  DB_relet1.attach(E_relet1);
  DB_relet1.interval(intervalodb); // intervalo en ms
  
  pinMode(E_relet2,INPUT); // Pin de salto de relé térmico 2
  // Deboucing (para evitar interferencias e rebotes ao premer os botóns)
  DB_relet2.attach(E_relet2);
  DB_relet2.interval(intervalodb); // intervalo en ms
  
  pinMode(E_nivels,INPUT); // Pin de nivel de seguranza
  // Deboucing (para evitar interferencias e rebotes ao premer os botóns)
  DB_nivels.attach(E_nivels);
  DB_nivels.interval(intervalodb); // intervalo en ms

  pinMode(E_mmotor1,INPUT); // Pin de marcha manual motor 1
  // Deboucing (para evitar interferencias e rebotes ao premer os botóns)
  DB_mmotor1.attach(E_mmotor1);
  DB_mmotor1.interval(intervalodb); // intervalo en ms

  pinMode(E_mmotor2,INPUT); // Pin de marcha manual motor 2
  // Deboucing (para evitar interferencias e rebotes ao premer os botóns)
  DB_mmotor2.attach(E_mmotor2);
  DB_mmotor2.interval(intervalodb); // intervalo en ms

/*
 * Definición de saídas dixitais
 */
  pinMode(S_motor1,OUTPUT);       // Pin de marcha/paro motor 1
  pinMode(S_motor2,OUTPUT);       // Pin de marcha/paro motor 2
  pinMode(S_alarmafe,OUTPUT);     // Pin de alarma de fallo eléctrico
  pinMode(S_alarmanivel,OUTPUT);  // Pin de alarma de fallo eléctrico

/*
 * Iniciar comunicación por porto serie para depurar o código
 */
  //Serial.begin(9600);

/*
 * Iniciar pantalla LCD
 */
  lcd.init();

/*
 * Amosar unha mensaxe de inicio durante 5 segundos
 */
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("CONTROL DE EFLUENTES");
  lcd.setCursor(0,1);
  lcd.print("(c) Pablo Galdo 2016");
  lcd.setCursor(0,2);
  lcd.print("IES Punta Candieira ");
  lcd.setCursor(0,3);
  lcd.print("      Cedeira       ");
  delay(5000);
  lcd.clear();

/*
 * Activación da etapa inicial e desactivación das demais
 */
  etapa0 = 1;   // Etapa 0 (Inicial)
  etapa1 = 0;   // Etapa 1 (Espera nivel analóxico)
  etapa2 = 0;   // Etapa 2 (Nivel 1 - N1)
  etapa3 = 0;   // Etapa 3 (Nivel 2 - N2)
  etapa4 = 0;   // Etapa 4 (Nivel 3 - N3)
  etapa5 = 0;   // Etapa 5 (Nivel 4 - N4)
  etapa6 = 0;   // Etapa 6 (Nivel 5 - N5)
  etapa7 = 0;   // Etapa 7 (Alarma fallo sensor analóxico)
  etapa8 = 0;   // Etapa 8 (Temporización nivel analóxico)
  etapa9 = 0;   // Etapa 9 (Espera nivel de seguranza)
  etapa10 = 0;  // Etapa 10 (Temporización nivel de seguranza)
  etapa11 = 0;  // Etapa 11 (Reset nivel de seguranza)
  etapa12 = 0;  // Etapa 12 (Espera fallo eléctrico)
  etapa13 = 0;  // Etapa 13 (Alarma fallo eléctrico motor 1)
  etapa14 = 0;  // Etapa 14 (Alarma fallo eléctrico motor 2)
  etapa15 = 0;  // Etapa 15 (Alarma fallo eléctrico ambos motores)
  etapa16 = 0;  // Etapa 16 (Espera marcha motores)
  etapa17 = 0;  // Etapa 17 (Nivel baixo)
  etapa18 = 0;  // Etapa 18 (Paro)
  etapa19 = 0;  // Etapa 19 (Temporización Paro-Nivel baixo)
  etapa20 = 0;  // Etapa 20 (Determinación estado de alternancia)
  etapa21 = 0;  // Etapa 21 (Alternancia 0)
  etapa22 = 0;  // Etapa 22 (Alternancia 1)
  etapa23 = 0;  // Etapa 23 (Simultaneidade)
  etapa24 = 0;  // Etapa 24 (Nivel alto)
  etapa25 = 0;  // Etapa 25 (Espera rearme)
  etapa26 = 0;  // Etapa 26 (Espera marcha manual motor 1)
  etapa27 = 0;  // Etapa 27 (Marcha manual motor 1)
  etapa28 = 0;  // Etapa 28 (Espera marcha manual motor 2)
  etapa29 = 0;  // Etapa 29 (Marcha manual motor 2)

/*
 * Valor inicial do estado de alternancia
 */
  alternancia = 0;   // Etapa 0 (Inicial)

}

/* ----------------------------------------
 * VOID LOOP: Código repetido ciclicamente
 * ----------------------------------------*/
 void loop() {

/* 
 * Actualizar as instancias de debouncing das entradas dixitais
 */
  // Actualizar instancias:
  DB_rearme.update();
  DB_relet1.update();
  DB_relet2.update();
  DB_nivels.update();
  DB_mmotor1.update();
  DB_mmotor2.update();

  // Ler os valores actualizados:
  bool V_rearme = DB_rearme.read();
  bool V_relet1 = DB_relet1.read();
  bool V_relet2 = DB_relet2.read();
  bool V_nivels = DB_nivels.read();
  bool V_mmotor1 = DB_mmotor1.read();
  bool V_mmotor2 = DB_mmotor2.read();

/* 
 * Lectura de nivel no intervalo de tempo establecido e conversión a centímetros
 */
 const unsigned long contanivel = temponivel * 1000UL;
 static unsigned long lastSampleTime = 0 - contanivel;

 unsigned long now = millis();
 if (now - lastSampleTime >= contanivel)
 {
  lastSampleTime += contanivel;
  valorsensor = analogRead(EA_sensor);      // Lectura do valor do sensor
 }
 
  valornivelfloat = abs(valorsensor * 30 / 1023);  // Conversión a centímetros
  valornivelaint = valornivelfloat * 100;
  valornivel = valornivelaint / 100;

/* ----------------------------------------
 * TRANSICIÓNS ENTRE ETAPAS
 * ----------------------------------------*/

/* 
* ETAPA 0 (Etapa inicial)
*/
  switch (etapa0) {
    case 0:
      //Espera
      break;
    case 1:
      if (V_rearme == 0){
        digitalWrite(S_motor1, LOW);
        digitalWrite(S_motor2, LOW);
        digitalWrite(S_alarmafe, LOW);
        digitalWrite(S_alarmanivel, LOW);
        etapa0 = 0;
        etapa1 = 1;
        etapa9 = 1;
        etapa12 = 1;
        etapa16 = 1;
        etapa25 = 1;
        etapa26 = 1;
        etapa28 = 1;
      }
    break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 0
*/

/* 
* ETAPA 1 (Espera nivel analóxico)
*/
  switch (etapa1) {
    case 0:
      // Espera
      break;
    case 1:
      if (valornivel >= n1i && valornivel < n1s2i){
        etapa1 = 0;
        etapa2 = 1;
      }
      else if (valornivel >= n1s2i && valornivel < n2s3i){
        etapa1 = 0;
        etapa3 = 1;
      }
      else if (valornivel >= n2s3i && valornivel < n3s4i){
        etapa1 = 0;
        etapa4 = 1;
      }
      else if (valornivel >= n3s4i && valornivel < n4s5i){
        etapa1 = 0;
        etapa5 = 1;
      }
      else if (valornivel >= n4s5i && valornivel <= n5s){
        etapa1 = 0;
        etapa6 = 1;
      }
      else{
        etapa1 = 0;
        etapa7 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 1
*/

/* 
* ETAPA 2 (Nivel 1 - N1)
*/
  switch (etapa2) {
    case 0:
      // Espera
      break;
    case 1:
      if (valornivel < n1i || valornivel >= n1s2i){
        etapa2 = 0;
        etapa8 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 2
*/

/* 
* ETAPA 3 (Nivel 2 - N2)
*/
  switch (etapa3) {
    case 0:
      // Espera
      break;
    case 1:
      if (valornivel < n1s2i || valornivel >= n2s3i){
        etapa3 = 0;
        etapa8 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 3
*/

/* 
* ETAPA 4 (Nivel 3 - N3)
*/
  switch (etapa4) {
    case 0:
      // Espera
      break;
    case 1:
      if (valornivel < n2s3i || valornivel >= n3s4i){
        etapa4 = 0;
        etapa8 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 4
*/

/* 
* ETAPA 5 (Nivel 4 - N4)
*/
  switch (etapa5) {
    case 0:
      // Espera
      break;
    case 1:
      if (valornivel < n3s4i || valornivel >= n4s5i){
        etapa5 = 0;
        etapa8 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 5
*/

/* 
* ETAPA 6 (Nivel 5 - N5)
*/
  switch (etapa6) {
    case 0:
      // Espera
      break;
    case 1:
      if (valornivel < n4s5i || valornivel >= n5s){
        etapa6 = 0;
        etapa8 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 6
*/

/* 
* ETAPA 7 (Alarma fallo sensor analóxico)
*/
  switch (etapa7) {
    case 0:
      // Espera
      break;
    case 1:
      if (valornivel >= n1i && valornivel <= n5s){
        etapa7 = 0;
        etapa8 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 7
*/

/* 
* ETAPA 8 (Temporización nivel analóxico)
*/
  switch (etapa8) {
    case 0:
      // Espera
      break;
    case 1:
        delay(500);
        etapa8 = 0;
        etapa1 = 1;
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 8
*/

/* 
* ETAPA 9 (Espera nivel de seguranza)
*/
  switch (etapa9) {
    case 0:
      // Espera
      break;
    case 1:
        if (V_nivels == 1){
        etapa9 = 0;
        etapa10 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 9
*/

/* 
* ETAPA 10 (Temporización nivel de seguranza)
*/
  switch (etapa10) {
    case 0:
      // Espera
      break;
    case 1:
        delay(500);
        etapa10 = 0;
        etapa11 = 1;
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 10
*/

/* 
* ETAPA 11 (Reset nivel de seguranza)
*/
  switch (etapa11) {
    case 0:
      // Espera
      break;
    case 1:
        if (etapa3 == 1 && V_nivels == 0) {
        etapa11 = 0;
        etapa9 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 11
*/

/* 
* ETAPA 12 (Espera fallo eléctrico)
*/
  switch (etapa12) {
    case 0:
      // Espera
      break;
    case 1:
      if (V_relet1 == 1 && V_relet2 == 0){
        etapa12 = 0;
        etapa13 = 1;
      }
      else if (V_relet1 == 0 && V_relet2 == 1){
        etapa12 = 0;
        etapa14 = 1;
      }
      else if (V_relet1 == 1 && V_relet2 == 1){
        etapa12 = 0;
        etapa15 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 12
*/

/* 
* ETAPA 13 (Alarma fallo eléctrico motor 1)
*/
  switch (etapa13) {
    case 0:
      // Espera
      break;
    case 1:
      if (V_relet1 == 1 && V_relet2 == 1){
        etapa13 = 0;
        etapa15 = 1;
      }
      else if (V_relet1 == 0 && V_relet2 == 0){
        delay(1000);
        etapa13 = 0;
        etapa12 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 13
*/

/* 
* ETAPA 14 (Alarma fallo eléctrico motor 2)
*/
  switch (etapa14) {
    case 0:
      // Espera
      break;
    case 1:
      if (V_relet1 == 1 && V_relet2 == 1){
        etapa14 = 0;
        etapa15 = 1;
      }
      else if (V_relet1 == 0 && V_relet2 == 0){
        delay(1000);
        etapa14 = 0;
        etapa12 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 14
*/

/* 
* ETAPA 15 (Alarma fallo eléctrico ambos motores)
*/
  switch (etapa15) {
    case 0:
      // Espera
      break;
    case 1:
      if (V_relet1 == 0 && V_relet2 == 0){
        delay(1000);
        etapa15 = 0;
        etapa12 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 15
*/

/* 
* ETAPA 16 (Espera marcha)
*/
  switch (etapa16) {
    case 0:
      // Espera
      break;
    case 1:
      if (etapa2 == 1){
        etapa16 = 0;
        etapa17 = 1;
      }
      else if (etapa3 == 1){
        etapa16 = 0;
        etapa18 = 1;
      }
      else if (etapa4 == 1){
        etapa16 = 0;
        etapa20 = 1;
      }
      else if (etapa5 == 1 || etapa13 == 1 || etapa14 == 1 || etapa15 == 1){
        etapa16 = 0;
        etapa23 = 1;
      }
      else if (etapa6 == 1){
        etapa16 = 0;
        etapa24 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 16
*/

/* 
* ETAPA 17 (Nivel baixo)
*/
  switch (etapa17) {
    case 0:
      // Espera
      break;
    case 1:
      if (etapa2 == 0){
        etapa17 = 0;
        etapa19 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 17
*/

/* 
* ETAPA 18 (Paro)
*/
  switch (etapa18) {
    case 0:
      // Espera
      break;
    case 1:
      if (etapa3 == 0){
        etapa18 = 0;
        etapa19 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 18
*/

/* 
* ETAPA 19 (Temporización Paro-Nivel baixo)
*/
  switch (etapa19) {
    case 0:
      // Espera
      break;
    case 1:
      delay(500);
      etapa19 = 0;
      etapa16 = 1;
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 19
*/

/* 
* ETAPA 20 (Determinación estado de alternancia)
*/
  switch (etapa20) {
    case 0:
      // Espera
      break;
    case 1:
      if (alternancia == 0){
        etapa20 = 0;
        etapa21 = 1;
        alternancia = 1;
      }
      else if (alternancia == 1){
        etapa20 = 0;
        etapa22 = 1;
        alternancia = 0;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 20
*/

/* 
* ETAPA 21 (Alternancia 0)
*/
  switch (etapa21) {
    case 0:
      // Espera
      break;
    case 1:
      if (etapa4 == 0 && alternancia == 1 && etapa3 == 1){
        etapa21 = 0;
        etapa16 = 1;
      }
      if (etapa4 == 0 && alternancia == 1 && etapa5 == 1){
        etapa21 = 0;
        etapa16 = 1;
      }
      if (etapa4 == 0 && alternancia == 1 && etapa6 == 1){
        etapa21 = 0;
        etapa16 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 21
*/

/* 
* ETAPA 22 (Alternancia 1)
*/
  switch (etapa22) {
    case 0:
      // Espera
      break;
    case 1:
      if (etapa4 == 0 && alternancia == 0 && etapa3 == 1){
        etapa22 = 0;
        etapa16 = 1;
      }
      if (etapa4 == 0 && alternancia == 0 && etapa5 == 1){
        etapa22 = 0;
        etapa16 = 1;
      }
      if (etapa4 == 0 && alternancia == 0 && etapa6 == 1){
        etapa22 = 0;
        etapa16 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 22
*/

/* 
* ETAPA 23 (Simultaneidade)
*/
  switch (etapa23) {
    case 0:
      // Espera
      break;
    case 1:
      if (etapa5 == 0 && etapa3 == 1){
        etapa23 = 0;
        etapa16 = 1;
      }
      if (etapa5 == 0 && etapa6 == 1){
        etapa23 = 0;
        etapa16 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 23
*/

/* 
* ETAPA 24 (Nivel alto)
*/
  switch (etapa24) {
    case 0:
      // Espera
      break;
    case 1:
      if (etapa6 == 0 && etapa3 == 1){
        etapa24 = 0;
        etapa16 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 24
*/
  
/* 
* ETAPA 25 (Espera rearme)
*/
  switch (etapa25) {
    case 0:
      // Espera
      break;
    case 1:
      if (V_rearme == 1){
        etapa25 = 0;
        etapa0 = 1;   // Etapa 0 (Inicial)
        etapa1 = 0;   // Etapa 1 (Espera nivel analóxico)
        etapa2 = 0;   // Etapa 2 (Nivel 1 - N1)
        etapa3 = 0;   // Etapa 3 (Nivel 2 - N2)
        etapa4 = 0;   // Etapa 4 (Nivel 3 - N3)
        etapa5 = 0;   // Etapa 5 (Nivel 4 - N4)
        etapa6 = 0;   // Etapa 6 (Nivel 5 - N5)
        etapa7 = 0;   // Etapa 7 (Alarma fallo sensor analóxico)
        etapa8 = 0;   // Etapa 8 (Temporización nivel analóxico)
        etapa9 = 0;   // Etapa 9 (Espera nivel de seguranza)
        etapa10 = 0;  // Etapa 10 (Temporización nivel de seguranza)
        etapa11 = 0;  // Etapa 11 (Reset nivel de seguranza)
        etapa12 = 0;  // Etapa 12 (Espera fallo eléctrico)
        etapa13 = 0;  // Etapa 13 (Alarma fallo eléctrico motor 1)
        etapa14 = 0;  // Etapa 14 (Alarma fallo eléctrico motor 2)
        etapa15 = 0;  // Etapa 15 (Alarma fallo eléctrico ambos motores)
        etapa16 = 0;  // Etapa 16 (Espera marcha motores)
        etapa17 = 0;  // Etapa 17 (Nivel baixo)
        etapa18 = 0;  // Etapa 18 (Paro)
        etapa19 = 0;  // Etapa 19 (Temporización Paro-Nivel baixo)
        etapa20 = 0;  // Etapa 20 (Determinación estado de alternancia)
        etapa21 = 0;  // Etapa 21 (Alternancia 0)
        etapa22 = 0;  // Etapa 22 (Alternancia 1)
        etapa23 = 0;  // Etapa 23 (Simultaneidade)
        etapa24 = 0;  // Etapa 24 (Nivel alto)
        etapa25 = 0;  // Etapa 25 (Espera rearme)
        etapa26 = 0;  // Etapa 26 (Espera marcha manual motor 1)
        etapa27 = 0;  // Etapa 27 (Marcha manual motor 1)
        etapa28 = 0;  // Etapa 28 (Espera marcha manual motor 2)
        etapa29 = 0;  // Etapa 29 (Marcha manual motor 2)
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 25
*/

/* 
* ETAPA 26 (Espera marcha manual motor 1)
*/
  switch (etapa26) {
    case 0:
      // Espera
      break;
    case 1:
      if (V_mmotor1 == 1){
        delay(1500);
        etapa26 = 0;
        etapa27 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 26
*/

/* 
* ETAPA 27 (Marcha manual motor 1)
*/
  switch (etapa27) {
    case 0:
      // Espera
      break;
    case 1:
      if (V_mmotor1 == 0){
        etapa27 = 0;
        etapa26 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 27
*/

/* 
* ETAPA 28 (Espera marcha manual motor 2)
*/
  switch (etapa28) {
    case 0:
      // Espera
      break;
    case 1:
      if (V_mmotor2 == 1){
        delay(1500);
        etapa28 = 0;
        etapa29 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 28
*/

/* 
* ETAPA 29 (Marcha manual motor 2)
*/
  switch (etapa29) {
    case 0:
      // Espera
      break;
    case 1:
      if (V_mmotor2 == 0){
        etapa29 = 0;
        etapa28 = 1;
      }
      break;
    default: 
      // Espera
    break;
  }
/* 
* FIN ETAPA 29
*/

/* ----------------------------------------
 * ACTIVAR/DESACTIVAR SAÍDAS
 * ----------------------------------------*/

/* 
* BOMBA 1 (S_motor1)
* Saída a relé. HIGH pecha o contacto.
*/

if (etapa11 == 1 || etapa21 == 1 || etapa23 == 1 || etapa24 == 1 || etapa27 == 1){
    if (etapa13 == 0 && etapa15 == 0){
    digitalWrite(S_motor1,HIGH);
    }
    else if (etapa13 == 1 || etapa15 == 1){
    digitalWrite(S_motor1,LOW);
    }
}
else if (etapa13 == 0 && etapa15 == 0 && etapa22 == 1 && etapa14 == 1){
    digitalWrite(S_motor1,HIGH);
}
else if (etapa13 == 1 || etapa15 == 1){
  digitalWrite(S_motor1,LOW);
}
else if (etapa16 == 1){
  //Espera
}
else{
  digitalWrite(S_motor1,LOW);
}

/* 
* FIN BOMBA1
*/

/* 
* BOMBA 2 (S_motor2)
* Saída a relé. LOW pecha o contacto.
*/

if (etapa11 == 1 || etapa22 == 1 || etapa23 == 1 || etapa24 == 1 || etapa29 == 1){
  if (etapa14 == 0 && etapa15 == 0){
  digitalWrite(S_motor2,HIGH);
}
else if (etapa14 == 1 || etapa15 == 1){
  digitalWrite(S_motor2,LOW);
}
}
else if (etapa14 == 0 && etapa15 == 0 && etapa21 == 1 && etapa13 == 1){
  digitalWrite(S_motor2,HIGH);
}
else if (etapa14 == 1 || etapa15 == 1){
  digitalWrite(S_motor2,LOW);
}
else if (etapa16 == 1){
  //Espera
}
else{
  digitalWrite(S_motor2,LOW);
}

/* 
* FIN BOMBA2
*/

/* 
* ALARMA FALLO ELÉCTRICO (S_alarmafe)
* Saída a relé. HIGH pecha o contacto.
*/

if (etapa13 == 1 || etapa14 == 1 || etapa15 == 1){
  digitalWrite(S_alarmafe,HIGH);
}
else{
  digitalWrite(S_alarmafe,LOW);
}

/* 
* FIN ALARMA FALLO ELÉCTRICO
*/

/* 
* ALARMA NIVEL (S_alarmanivel)
* Saída a relé. HIGH pecha o contacto.
*/

if (etapa7 == 1 || etapa11 == 1 || etapa17 == 1 || etapa24 == 1){
  digitalWrite(S_alarmanivel,HIGH);
}
else{
  digitalWrite(S_alarmanivel,LOW);
}

/* 
* FIN ALARMA NIVEL
*/

/* ----------------------------------------
 * ACTIVAR/DESACTIVAR NOTIFICACIÓNS
 * ----------------------------------------*/

 //Notificación sen alarmas
  lcd.setCursor(0,0);
  lcd.print("CONTROL DE EFLUENTES");
  if (etapa7 != 1){
    lcd.setCursor(0,1);
    lcd.print("Nivel: ");
    lcd.setCursor(7,1);
    if (valornivel < 10){
      lcd.print(" ");
    }
    lcd.print(valornivel);
    lcd.setCursor(9,1);
    lcd.print(" cm    ");
  }
  if (etapa13 != 1 && etapa14 != 1 && etapa15 != 1){
  lcd.setCursor(0,2);
  lcd.print("                    ");
  }
  if (etapa11 != 1 && etapa17 != 1 && etapa24 != 1){
  lcd.setCursor(0,3);
  lcd.print("                    ");
  }
  
// Notificación de reinicio desde etapa 0
if (etapa0 == 1){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("    Iniciando...    ");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("CONTROL DE EFLUENTES");
}
// Notificación de fallo de sensor (etapa 7)
if (etapa7 == 1){
  lcd.setCursor(0,1);
  lcd.print("FALLO DE SENSOR ");
}
// Notificación de fallo eléctrico (etapas 13, 14 ou 15)
if (etapa13 == 1 || etapa14 == 1 || etapa15 == 1){
  lcd.setCursor(0,0);
  lcd.print("CONTROL DE EFLUENTES");
  lcd.setCursor(0,1);
  lcd.print("Nivel: ");
  lcd.setCursor(7,1);
    if (valornivel < 10){
      lcd.print(" ");
    }
  lcd.print(valornivel);
  lcd.setCursor(9,1);
  lcd.print(" cm    ");
  lcd.setCursor(0,2);
  if (etapa13 == 1){
  lcd.print(" FALLO ELECTRICO F1 ");
  }
  else if (etapa14 == 1){
  lcd.print(" FALLO ELECTRICO F2 ");
  }
  else if (etapa15 == 1){
  lcd.print("FALLO ELECTRICO F1+2");
  }
}
// Notificación de nivel de seguranza (etapa 11)
if (etapa11 == 1){
  lcd.setCursor(0,0);
  lcd.print("CONTROL DE EFLUENTES");
  lcd.setCursor(0,1);
  lcd.print("Nivel: ");
  lcd.setCursor(7,1);
    if (valornivel < 10){
      lcd.print(" ");
    }
  lcd.print(valornivel);
  lcd.setCursor(9,1);
  lcd.print(" cm    ");
  lcd.setCursor(0,3);
  lcd.print(" NIVEL DE SEGURANZA ");
}
// Notificación de nivel baixo (etapa 17)
if (etapa17 == 1){
  lcd.setCursor(0,0);
  lcd.print("CONTROL DE EFLUENTES");
  lcd.setCursor(0,1);
  lcd.print("Nivel: ");
  lcd.setCursor(7,1);
    if (valornivel < 10){
      lcd.print(" ");
    }
  lcd.print(valornivel);
  lcd.setCursor(9,1);
  lcd.print(" cm    ");
  lcd.setCursor(0,3);
  lcd.print("    NIVEL BAIXO     ");
}
// Notificación de nivel alto (etapa 24)
if (etapa24 == 1 && etapa11 == 0){
  lcd.setCursor(0,0);
  lcd.print("CONTROL DE EFLUENTES");
  lcd.setCursor(0,1);
  lcd.print("Nivel: ");
  lcd.setCursor(7,1);
    if (valornivel < 10){
      lcd.print(" ");
    }
  lcd.print(valornivel);
  lcd.setCursor(9,1);
  lcd.print(" cm    ");
  lcd.setCursor(0,3);
  lcd.print("     NIVEL ALTO     ");
}
// Notificación de marcha de bombas
if (etapa27 == 1 || etapa29 == 1){
  if (etapa27 == 1 && etapa29 == 0){
  lcd.setCursor(16,1);
  lcd.print("M1  ");
  }
  else if (etapa29 == 1 && etapa27 == 0){
  lcd.setCursor(16,1);
  lcd.print("M  2");
  }
  else if (etapa27 == 1 && etapa29 == 1){
  lcd.setCursor(16,1);
  lcd.print("M1+2");
  }
}
else if (etapa15 == 0 && etapa21 == 1 && etapa13 == 0){
  lcd.setCursor(16,1);
  lcd.print("A1  ");
  }
else if (etapa15 == 0 && etapa22 == 1 && etapa14 == 0){
  lcd.setCursor(16,1);
  lcd.print("A  2");
  }
else if (etapa15 == 0 && etapa11 == 1){
  lcd.setCursor(16,1);
  lcd.print("A1+2");
  }
else if (etapa15 == 0 && etapa23 == 1){
  lcd.setCursor(16,1);
  lcd.print("A1+2");
  }
else if (etapa15 == 0 && etapa24 == 1){
  lcd.setCursor(16,1);
  lcd.print("A1+2");
  }
else if (etapa15 == 0 && etapa21 == 1 && etapa13 == 1){
  lcd.setCursor(16,1);
  lcd.print("A1+2");
  }
else if (etapa15 == 0 && etapa22 == 1 && etapa14 == 1){
  lcd.setCursor(16,1);
  lcd.print("A1+2");
  }
else if (etapa15 == 1){
  lcd.setCursor(16,1);
  lcd.print("OMG!");
  }
else{
  lcd.setCursor(16,1);
  lcd.print("PARO");
}

/* ----------------------------------------
 * DEPURACIÓN
 * ----------------------------------------*/
/*
if (etapa0 == 1){
  Serial.print("E0 ");
}
if (etapa1 == 1){
  Serial.print("E1 ");
}
if (etapa2 == 1){
  Serial.print("E2 ");
}
if (etapa3 == 1){
  Serial.print("E3 ");
}
if (etapa4 == 1){
  Serial.print("E4 ");
}
if (etapa5 == 1){
  Serial.print("E5 ");

if (etapa6 == 1){
  Serial.print("E6 ");
}
if (etapa7 == 1){
  Serial.print("E7 ");
}
if (etapa8 == 1){
  Serial.print("E8 ");
}
if (etapa9 == 1){
  Serial.print("E9 ");
}
if (etapa10 == 1){
  Serial.print("E10 ");
}
if (etapa11 == 1){
  Serial.print("E11 ");
}
if (etapa12 == 1){
  Serial.print("E12 ");
}
if (etapa13 == 1){
  Serial.print("E13 ");
}
if (etapa14 == 1){
  Serial.print("E14 ");
}
if (etapa15 == 1){
  Serial.print("E15 ");
}
if (etapa16 == 1){
  Serial.print("E16 ");
}
if (etapa17 == 1){
  Serial.print("E17 ");
}
if (etapa18 == 1){
  Serial.print("E18 ");
}
if (etapa19 == 1){
  Serial.print("E19 ");
}
if (etapa20 == 1){
  Serial.print("E20 ");
}
if (etapa21 == 1){
  Serial.print("E21 ");
}
if (etapa22 == 1){
  Serial.print("E22 ");
}
if (etapa23 == 1){
  Serial.print("E23 ");
}
if (etapa24 == 1){
  Serial.print("E24 ");
}
if (etapa25 == 1){
  Serial.print("E25 ");
}
if (etapa26 == 1){
  Serial.print("E26 ");
}
if (etapa27 == 1){
  Serial.print("E27 ");
}
if (etapa28 == 1){
  Serial.print("E28 ");
}
if (etapa29 == 1){
  Serial.print("E29 ");
}
*/

}
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module