El oden de los estados en enum altera el comportamiento

#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include <Adafruit_ADS1X15.h>
#include <Relay.h>
#include <Wire.h>
#define I2C_ADDRESS

Adafruit_ADS1115 ads;
LiquidCrystal_I2C lcd(0x27, 20, 4);

const byte relePinA = 8;
const byte relePinB = 9;

const float NIVEL_INFERIOR = 1000.0; // menos de 1000 litros activan alarma falta de agua en cisterna
const float NIVEL_SUPERIOR = 5400.0; // mas de 5400 litros activan alarma de desbordamiento de cisterna 

const unsigned long TIEMPO_ADC0 = 2000UL;
unsigned long tiempoadc0 = 0;


const unsigned long TIEMPO_ALARMA_SUPERIOR = 30000UL; // Tiempo de alarma superior 30 segundos
const unsigned long TIEMPO_ESPERA_SUPERIOR = 1800000UL; // Tiempo de espera superior 30 minutos
const unsigned long TIEMPO_ALARMA_INFERIOR = 30000UL; // Tiempo de alarma inferior 30 segundos
const unsigned long TIEMPO_ESPERA_INFERIOR = 1800000UL; // Tiempo de espera inferior 30 minutos



unsigned long tiempoalarmaSuperior = 0;
unsigned long tiempoalarmaInferior = 0;
unsigned long tiempoesperaSuperior = 0;
unsigned long tiempoesperaInferior = 0;

const unsigned long TIEMPO_PRESENTACION = 5000UL; 

unsigned long tiempoActual = 0;
unsigned long tiempoInicioPresentacion = 0;
unsigned long tiempoPresentacion  = 0;
unsigned long presentacionMostrada = 0;

bool presentacionTerminada = false;
bool alarmaSuperior = false;
bool alarmaInferior = false;

float area;
int Litros;
int centimetros;
int nivel;

enum nivel_cisterna {
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
} estado_cisterna = ESTADO_NIVEL_INFERIOR; 
/*
enum nivel_cisterna {
  ESTADO_NIVEL_SUPERIOR,
  ESTADO_NIVEL_INFERIOR
} estado_cisterna = ESTADO_NIVEL_SUPERIOR; // / este orden activa alarma superior

*/
enum esperas_alarmas {
  ESTADO_TIEMPO_ALARMA_INFERIOR,
  ESTADO_TIEMPO_ALARMA_SUPERIOR,
  ESTADO_TIEMPO_ESPERA_INFERIOR,
  ESTADO_TIEMPO_ESPERA_SUPERIOR
} estado_alarmas = ESTADO_TIEMPO_ALARMA_INFERIOR; // este orden activa alarma inferior


enum estado_presentacion {
  ESTADO_TIEMPO_ACTUAL,
  ESTADO_TIEMPO_INICIO_PRESENTACION,
  ESTADO_TIEMPO_DURACION_PRESENTACION,
  ESTADO_TIEMPO_PRESENTACION_TERMINADA,
  ESTADO_TIEMPO_ADC0
};
estado_presentacion estadoPresentacion = ESTADO_TIEMPO_ACTUAL;

enum tipo_cisterna {
  CISTERNA_CILINDRICA = 1,
  CISTERNA_RECTANGULAR = 2
};


void setup() {
  Wire.begin();
  Serial.begin(9600);
  ads.setGain(GAIN_TWOTHIRDS);
  ads.begin();
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();

  pinMode(relePinA, OUTPUT);
  pinMode(relePinB, OUTPUT);
  digitalWrite(relePinA, HIGH);
  digitalWrite(relePinB, HIGH);
}
float radio = 108; // en cm (para depósito cilíndrico radio) aplica para una cistena de 108 centimetros de radio
float lado1 = 350; // en cm (para depósito rectangular ancho ) aplica para una cistena rectangular de 350centimetros por 400 centimetros 
float lado2 = 350; // en cm (para depósito rectangular largo)  aplica para una cistena rectangular de 350centimetros por 400 centimetros
// descomentar el tipo de sistena que se usara 
//tipo_cisterna tipo = CISTERNA_RECTANGULAR; //rectangular o cuadrada;
tipo_cisterna tipo = CISTERNA_CILINDRICA; //cilindrica;

