Varios procesos. ¿Cómo?

Como ya he comentado en más de una ocasión, hay que huir de los delay para realizar períodos de espera, estamos programando un dispositivo que permite realizar operaciones en quasi-tiempo-real y mantener en modo de espera con un delay el proceso con una espera larga es como darle una puñalada en el pecho.

Usar interrupciones es lo más idóneo, pero requiere un conocimiento bastante profundo del lenguaje y visto que te resulta complicado ver como hacer lo que quieres, yo, de momento, no iría por esa vía, las interrupciones te pueden volver loco, como empieces a utilizarlas y te hagan llamadas solapadas.

La solución más sencilla de aplicar para solucionar tu caso es utilizar variables testigo, donde almacenas el momento de la última ejecución realizada y con eso controlas que el proceso que gestiona se ejecute cuando tú lo necesitas, tras la ejecución, recargas su valor a cero y reactivas la espera.

Te pongo un esbozo de como sería esto.

#define TIEMPO_ESPERA_SENSORES 1800000

#define PIN_SENSOR_MOVIMIENTO 1

unsigned long tiempoInicial;

void setup() {
  tiempoInicial = 0;
}

void loop() {
  
  int estadoSensorMovimiento;
  
  if ( tiempoInicial == 0 ) {
    
    tiempoInicial = millis();
    // Código lectura de los sensores (llamada a función o lo que sea)
    
  }
  
  estadoSensorMovimiento = analogRead( PIN_SENSOR_MOVIMIENTO );
  
  if( estadoSensorMovimiento ..... ) {  // Comparar la lectura si es igual, mayor, menor que un valor de referencia
    // Código asociado a sensor de movimiento (llamada a función o lo que sea)
  }
  
  if( millis() < tiempoInicial ) tiempoInicial -= 4294967295;    // Ajuste de la variable testigo si millis() se ha reseteado
  if( millis() - tiempoInicial > TIEMPO_ESPERA_SENSORES ) tiempoInicial = 0;

}

Espero te sirva de ayuda

Saludos