Utilizar return en el void loop

Hola a todos!

Estoy desarrollando un sistema de automatización para tanques de líquidos, y una de las primeras cosas que necesito que haga mi código es verificar que los sensores estés posicionados correctamente y que las medidas no sean discordantes.

Para explicarlo mejor, en cada tanque hay 4 sensores de nivel, uno cada 30 centímetros. Esto es una exigencia del proyecto. Tengo una función que chequea que, por ejemplo, si el sensor que está a 90 cm. detecta líquido, pero el que está a 60cm. no detecta, muestre un error de hardware.

En el loop() llamo a la función que lee el estado de los sensores, y luego a la función que analiza lo anteriormente mencionado.

Ahora bien, toda esta introducción para realizar la consulta, como el loop() no debería continuar si hay un error en las lecturas o en los sensores, quisiera saber si es correcto hacer lo siguiente:

void loop(){

	tankLevelStatus(); // Verificamos niveles de líquido en el tanque
	
		
	detectHardwareError(); // Verificamos si hay errores en las lecturas
		
	if( hardware_tank_error == true ){
		setDisplayErrorMessage();
		loop(); // <-Esto es lo que quiero saber
	}

        /*
               Resto del código que no debería ejecutarse si hay error de hardware
        */
}

Es correcto llamar a la función loop() para que no ejecute el resto del código? Se puede usar también la sentencia return?

Desde ya muchas gracias por su atención!

En general usar llamadas recursivas (una función que se llama a si misma dentro de su código) no es una buena opción, y es mejor no hacerlas.

En el caso de loop es peor aun. Loop es un bucle infinito sin salida, por lo que si lo llamas otra vez, gastaras recursos sin salirte del bucle, al final te quedas sin memoria y se cuelga o no hace lo que debe de hacer.

Por lo tanto NO ES RECOMENDABLE.

Se puede usar un return dentro del código del loop. Eso hará que el loop se detenga en ese punto del loop y vuelva a ejecutarse desde el inicio. Pero, de hay a usarlo… de momento no he visto un programa que lo use.

En resumidas un programa de Arduino tiene la siguiente forma en C clásico:

void setup(){}
void loop(){}

int main() {
  setup(); // inicialización de programa.
  for(;;) loop(); // bucle infinito llamando a loop.
}

Así que ya ves, que aunque se puede es poco recomendable. Más, cuando la solución a tu problema es un simple “if”:

void loop() {
  if ( error ) {
     // Muestra el mensaje de error
  }
  else {
     // trabajas con los sensores.
  }

Muchas gracias por tu respuesta!

Sé que con el mismo IF lo puedo resolver, pero me pareció más prolijo usar un return o algo así ya que el código es bastante extenso y complejo.

Una vez más, gracias y saludos!