void loop() {
  switch(tiempoActual){
  if (!presentacionMostrada && millis() - tiempoPresentacion > TIEMPO_PRESENTACION) {
    lcd.setCursor(0, 0);
    lcd.print("  San Isidro ");
    lcd.setCursor(0, 2);
    lcd.print(" Alarma Cisterna ");
    tiempoPresentacion = millis(); // Reiniciar tiempo de presentación
    presentacionMostrada = true;
  }
    break;
  }

  unsigned long tiempoActual = millis(); // Obtener el tiempo actual
  if (millis() - tiempoadc0 > 2000UL) {
    unsigned long adcValue = ads.readADC_SingleEnded(0);
    
    float centimetros;
    float litros;

    switch (tipo ) {
      case CISTERNA_CILINDRICA:
        if (tipo == CISTERNA_CILINDRICA) {
          float areaCilindrica;
          areaCilindrica = 3.141592 * radio * radio;
          centimetros = adcValue / 53.40;
          litros = (areaCilindrica / 1000.0) * (adcValue / 53.40); //conversión de bits a centimetros
        }
        break;
      case CISTERNA_RECTANGULAR:
        float areaRectangular;
        if (tipo == CISTERNA_RECTANGULAR) {
          areaRectangular = lado1 * lado2;
          centimetros = adcValue / 53.40;
          litros = (areaRectangular / 1000.0) * (adcValue / 53.40); //conversión de bits a centimetros
        }
        break;
    }
    switch (nivel) {
        case ESTADO_NIVEL_SUPERIOR:
      if (litros > NIVEL_SUPERIOR) {
      if (!alarmaSuperior) {
        alarmaSuperior = true;
        tiempoalarmaSuperior = millis();
        Serial.println("Alarma Superior Activada");
        digitalWrite(relePinB, LOW);
      } else {
        if (millis() - tiempoalarmaSuperior >= TIEMPO_ALARMA_SUPERIOR) {
          digitalWrite(relePinB, HIGH);
          if (!tiempoesperaSuperior) {
            tiempoesperaSuperior = millis();
            Serial.println("Alarma Superior Desactivada");
          } else if (millis() - tiempoesperaSuperior >= TIEMPO_ESPERA_SUPERIOR) {
            alarmaSuperior = false;
            tiempoesperaSuperior = 0;
          } else {
            Serial.println("Esperando...");
          }
        }
      }
    } else {
      alarmaSuperior = false;
      digitalWrite(relePinB, HIGH);
      tiempoesperaSuperior = millis();
    }
break;

      case ESTADO_NIVEL_INFERIOR:
        if (litros < NIVEL_INFERIOR) {
          if (!alarmaInferior) {
            alarmaInferior = true;
            tiempoalarmaInferior = millis();
            Serial.println("Alarma Inferior Activada");
            digitalWrite(relePinA, LOW);
          } else {
            if (millis() - tiempoalarmaInferior >= TIEMPO_ALARMA_INFERIOR) {
              digitalWrite(relePinA, HIGH);
              if (!tiempoesperaInferior) {
                tiempoesperaInferior = millis();
                Serial.println("Alarma Inferior Desactivada");
              } else if (millis() - tiempoesperaInferior >= TIEMPO_ESPERA_INFERIOR) {
                alarmaInferior = false;
                tiempoesperaInferior = 0;
              } else {
                Serial.println("Esperando...");
              }
            }
          }
        } else {
          alarmaInferior = false;
          digitalWrite(relePinA, HIGH);
          tiempoesperaInferior = millis();
        }
        break;
    }


    // Imprimir valores
    Serial.println("");
    Serial.print("bits: ");
    Serial.println(adcValue);
    Serial.println("");
    Serial.print("Litros: ");
    Serial.println(litros);
    Serial.print("Centímetros: ");
    Serial.println(centimetros);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("bits. " );
    lcd.print(adcValue);
    lcd.setCursor(0, 1);
    lcd.print("Lts.      ");
    lcd.print(litros);
    lcd.setCursor(0, 3);
    lcd.print("Cm.       ");
    lcd.print(centimetros);
    tiempoadc0  = millis();
  }
}

Hola, tengo un problema si cambio el orden en enum cambia la alarma que se activa y la otra ya no funciona, el problema reside entre las líneas 54 y 65. tampoco inicia presentación, en ocasiones consigo que funcione pero mezclada con los datos

enum nivel_cisterna {
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
} estado_cisterna = ESTADO_NIVEL_INFERIOR; 
/*
enum nivel_cisterna {
  ESTADO_NIVEL_SUPERIOR,
  ESTADO_NIVEL_INFERIOR
} estado_cisterna = ESTADO_NIVEL_SUPERIOR; // / este orden activa alarma superior

*/

ahora estando comentada de 54 a 59 funciona alarma inferior y si des comento estas líneas y comento 49 a 53 funciona la alarma superior.

¿Por qué nivel es tipo int y no tipo nivel_cisterna?

¿Qué sentido tiene crear un tipo enum si luego no lo usas como tal?

