Duda sobre lineas de código que comprueban si el RTC está conectado

Saludos a tod@s.
Antes de nada, me presento, soy Don_Mikaelo y estoy dando mis primeros pasos en arduino y en su programación. Quiero agradecer de antemano toda la ayuda que me podáis ofrecer y agradeceros vuestra comprensión por las "tonterías" que pueda llegar a preguntar. Vamos al tema:
Estoy metido ahora en los RTC y mi duda es referente a la programación y en concreto al código que se utiliza habitualmente para comprobar si se tiene el RTC conectado. Esto se repite muchísimo en ejemplos

if (!rtc.begin()) {
 Serial.println("No hay módulo RTC");
 while (1);
 }

Entiendo como funcionan este código pero no entiendo muy bien porque se utiliza ! rtc.begin().
Yo he intentado crear mi propio código con otra lógica (y que será errónea) y queda así:

if (rtc.begin()) {
 Serial.println("Iniciando módulo RTC");
 }
 else {
 Serial.println("No hay un módulo RTC"); 
 while (0);
 }

y no funciona porque no se queda "enganchado" en el bucle while (0) , continua ejecutando el programa.
Entiendo que la función rtc.begin devuelve true (1) cuando está iniciado el RTC y devuelve false (0) cuando no lo está.
¿En qué me estoy equivocando?
Muchas gracias por vuestra ayuda.

  1. Hay cosas que puedes imaginar y si no te es posible entonces vas a la librería y compruebas como funciona.
    En un condicional siempre se busca que lo que este dentro de los paréntesis sea VERDADERO de modo que
    if (!rtc.begin()) verdadero significa que
    rtc.begin devuelve un falso en realidad ya que tiene un negador antes. El ! niega lo que sigue.

esta el rtc, lo consulta a traves del procedimiento que lo inicializa.
rtc.begin() devuelve un falso si el RTC no esta presente y un true si lo esta.

Entonces como NO ESTA presente, !falso = true o sea la condicion es veradera y ejecuta lo que esta dentro del condicional que es avisar que el RTC no esta presente y quedarse ahi indefinidamente, porque no tiene mas sentido continuar.
while(1) hace eso. Me quedo ahi toda la vida mientras haya energía en el Arduino.

  1. Tu código esta bien pero el while(debe se 1) no 0.

Versión correcta

if (rtc.begin()) {
 Serial.println("Iniciando módulo RTC");
 }
 else {
 Serial.println("No hay un módulo RTC");
 while (1);
 }

Me permito ampliar lo que te explicó @surbyte respecto a while().

La sentencia se ejecuta mientras la condición sea verdadera, caso contrario no se cumple.
Por ej.

while(n<100) n++;

se va a ejecutar mientras n sea menor a 100, cuando llegue a 100 la condición deja de cumplirse, o sea es falsa, y el programa pasa a la próxima instrucción.

Pero tu puedes forzar el resultado de la condición con

while(1);

que es equivalente a

while(true);

al forzar el estado verdadero, siempre se cumple (porque nunca se logra pasar a falso) y el while se repite indefinidamente.

La razón por la que no se repite el while de la forma que lo has definido

while(0);

es porque equivale a

while(false);

y ya vimos que while se ejecuta siempre y cuando la condición sea verdadera.

Saludos

Muchas gracias por vuestra respuestas.
Creo que ya lo he entendido. Aún tengo que aprender muchas cosas sobre las diferencias entre la "lógica humana" y la "lógica de la programación".
Ahora entiendo porque se fuerza el valor contrario a rtc.begin (!rtc.begin) y es para poder "enganchar" al programa cuando no hay RTC con un while(true), o sea un while (1) y que sea una condición verdadera.
Pero en mi "lógica humana", al no estar conectado el RTC, es verdadero que la respuesta de la función sea 0, y ahí está mi error.
Saludos y muchas gracias por vuestra ayuda.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.