El oden de los estados en enum altera el comportamiento

Hola @gromit1 @MaximoEsfuerzo, no lograba entender lo de llamar o comparar en realidad toda vía no lo tengo claro para mi misma lo primero que hice fue ir a global y decir que litros = a nivel;
litros == nivel; intentando comparar para no hacer explicación mas larga termine haciendo un if pero gromit me señalo que los if resultaban redundantes dentro de los case así que lo deje fuera y toda vía no se si estoy comparando llamando o concediendo la a nivel las cualidades de litros creo que con esto resolveré o al menos avanzasen, con media de docena de códigos que al parecer cojean de la misma pata

 if (litros < NIVEL_INFERIOR) {
  nivel = ESTADO_NIVEL_INFERIOR;
} else if (litros > NIVEL_SUPERIOR) {
  nivel = ESTADO_NIVEL_SUPERIOR;
}

Yo creo que hay formas mas ortodoxas de hacer lo mismo si hay alguna sugerencia es bienvenida.
Nota; creo que en ocasiones cuando queremos explicarle algo a alguien terminamos encontrando la respuesta en uno mismo

Hola Silvia,
de hecho no te falta mucho para arreglarlo, pero si que tienes que aclararte. Iria bien que miraras algun curso o tutorial de programacion basica en Arduino o en C++. Solo seran unas horas pero te ayudaran a entender y practicar las cosas mas basicas.

La aplicacion no es dificil, aunque tienes un poco de lio. Entiendo que lees la altura del nivel en adcValue, luego calculas el area y con ello los litros. Ademas guardas en una variable el estado del deposito, que puede ser: ESTADO_NIVEL_INFERIOR o ESTADO_NIVEL_SUPERIOR.

Como comentas, esto ya estaria bien para actualizar el estado:

 if (litros < NIVEL_INFERIOR) {
  nivel = ESTADO_NIVEL_INFERIOR;
} else if (litros > NIVEL_SUPERIOR) {
  nivel = ESTADO_NIVEL_SUPERIOR;
}

¿Faltaria tal vez un estado intermedio o normal? cuando esta entre los dos valores, por la mitad.

Despues de esas lineas ya tendrias en nivel el estado del deposito. Entonces a continuacion en funcion de la variable nivel y de los tiempos haces el resto de acciones.
Si no quieres usar SWITCH/CASE puede hacerlo directamente con IF/ELSE. Como quieras. Por ejemplo:

if( nivel == ESTADO_NIVEL_SUPERIOR){
    alarmaSuperior = true;
    alarmaInferior = false;
    // resto de acciones
    // bla, bla
    // bla, bla
} else if( nivel == ESTADO_NIVEL_INFERIOR){
    alarmaInferior = true;
    alarmaSuperior = false;
    // resto de acciones
    // bla, bla
    // bla, bla
}
else { // ni inferior ni superior
  // deactivar ambas alarmas... ?
}

Faltaria añadir el calculo del tiempo a la activacion de las alarmas, etc. No me lo he mirado.

El calculo del area lo puedes sacar fuera del loop y ponerlo en el setup, porque el area no va cambiar a cada vuelta del loop. Asi simplificas mucho el codido.

En el setup, calcula el area en una variable global que se llame area, para ambos casos: cilindrico o rectangular. Luego en el loop simplemente calcula los litros, solo una vez, sin SWITCH ni IF ni nada, directamente asi:

litros = ( area / 1000.0) * (adcValue / 53.40);

Seguramente hay mas cosas que puedes simplificar.

Prueba y avanza hasta donde puedas. Vuelve a poner el codigo en un nuevo comentario con las dudas o problemas que queden.

Hola @gromit1, con esto ya no se bloquea, va al case que corresponde ya sea INFERIOR o SUPERIOR, y si seguiré usando SWITCH/CASE, que mi idea es aprender a programar en maquina de estados finitos, este mismo código ya lo tengo en fi/else hace tiempo. El calculo de bits, centímetros, litros. original mente esta en void setup pero un cliente que tengo que es programador para un fabricante de autos me recomendó usar lo menos posible global para ahorrar memoria y por eso lo puse void loop yo en lo personal lo prefiero fuera del void loop, tu idea de ni inferior ni superior intermedio, me agrada intentare implementarla en cuanto haga los cambios lo subo al foro. Ahora trabajo en un código en el que inferior y superior, maneja sus estados de forma neutra, donde limiteNivel representa a inferior y superior ahora sufro con > < por que para uno dato es mayor que y para otro menor que intento resolver lo con operario ternario. Este problema que me ayudaste a resolver lo tengo en varios códigos, que no cambian de estado, y te soy sincera a un no me queda muy claro como pasa de un estado a otro, o directamente al case que se requiere, pero bueno hay muchas cosas que hacemos en automático como cuando cambiamos las marchas del auto ni miramos la palanca de cambios. Un saludo desde Querétaro MX.
Nota: Te agradezco mucho tu amable ayuda.

switch (nivel) {
  case ESTADO_NIVEL_SUPERIOR:
    if (litros > NIVEL_SUPERIOR) {
      alarmaSuperior = true;
      alarmaInferior = false;
      //  nivel superior releB
    } else {
      alarmaSuperior = false;
      alarmaInferior = false;
      // No activar ninguna alarma
    }
    break;
  case ESTADO_NIVEL_INFERIOR:
    if (litros < NIVEL_INFERIOR) {
      alarmaInferior = true;
      alarmaSuperior = false;
      // Realizar activación nivel inferior  releA
    } else {
      alarmaSuperior = false;
      alarmaInferior = false;
      // No activar ninguna de alarma
    }
    break;
  default:
    // Desactivar ambas alarmas u otras acciones por defecto
    alarmaSuperior = false;
    alarmaInferior = false;
    break;
}

Presupongo que a esto te refieres con intermedia, entre inferior y superior, esto definide que nada se activara si no esta dentro de inferior o superior, según yo claro