Hola MaximoEsfuerzo en realidad tipo es para definir el tipo de cisterna, ya sea cilíndrica o rectangular, y nivel es para establecer el punto donde las alarmas se activaran, si es que comprendí tu pregunta, creo que en una de tantas prueba y error al poner tipo cisterna, me dio error y tipo funciono es de las pocas partes del código que si funciona, si cambia de cilíndrica a rectangular. El problema son las alarmas si consigo que se active nivel superior no se activa nivel inferior o viceversa, y el lcd que no hace la presentación. ES un código de un hilo viejo que ahora me dio por mejorar, lo hace como un año le hice lo de las alarmas que solo se activen 30 segundos cada 30 minutos y funciona muy bien ahora como parte de mi deseo de aprender a codificar en maquina de estados finitos te muestro el código.

#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include <Adafruit_ADS1X15.h>

#include <Relay.h>
#include <Wire.h>
#define I2C_ADDRESS

Adafruit_ADS1115 ads;
LiquidCrystal_I2C lcd(0x27, 20, 4);

const float NIVEL_INFERIOR = 1000.0;
const float NIVEL_SUPERIOR = 5400.0;

const byte relePinA = 8;
const byte relePinB = 9;

const unsigned long TIEMPO_ADC0 = 1000UL;
unsigned long tiempoadc0 = 0;

// Agregamos estas variables para controlar las alarmas
const unsigned long TIEMPO_ALARMA = 30000UL; // 30 segundos
const unsigned long TIEMPO_ESPERA = 1800000UL; // 30 minutos

unsigned long tiempoalarmaSuperior = 0;
unsigned long tiempoalarmaInferior = 0;
unsigned long tiempoesperaSuperior = 0;
unsigned long tiempoesperaInferior = 0;

unsigned long tiempoActual = 0;
unsigned long tiempoInicioPresentacion = 0;
unsigned long duracionPresentacion = 10000;
bool presentacionTerminada = false;

bool alarmaSuperior = false;
bool alarmaInferior = false;

float area;

enum estados_l {
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
} estado = A0;

void setup(void) {

  Wire.begin();
  Serial.begin(9600);
  ads.setGain(GAIN_TWOTHIRDS);
  ads.begin();
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();

  pinMode(relePinA, OUTPUT);
  pinMode(relePinB, OUTPUT);
  digitalWrite(relePinA, HIGH);
  digitalWrite(relePinB, HIGH);
  tiempoadc0 = millis();
}
//////////////////////////7/ Variables para las dimensiones del depósito/////////////////////////
float radio = 108; // en cm (para depósito cilíndrico radio)
float lado1 = 400; // en cm (para depósito rectangular ancho )
float lado2 = 350; // en cm (para depósito rectangular largo)
int tipo_cisterna = 1; // 1 para cisterna cilíndrica, 2 para cisterna rectangular

