[Solucionado] Controlar Loop() para enviar correo

Hola a todos.

Tengo un pequeño problema, necesito enviar un correo electrónico cuando un switch es activado, cuando se activa se va a enviar informacion a una pantalla y activar actuadores, el problema es que los correos se envían "infinitamente", y lo que necesito es que se envié una sola vez cuando el switch se queda activado (si se activan los 3 switch, se debe enviar 1 correo por cada caso).

void loop() {

  inundacion0();//apaga todos los actuadores
  inundacion1();
  inundacion2();
  inundacion3();
}

El codigo de cada switch es el mismo, cambiando el orden de encendido de los actuadores.

void inundacion1() {
  if (digitalRead(caso1) == 1 && digitalRead(caso2) == 0 && digitalRead(caso3) == 0) {
    imprimir(1);
    digitalWrite(verde, HIGH);
    digitalWrite(amarillo, LOW);
    digitalWrite(rojo, LOW);
    digitalWrite(bomba, HIGH);
    caso = 1;
    enviar_nextion(caso); //enviar datos a pantalla Nextion
    enviar_ifttt(33); //enviar correo electrónico
  }
}

Ya que no publicaste la solución lo hago yo para que quien lea esto no se quede con la duda.

Siempre que se see un pulsador no trabajen con su estado lógico sino con el flanco o sea el cambio de estado.
Si un switch esta en 1 o o, abierto o apagado, estará o permanecerá de ese modo hasta que se cambia.
Entonces si en su código solo prestan atención a su estado lógico LOW o HIGH ocurrirá lo que mencionas que lo que se desea hacer se repite indefinidamente.
Diferente es cuando se espera el cambio de estado de HIGH a LOW o de LOW a HIGH
Como lo hago?

Simplemente uso dos variables del tipo bool o boolean. Una variable estado reflejará lo que pasa y otra lo que ha pasado.

bool esado, estadoAnt;

Cómo establezco el flanco o cambio de estado. Muy fácil.

consulto por un cambio de este modo. Lo haré de dos formas. La que todos usan y la que se usa cuando ya se comprende que hay ciertos pasos que son innecesarios.

supongamos tener un switch que esta conectado con un resistor PULL-UP (conectado a 5V o 3.3V según corresponda). Entonces su condición NO sera un HIGH y su condición NC será un LOW.

Para reflejar el cambio hacemos esto

estado = digitalRead(pinSwitch);
if (estado == HIGH && estadoAnt = LOW) {
   // hago lo que necesito
}
estadoAnt = estado;

esta es la forma cuando ya saben que poner estado == HIGH es lo mismo que poner simplemente estado porque la varíable implicitamente tiene su estado al igual que estadoAnt el suyo.
Entonces esto es exactamente igual que lo anterior

estado = digitalRead(pinSwitch);
if (estado && !estadoAnt) {
   // hago lo que necesito
}
estadoAnt = estado;

Lo único RARO que apareció es ! que es un negador.
Al usarlo con !estadoAnt estamos escribiendo lo mismo que estadoAnt == LOW

Como mencionaste, la solución fue analizar el flanco.

Para lo cual use interrupciones

volatile boolean flag1 = false;
attachInterrupt(caso1, CambioEstado1, RISING); //CambioEstado1() -> flag1=true;

Cada que el switch cambia de estado, se ejecuta la función respectiva y cambia el booleano para enviar el correo.

void inundacion1() {
  if (digitalRead(caso1) == 1 && digitalRead(caso2) == 0 && digitalRead(caso3) == 0) {
    imprimir(1);
    digitalWrite(verde, HIGH);
    digitalWrite(amarillo, LOW);
    digitalWrite(rojo, LOW);
    digitalWrite(bomba, HIGH);
    caso = 1;
    enviar_nextion(caso);
  }
  if (flag1 == true) { 
    enviar_ifttt(33); 
    flag1 = false;
  }
}