¿Como puedo limitar el numero de envios de email?

En mi proyecto estoy utilizando un ethernet shield conectado a un router y dos sensores de movimiento y cuando se detecta movimento por alguno de los dos sensores, recibo un email al movil.. Bueno, en realidad recibo mas de 30 y 40 emails en muy poco tiempo, ese es el problema..

¿Hay alguna forma de hacer que cuando me envie un email, hasta pasados 30 minutos no vuelva a enviarme otro email aunque detecte movimiento los sensores?

Esta es la parte de codigo de los sensores y el envio de email:

int SenUno=2;
int SenDos=3;
int ValSenUno = 0;
int ValSenDos = 0;

void setup() { 
    pinMode(SenUno, INPUT);      
    pinMode(SenDos, INPUT);   
}

void loop() {

    ValSenUno = digitalRead(SenUno);
    ValSenDos = digitalRead(SenDos);
    
    if(ValSenUno == HIGH || ValSenDos == HIGH ){
      send_email();
      delay(10);
      }
}

Movido a Software.
Hilo no corresonde a foro Proyectos
Leer las normas del foro por favor
Consultas por privado si las hay.

Prueba con esto

const byte SenUno = 2;
const byte SenDos = 3;
bool ValSenUno    = 0, ValSenUnoAnt = 0;
bool ValSenDos    = 0, ValSenDosAnt = 0;
bool unaVez       = false;

void setup() { 
    pinMode(SenUno, INPUT);      
    pinMode(SenDos, INPUT);   
}

void loop() {

    ValSenUno = digitalRead(SenUno);
    ValSenDos = digitalRead(SenDos);
    
    if (ValSenUno && !ValSenUnoAnt || ValSenDos && !ValSenDosAnt){
        send_email();
        delay(10);
    }

    ValSenUnoAnt = ValSenUno;
    ValSenDosAnt = ValSenDos;
}

Solo dispara por flanco, o sea si hubo disparo de alarma pero cada disparo es un email.

Gracias pero no me sirve.. Necesito que no envie ningun email hasta pasados al menos 10 minutos del ultimo email.. He estado probando con millis cambiando de estado un boleano y que solo deje enviar emails cuando este en true.. pero no entiendo muy bien como funciona la funcion millis.. esto es lo que he estado probando, pero hace lo mismo que tu codigo, envia un email por cada deteccion..

long previousMillis = 0;
long interval = 100000;
bool Estado = true;

void loop() {

    ValSenUno = digitalRead(SenUno);
    ValSenDos = digitalRead(SenDos);

    unsigned long currentMillis = millis();    // Se toma el tiempo actual

    if (currentMillis - previousMillis > interval){
    Estado = !Estado;
    previousMillis = currentMillis;
    }
    
    if(ValSenUno == HIGH || ValSenDos == HIGH ){
      if(Estado){
       send_email();
       Estado = !Estado;
       delay(10);
      }
    }
}

Lo que necesito es una funcion con millis, que ponga en false el boleano al enviar un email y hasta que no pasen 10 minutos no ponga el boleano en true, de esta forma al hacer uso de if(Estado), solo enviara el email en caso de que el boleano este en true..

Ahh bueno entonces ponle un flag que se dispara con un envio del email y luego de superados los X min se vuelve a activar.
A ver ahora

const byte SenUno = 2;
const byte SenDos = 3;
bool ValSenUno    = 0, ValSenUnoAnt = 0;
bool ValSenDos    = 0, ValSenDosAnt = 0;

unsigned long start = 0;
bool disparo        = false;
bool flagEnvio      = true;    // arrancamos con flag habilitado.
                               // primer disparo envia email.

void setup() { 
    pinMode(SenUno, INPUT);      
    pinMode(SenDos, INPUT);   
}

void loop() {

    ValSenUno = digitalRead(SenUno);
    ValSenDos = digitalRead(SenDos);
    
    if (ValSenUno && !ValSenUnoAnt || ValSenDos && !ValSenDosAnt){
        if (!disparo) {
            start = millis()+10*60000; // 10 minutos en miliseg.
            disparo = true;            // ya se disparo. 
        }
        if (flagEnvio) {
            send_email();
            flagEnvio = false; // bloqueo otro envio.
        }
    } else
        disparo = false;

    if (disparo && millis()>start)
        flagEnvio = true;

    ValSenUnoAnt = ValSenUno;
    ValSenDosAnt = ValSenDos;
}

basado en mi código. No miré el tuyo porque debo entenderlo y me lleva tiempo y se me esta complicando responder tantos correos.

EDITO: había dos errores menores al final de

unsigned long start = 0;

y al final de

disparo = false;

estaban con , y debe ser ;

Muchas gracias por el codigo!!

Funciona bien pero hay un fallo y es que solo envia el primer email con la primera deteccion, luego he llegado a esperar hasta 20 minutos pero ya no recibo ningun email mas...

Llevo un buen rato mirando donde podria estar el fallo pero no lo veo..

Hola.
Aprovechando que el propio timer va a actuar como antirrebote, yo lo simplificaría así:

const byte SenUno = 2;
const byte SenDos = 3;

unsigned long start = 0;
bool flagEnvio      = true;    
// arrancamos con flag habilitado.
// primer disparo envia email.
void setup() {
  pinMode(SenUno, INPUT);     
  pinMode(SenDos, INPUT);   
}

void loop() {

  if (flagEnvio) {
    if (digitalRead(SenUno) || digitalRead(SenDos)) {
      send_email();
      start = millis();
      flagEnvio = false;
    }
  } else {
    if ((millis() - start) >= 600000 ) {
      flagEnvio = true;
    }
  }
}

Funciona perfectamente noter, muchas gracias!!