void loop() {
 unsigned long tiempoActual = millis(); // Obtener el tiempo actual

  // Inicia la presentación si no ha terminado
  if (!presentacionTerminada) {
    if (tiempoInicioPresentacion == 0) {
      tiempoInicioPresentacion = tiempoActual; // Establecer el tiempo de inicio de la presentación
    }
    
    // Verificar si la duración de la presentación aún no ha sido alcanzada
    if (tiempoActual - tiempoInicioPresentacion < duracionPresentacion) {
      lcd.setCursor(0, 0);
      lcd.print("     San Isidro");
      lcd.setCursor(0, 2);
      lcd.print("   Nivel Cisterna");
    } else { 
      // Finalizar la presentación después de la duración especificada
      presentacionTerminada = true;
    }
  }

  // Verificar si la presentación ha terminado
  if (!presentacionTerminada) {
    // Resto del código de la presentación...
  } else {
  ///////////////////////////////////////////lecturas y conversiones///////////////////////////////
  if (millis() - tiempoadc0 > 1000UL) {
    tiempoadc0 = millis();
    unsigned long adcValue = ads.readADC_SingleEnded(0);
    float area;
    float litros;
    float centimetros;
    // Cálculo del área según el tipo de cisterna
    if (tipo_cisterna == 1) {
      // Cálculo del área para depósito cilíndrico
      area = 3.141592 * radio * radio;
    } else {
      // Cálculo del área para depósito rectangular
      area = lado1 * lado2;
    }
    // Conversión de ADC a centímetros
    centimetros = adcValue / 53.40;

    // Conversión de centímetros cuadrados a litros
    litros = (area / 1000.0) * (adcValue / 53.40); // 1 litro = 1000 cm³, 53.40 es un factor de conversión

    // Conversión de ADC a centímetros
    centimetros = adcValue / 53.40;

    ////////////////////////////////////////ALARMA INFERIOR//////////////////////////////////////////

    if (litros < NIVEL_INFERIOR) {
      if (!alarmaInferior) {
        alarmaInferior = true;
        tiempoalarmaInferior = millis();
        Serial.println("Alarma Inferior Activada");
        digitalWrite(relePinA, LOW);
      } else {
        if (millis() - tiempoalarmaInferior >= TIEMPO_ALARMA) {
          digitalWrite(relePinA, HIGH);
          if (!tiempoesperaInferior) {
            tiempoesperaInferior = millis();
            Serial.println("Alarma Inferior Desactivada");
          } else if (millis() - tiempoesperaInferior >= TIEMPO_ESPERA) {
            alarmaInferior = false;
            tiempoesperaInferior = 0;
          } else {
            Serial.println("Esperando...");
          }
        }
      }
    } else {
      alarmaInferior = false;
      digitalWrite(relePinA, HIGH);
      tiempoesperaInferior = millis();
    }
    /////////////////////////////////////////ALARMA SUPERIOR//////////////////////////////
    if (litros > NIVEL_SUPERIOR) {
      if (!alarmaSuperior) {
        alarmaSuperior = true;
        tiempoalarmaSuperior = millis();
        Serial.println("Alarma Superior Activada");
        digitalWrite(relePinB, LOW);
      } else {
        if (millis() - tiempoalarmaSuperior >= TIEMPO_ALARMA) {
          digitalWrite(relePinB, HIGH);
          if (!tiempoesperaSuperior) {
            tiempoesperaSuperior = millis();
            Serial.println("Alarma Superior Desactivada");
          } else if (millis() - tiempoesperaSuperior >= TIEMPO_ESPERA) {
            alarmaSuperior = false;
            tiempoesperaSuperior = 0;
          } else {
            Serial.println("Esperando...");
          }
        }
      }
    } else {
      alarmaSuperior = false;
      digitalWrite(relePinB, HIGH);
      tiempoesperaSuperior = millis();
    }

    // Imprimir valores
    Serial.println("");
    Serial.print("bits: ");
    Serial.println(adcValue);
    Serial.println("");
    Serial.print("Litros: ");
    Serial.println(litros);
    Serial.print("Centímetros: ");
    Serial.println(centimetros);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("bits. " );
    lcd.print(adcValue);
    lcd.setCursor(0, 1);
    lcd.print("Lts.      ");
    lcd.print(litros);
    lcd.setCursor(0, 3);
    lcd.print("Cm.       ");
    lcd.print(centimetros);
    tiempoadc0  = millis();
  }
}
}

Asi como funciona este quiero que funcione el que me trajo por aquí de regreso después de tanto tiempo, Saludos .

Lo que te estoy tratando de decirte es, ya que declaraste un enum para los niveles, que nivel la declares de tipo nivel_cisterna.
Tené en cuenta que el valor asociado al enum cambia según el orden en que lo declares, por eso no es buena idea usar otro tipo de variable (aunque claramente se puede).

Ok lo hago y te comento como funciono, gracias MaximoEsfuerzo

#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include <Adafruit_ADS1X15.h>
#include <Relay.h>
#include <Wire.h>
#define I2C_ADDRESS

Adafruit_ADS1115 ads;
LiquidCrystal_I2C lcd(0x27, 20, 4);

const byte relePinA = 8;
const byte relePinB = 9;

const float NIVEL_INFERIOR = 1000.0; // menos de 1000 litros activan alarma falta de agua en cisterna
const float NIVEL_SUPERIOR = 5400.0; // mas de 5400 litros activan alarma de desbordamiento de cisterna 

const unsigned long TIEMPO_ADC0 = 2000UL;
unsigned long tiempoadc0 = 0;


const unsigned long TIEMPO_ALARMA_SUPERIOR = 30000UL; // Tiempo de alarma superior 30 segundos
const unsigned long TIEMPO_ESPERA_SUPERIOR = 1800000UL; // Tiempo de espera superior 30 minutos
const unsigned long TIEMPO_ALARMA_INFERIOR = 30000UL; // Tiempo de alarma inferior 30 segundos
const unsigned long TIEMPO_ESPERA_INFERIOR = 1800000UL; // Tiempo de espera inferior 30 minutos



unsigned long tiempoalarmaSuperior = 0;
unsigned long tiempoalarmaInferior = 0;
unsigned long tiempoesperaSuperior = 0;
unsigned long tiempoesperaInferior = 0;

const unsigned long TIEMPO_PRESENTACION = 5000UL; 

unsigned long tiempoActual = 0;
unsigned long tiempoInicioPresentacion = 0;
unsigned long tiempoPresentacion  = 0;
unsigned long presentacionMostrada = 0;

bool presentacionTerminada = false;
bool alarmaSuperior = false;
bool alarmaInferior = false;

float area;
int Litros;
int centimetros;
int nivel;

enum nivel_cisterna {
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
} estado_cisterna = ESTADO_NIVEL_INFERIOR; 
/*
enum nivel_cisterna {
  ESTADO_NIVEL_SUPERIOR,
  ESTADO_NIVEL_INFERIOR
} estado_cisterna = ESTADO_NIVEL_SUPERIOR; // / este orden activa alarma superior

*/
enum esperas_alarmas {
  ESTADO_TIEMPO_ALARMA_INFERIOR,
  ESTADO_TIEMPO_ALARMA_SUPERIOR,
  ESTADO_TIEMPO_ESPERA_INFERIOR,
  ESTADO_TIEMPO_ESPERA_SUPERIOR
} estado_alarmas = ESTADO_TIEMPO_ALARMA_INFERIOR; // este orden activa alarma inferior


enum estado_presentacion {
  ESTADO_TIEMPO_ACTUAL,
  ESTADO_TIEMPO_INICIO_PRESENTACION,
  ESTADO_TIEMPO_DURACION_PRESENTACION,
  ESTADO_TIEMPO_PRESENTACION_TERMINADA,
  ESTADO_TIEMPO_ADC0
};
estado_presentacion estadoPresentacion = ESTADO_TIEMPO_ACTUAL;

enum tipo_cisterna {
  CISTERNA_CILINDRICA = 1,
  CISTERNA_RECTANGULAR = 2
};


void setup() {
  Wire.begin();
  Serial.begin(9600);
  ads.setGain(GAIN_TWOTHIRDS);
  ads.begin();
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();

  pinMode(relePinA, OUTPUT);
  pinMode(relePinB, OUTPUT);
  digitalWrite(relePinA, HIGH);
  digitalWrite(relePinB, HIGH);
}
float radio = 108; // en cm (para depósito cilíndrico radio) aplica para una cistena de 108 centimetros de radio
float lado1 = 350; // en cm (para depósito rectangular ancho ) aplica para una cistena rectangular de 350centimetros por 400 centimetros 
float lado2 = 350; // en cm (para depósito rectangular largo)  aplica para una cistena rectangular de 350centimetros por 400 centimetros
// descomentar el tipo de sistena que se usara 
//tipo_cisterna tipo = CISTERNA_RECTANGULAR; //rectangular o cuadrada;
tipo_cisterna tipo = CISTERNA_CILINDRICA; //cilindrica;

void loop() {
  switch(tiempoActual){
  if (!presentacionMostrada && millis() - tiempoPresentacion > TIEMPO_PRESENTACION) {
    lcd.setCursor(0, 0);
    lcd.print("  San Isidro ");
    lcd.setCursor(0, 2);
    lcd.print(" Alarma Cisterna ");
    tiempoPresentacion = millis(); // Reiniciar tiempo de presentación
    presentacionMostrada = true;
  }
    break;
  }

  unsigned long tiempoActual = millis(); // Obtener el tiempo actual
  if (millis() - tiempoadc0 > 2000UL) {
    unsigned long adcValue = ads.readADC_SingleEnded(0);
    
    float centimetros;
    float litros;

    switch (tipo ) {
      case CISTERNA_CILINDRICA:
        if (tipo == CISTERNA_CILINDRICA) {
          float areaCilindrica;
          areaCilindrica = 3.141592 * radio * radio;
          centimetros = adcValue / 53.40;
          litros = (areaCilindrica / 1000.0) * (adcValue / 53.40); //conversión de bits a centimetros
        }
        break;
      case CISTERNA_RECTANGULAR:
        float areaRectangular;
        if (tipo == CISTERNA_RECTANGULAR) {
          areaRectangular = lado1 * lado2;
          centimetros = adcValue / 53.40;
          litros = (areaRectangular / 1000.0) * (adcValue / 53.40); //conversión de bits a centimetros
        }
        break;
    }
    switch (nivel_cisterna) {
        case ESTADO_NIVEL_SUPERIOR:
      if (litros > NIVEL_SUPERIOR) {
      if (!alarmaSuperior) {
        alarmaSuperior = true;
        tiempoalarmaSuperior = millis();
        Serial.println("Alarma Superior Activada");
        digitalWrite(relePinB, LOW);
      } else {
        if (millis() - tiempoalarmaSuperior >= TIEMPO_ALARMA_SUPERIOR) {
          digitalWrite(relePinB, HIGH);
          if (!tiempoesperaSuperior) {
            tiempoesperaSuperior = millis();
            Serial.println("Alarma Superior Desactivada");
          } else if (millis() - tiempoesperaSuperior >= TIEMPO_ESPERA_SUPERIOR) {
            alarmaSuperior = false;
            tiempoesperaSuperior = 0;
          } else {
            Serial.println("Esperando...");
          }
        }
      }
    } else {
      alarmaSuperior = false;
      digitalWrite(relePinB, HIGH);
      tiempoesperaSuperior = millis();
    }
break;

      case ESTADO_NIVEL_INFERIOR:
        if (litros < NIVEL_INFERIOR) {
          if (!alarmaInferior) {
            alarmaInferior = true;
            tiempoalarmaInferior = millis();
            Serial.println("Alarma Inferior Activada");
            digitalWrite(relePinA, LOW);
          } else {
            if (millis() - tiempoalarmaInferior >= TIEMPO_ALARMA_INFERIOR) {
              digitalWrite(relePinA, HIGH);
              if (!tiempoesperaInferior) {
                tiempoesperaInferior = millis();
                Serial.println("Alarma Inferior Desactivada");
              } else if (millis() - tiempoesperaInferior >= TIEMPO_ESPERA_INFERIOR) {
                alarmaInferior = false;
                tiempoesperaInferior = 0;
              } else {
                Serial.println("Esperando...");
              }
            }
          }
        } else {
          alarmaInferior = false;
          digitalWrite(relePinA, HIGH);
          tiempoesperaInferior = millis();
        }
        break;
    }


    // Imprimir valores
    Serial.println("");
    Serial.print("bits: ");
    Serial.println(adcValue);
    Serial.println("");
    Serial.print("Litros: ");
    Serial.println(litros);
    Serial.print("Centímetros: ");
    Serial.println(centimetros);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("bits. " );
    lcd.print(adcValue);
    lcd.setCursor(0, 1);
    lcd.print("Lts.      ");
    lcd.print(litros);
    lcd.setCursor(0, 3);
    lcd.print("Cm.       ");
    lcd.print(centimetros);
    tiempoadc0  = millis();
  }
}
D:\Users\Silvia\Documents\Arduino NvMeK\arduino-1.8.19\portable\sketchbook\cisterna_nivel_alarmas\cisterna_nivel_alarmas.ino: In function 'void loop()':
cisterna:139:27: error: expected primary-expression before ')' token
     switch (nivel_cisterna) {
                           ^
exit status 1
expected primary-expression before ')' token

Me da este error, ya recuerdo que por eso hice el cambio para que copilara y veo que posiblemente alguna llave este mal posicionada y por eso fallan las alarmas.

Declarando esto en global desaparece el error // " int nivel_cisterna; " No se si sea correcto

@silvia96 Por favor no edites el código. Llevo un rato tratando de entender este comentario de @MaximoEsfuerzo y resulta que ya está modificado.

En lo sucesivo postea las modificaciones al código en lugar de modificarlas in situ

El comentario es por el código de #1, no está modificado

int nivel;

enum nivel_cisterna {
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
} estado_cisterna = ESTADO_NIVEL_INFERIOR; 

Y luego

switch (nivel) { 
  case ESTADO_NIVEL_SUPERIOR:

Hola @mancera1979, te pido una disculpa pensé que nadie lo estaba viendo no se repite.
Saludos

#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include <Adafruit_ADS1X15.h>
#include <Relay.h>
#include <Wire.h>

Adafruit_ADS1115 ads;
LiquidCrystal_I2C lcd(0x27, 20, 4);

const byte relePinA = 8;
const byte relePinB = 9;

const float NIVEL_INFERIOR = 1000.0; 
const float NIVEL_SUPERIOR = 5400.0; 

const unsigned long TIEMPO_ADC0 = 2000UL;
unsigned long tiempoadc0 = 0;

const unsigned long TIEMPO_ALARMA_SUPERIOR = 30000UL; 
const unsigned long TIEMPO_ESPERA_SUPERIOR = 1800000UL; 
const unsigned long TIEMPO_ALARMA_INFERIOR = 30000UL; 
const unsigned long TIEMPO_ESPERA_INFERIOR = 1800000UL; 

unsigned long tiempoalarmaSuperior = 0;
unsigned long tiempoalarmaInferior = 0;
unsigned long tiempoesperaSuperior = 0;
unsigned long tiempoesperaInferior = 0;

const unsigned long TIEMPO_PRESENTACION = 4000UL;
unsigned long tiempoInicioPresentacion = 0;
unsigned long tiempoPresentacion  = 0;
bool presentacionMostrada = false;

bool alarmaSuperior = false;
bool alarmaInferior = false;
float centimetros;
float litros;

float area;
byte  nivel_cisterna;

enum nivel_cisterna {
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
};

/*
enum nivel_cisterna {
  ESTADO_NIVEL_SUPERIOR,
  ESTADO_NIVEL_INFERIOR
};
*/

enum presentacion {
  ESTADO_TIEMPO_ACTUAL,
  ESTADO_TIEMPO_INICIO_PRESENTACION,
  ESTADO_TIEMPO_DURACION_PRESENTACION,
  ESTADO_TIEMPO_PRESENTACION_TERMINADA,
  ESTADO_TIEMPO_ADC0
};
presentacion Presentacion = ESTADO_TIEMPO_ACTUAL;

enum tipo_cisterna {
  CISTERNA_CILINDRICA = 1,
  CISTERNA_RECTANGULAR = 2
};


void setup() {
  Wire.begin();
  Serial.begin(9600);
  ads.setGain(GAIN_TWOTHIRDS);
  ads.begin();
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();

  pinMode(relePinA, OUTPUT);
  pinMode(relePinB, OUTPUT);
  digitalWrite(relePinA, HIGH);
  digitalWrite(relePinB, HIGH);
}
float radio = 108;
float lado1 = 350;
float lado2 = 350;
tipo_cisterna tipo = CISTERNA_CILINDRICA;

void loop() {
  presentar();

  if (millis() - tiempoadc0 > 2000UL) {
    unsigned long adcValue = ads.readADC_SingleEnded(0);

    switch (tipo ) {

      case CISTERNA_CILINDRICA:
        if (tipo == CISTERNA_CILINDRICA) {
          float areaCilindrica;
          areaCilindrica = 3.141592 * radio * radio;
          centimetros = adcValue / 53.40;
          litros = (areaCilindrica / 1000.0) * (adcValue / 53.40);
        }
        break;
      case CISTERNA_RECTANGULAR:
        float areaRectangular;
        if (tipo == CISTERNA_RECTANGULAR) {
          areaRectangular = lado1 * lado2;
          centimetros = adcValue / 53.40;
          litros = (areaRectangular / 1000.0) * (adcValue / 53.40);
        }
        break;
    }

    switch (nivel_cisterna) {

      case ESTADO_NIVEL_SUPERIOR:
        if (litros > NIVEL_SUPERIOR) {
          if (!alarmaSuperior) {
            alarmaSuperior = true;
            tiempoalarmaSuperior = millis();
            Serial.println("Alarma Superior Activada");
            digitalWrite(relePinB, LOW);
          } else {
            if (millis() - tiempoalarmaSuperior >= TIEMPO_ALARMA_SUPERIOR) {
              digitalWrite(relePinB, HIGH);
              if (!tiempoesperaSuperior) {
                tiempoesperaSuperior = millis();
                Serial.println("Alarma Superior Desactivada");
              } else if (millis() - tiempoesperaSuperior >= TIEMPO_ESPERA_SUPERIOR) {
                alarmaSuperior = false;
                tiempoesperaSuperior = 0;
              } else {
                Serial.println("Esperando...");
              }
            }
          }
        } else {
          alarmaSuperior = false;
          digitalWrite(relePinB, HIGH);
          tiempoesperaSuperior = millis();
        }
        break;

      case ESTADO_NIVEL_INFERIOR:
        if (litros < NIVEL_INFERIOR) {
          if (!alarmaInferior) {
            alarmaInferior = true;
            tiempoalarmaInferior = millis();
            Serial.println("Alarma Inferior Activada");
            digitalWrite(relePinA, LOW);
          } else {
            if (millis() - tiempoalarmaInferior >= TIEMPO_ALARMA_INFERIOR) {
              digitalWrite(relePinA, HIGH);
              if (!tiempoesperaInferior) {
                tiempoesperaInferior = millis();
                Serial.println("Alarma Inferior Desactivada");
              } else if (millis() - tiempoesperaInferior >= TIEMPO_ESPERA_INFERIOR) {
                alarmaInferior = false;
                tiempoesperaInferior = 0;
              } else {
                Serial.println("Esperando...");
              }
            }
          }
        } else {
          alarmaInferior = false;
          digitalWrite(relePinA, HIGH);
          tiempoesperaInferior = millis();
        }
        break;
    }

    Serial.println("");
    Serial.print("bits: ");
    Serial.println(adcValue);
    Serial.println("");
    Serial.print("Litros: ");
    Serial.println(litros);
    Serial.print("Centímetros: ");
    Serial.println(centimetros);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("bits. " );
    lcd.print(adcValue);
    lcd.setCursor(0, 1);
    lcd.print("Lts.      ");
    lcd.print(litros);
    lcd.setCursor(0, 3);
    lcd.print("Cm.       ");
    lcd.print(centimetros);
    tiempoadc0  = millis();
  }
}

void presentar() {
  if (!presentacionMostrada) {
    lcd.setCursor(0, 0);
    lcd.print("     San Isidro");
    lcd.setCursor(0, 2);
    lcd.print("   Nivel Cisterna");
    delay(3000);
    presentacionMostrada = true;
  }
}


Hola, en este código ya no hay que preocuparse por el LCD Presentación, ya esta funcionando. Pero si persiste la falla de las alarmas, ya sea superior o inferior dependiendo del orden de enum nivel_cisterna entre las líneas 42 y 52. Saludos

byte  nivel_cisterna;

enum nivel_cisterna {
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
};

Cambiaste 2 bytes por 1 byte, cambiaste el nombre de la variable (encima es confuso porque la variable tiene el mismo nombre que el enum) pero seguimos igual.

Es tan simple como (basado en código #1)

nivel_cisterna nivel;

Obviamente declarado luego del enum.

O sea nivel no es ni int ni byte es tipo nivel_cisterna que es un tipo enum con 2 valores posibles (ESTADO_NIVEL_INFERIOR y ESTADO_NIVEL_SUPERIOR)

Hola, @MaximoEsfuerzo, a si de fácil solo cambio "nivel_cisterna nivel;" por "byte nivel_cisterna" esto tambien resulta inutil " estado_cisterna = ESTADO_NIVEL_INFERIOR" deja y hago el cambio y te veo mas tarde o mañana Gracias

Creo que no estás entendiendo el sentido del tipo enum, porque vale aclarar que enum es un tipo de datos.
Si defines un enum, úsalo, sino da lo mismo que hacer

#define ESTADO_NIVEL_INFERIOR 0
#define ESTADO_NIVEL_SUPERIOR 1

Lo que vos estás haciendo es como cambiar boolean por byte

byte estado = true;
if (estado != false) {
  // lo que sea
}

Se compila y se ejecuta pero ¿es correcto?

Hola @MaximoEsfuerzo, ya hice los cambio sugeridos pero el error continua.
Saludos

¿En qué parte del código cambia el estado de nivel o nivel_cisterna?
Porque solo veo la inicialización por defecto (0) en la declaración.

Y por eso te cambia lo que hace según como declares el enum, porque el primer ítem por defecto equivale a 0.

Como digo, no has entendido como se trabaja con enum y, como de costumbre, te precipitas y empiezas a cambiar el código sin entender realmente donde está el problema.

En este caso, la variable nivel, o como la termines llamando, no refleja el nivel de la cisterna porque siempre contiene 0.

Saludos

MaximoEsfuerzo tiene razon. O bien usas nivel_cisterna como un ENUM o bien como un byte, pero estas usandolo a medias y mal.
Con ENUM deberia ser:

enum nivel_cisterna {
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
};
nivel_cisterna nivel = ESTADO_NIVEL_INFERIOR;  // valor inicial

Luego en el switch/case ya estaria bien, pero con la variable nivel.

    switch ( nivel) {
      case ESTADO_NIVEL_SUPERIOR:
          /*
            ... 
            etc
          */
        break;
      case ESTADO_NIVEL_INFERIOR:
          /*
            ... 
            etc
          */
        break;
    }

Aunque no veo donde se modifica la variable de un nivel a otro.

Antes cambiaba segun el order porque el ENUM le asigna valores consecutivos a cada elemento: 0, 1, 2... Por lo tanto el valor cambia si cambias el orden. Pero si siempre comparas contra el nombre no tiene importancia que valor tenga.

Mirate esto: Funcionamiento de ENUM: C++ Enumeration

Por otro lado, en el otro SWITCH/CASE el IF es completamente redundante:

    switch (tipo ) {

      case CISTERNA_CILINDRICA:
        if (tipo == CISTERNA_CILINDRICA) {
           ....

El IF sobra completamente, porque el CASE hace lo mismo. Solo entrara en el CASE si tipo == CISTERNA_CILINDRICA No hay que volver a comprobarlo.
No produce ningun error, pero es redundante y confuso.

Hola @gromit1, partiremos de que no se nada del tema. Pregunta; al decir que inicia en 0 (cero) te refieres a que son 0 volts LOW estado bajo. O te refieres que case 0: case 1: case 2: ... si el caso es que inicia en case 0: tengo que llamara case 1: dese case 0:?, para hacer la transición de estado 0 a 1. Por otro lado me dices que si comparo contra el nombre, de forma correcta no importa si es case 1 2 3 4 5 6, en mi caso iría al case que la cantidad de litros predeterminados en global para cada caso?, si es así me das un ejemplo de como comparar contra el nombre que ahora mismo no se cual sea el nombre si es nivel, litros, alarma, superior, inferior, y compararlo con que exactamente. " Aunque no veo donde se modifica la variable de un nivel a otro." en realidad pensando lo mucho yo tampoco veo esa transición, de un nivel a otro, intentare explicarte: como lo veo yo, una sonda que mide presión (4-20mA), la señal creada pasa por un conversor de corriente a voltaje, y esa señal analógica pasa por un conversor de analógico a digital (I2C), que entrega de 0 a 32000 bits (Arduino 0 a 1023), que Arduino convierte en centímetros y centímetros a litros, y la cantidad de litros activan las alarmas, inferior menos de 1000 litros, superior mas 5400 litros, pero en este código tienes razón no hay nada que relacione litros con nivel.