Arduino ejecuta void setup varias veces, se congela [SOLUCIONADO]

Buenas noches compañeros, les comento que estoy realizando un programa con arduino uno y una ethernet shield, el programa conciste en conectarse a un servidor NTP, obtener la hora y con la libreria time, gestionar la fecha. Mi idea es poder resincronizar el arduino cada cierto tiempo (que aun no defino del todo) y mantener la fecha correctamente.

El problema aparece cuando decido hacer la consulta NTP usando una funcion (anteriormente todo lo hacia en el loop, consultar al servidor y mostrar la fecha), me doy cuenta mediante el monitor serial que el arduino “pasa” varias veces por el void setup debido a los Serial.println que alli tengo para mostrar la ip de la shield, adicionalmente en algunas ocaciones el programa se “congela”. les muestro una imagen de lo que obtengo en el monitor.

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <Time.h>

IPAddress ip(192, 168, 0, 190);
byte mac[] = {0xAA, 0x3F, 0xAA, 0xBB, 0x24, 0xDD};
unsigned int localPort = 8888;                    //  Puerto local para escuchar UDP
IPAddress timeServer(193, 92, 150, 3);               // time.nist.gov NTP server (fallback)
//IPAddress timeServer(130,206,3,166);                    // Red Iris Bilbao
//IPAddress timeServer(130,206,206,248);                // Red Iris Madrid

const int NTP_PACKET_SIZE = 48;                 // La hora son los primeros 48 bytes del mensaje
byte packetBuffer[ NTP_PACKET_SIZE];               // buffer para los paquetes

EthernetUDP Udp;                                        // Una instancia de UDP para enviar y recibir mensajes
time_t t = 0;                                           // Instancia time_t de formato de 32 bits
//long timeRefer2016 = 1452245760;                        //

void setup() {

  Serial.begin(9600);

  Ethernet.begin(mac, ip) ;
  /*if (Ethernet.begin(mac) == 0)
    { Serial.println("Fallo al configurar por DHCP");
    while (true);*/

Serial.print("IP by DHCP ");
Serial.println(Ethernet.localIP());
Udp.begin(localPort);

}

void loop()
{
  while (int x = true) {
    if (SECS_PER_YEAR * 46UL > now())
    {
      getNTPtime();
    }
  }


}

time_t getNTPtime() {
  Serial.println(timeServer);  // direcion IP del servidor NTP
  sendNTPpacket(timeServer);   // Enviar unaa peticion al servidor NTP
  delay(1000);                  // Damos tiempo a la respuesta
  if ( Udp.parsePacket() )
  {
    Serial.println("Hemos recibido un paquete del Servidor");
    Udp.read(packetBuffer, NTP_PACKET_SIZE);   // Leemos el paquete

    // La hora empieza en el byte 40 de la respuesta y es de 4 bytes o 2 words
    // Hay que extraer ambas word:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);    // se concatenan byte[40] y [41] en un word de 16 bits
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);     // se concatenan byte[42] y [43] en un word de 16 bits

    // se combinan ambas word en un long sin signo, higWord se  mueve a la
    // izquierda 2 bytes y se aplica or con lowWord para obtener segundos en NTP
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    Serial.print("Segundos desde 1 Enero de 1900 = " );
    Serial.println(secsSince1900);

    // Ahora a convertir el tiempo NTP en tiempo Uxix:
    Serial.print("Unix time = ");
    // Unix time Empieza en 01/01/1970. En segundos eso es 2208988800UL
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears;
    // print Unix time:
    Serial.println(epoch - 18000);
    epoch = epoch - 18000;             //Ajuste a GTM-5
    setTime(epoch);
  }

  t = now();
  Serial.print(dayStr(t));
  Serial.print(+ "/") ;
  Serial.print(monthStr(t));
  Serial.print(+ "/") ;
  Serial.print(year(t));
  Serial.print( " ") ;
  Serial.print(hour(t));
  Serial.print(+ ":") ;
  Serial.print(minute(t));
  Serial.print(":") ;
  Serial.println(second(t));
  delay(1000);
  Serial.println();


  /* Serial.print("The UTC time is ");   // UTC es el tiempo universal o GMT
    Serial.print((epoch  % 86400L) / 3600);   // Horas (86400 segundos por dia)  - Se haya el modulo
    Serial.print(':');
    if ( ((epoch % 3600) / 60) < 10 ) {
     // Añadir un 0 en los primeros 9 minutos
     Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // Minutos:
    Serial.print(':');
    if ( (epoch % 60) < 10 ) {
     // Añadir un 0 en los primeros 9 minutos
     Serial.print('0');
    }
    Serial.println(epoch % 60);              // Segundos
    }
    delay(10000);
    Serial.println(" ");*/

}





unsigned long sendNTPpacket(IPAddress& address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;  // LI, Version, Mode
  packetBuffer[1] = 0;   // Stratum, or type of clock
  packetBuffer[2] = 6;   // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12] = 49;
  packetBuffer[13] = 0x4E;
  packetBuffer[14] = 49;
  packetBuffer[15] = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:

  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}

Aún no tengo idea del problema en sí, pero... qué significa esto?

while (int x = true)

Cómo se puede interpretar la declaración de una variable en un contexto booleano?

O será que sólo porque "= true" ya tiene un valor booleano?

Lucario448: Aún no tengo idea del problema en sí, pero... qué significa esto?

while (int x = true)

Cómo se puede interpretar la declaración de una variable en un contexto booleano?

O será que sólo porque "= true" ya tiene un valor booleano?

Buenas, amigo la verdad no entendi muy bien tu pregunta. Claro eso "while" fue una prueba rapida y creo que no esta bien escrito. Por otra parte, encontré la solucion al problema, resulta que la libreria time tiene un varios metodos para que la fecha sea entragada en formato String, simplemente muestro la fecha en formato número y todo anda de maravilla, aunque tengo duda porque usando este metodo se liaba todo el programa. Doy por solucionado el tema. Gracias por tu colaboración muchacho.

Sencillo: Si haces:

int a = b = 1;

Tanto a como b valdrán 1. Ésto es debido a que b = 1 retorna el mismo 1 que estás asignando.

Así, en

while(int x = true)

"x = true" retorna "true".

Realmente está mal escrito, debería ser "while(true)" a secas, pero no es un error sintáctico.

Edito: Además, asigna un bool a un int. Sigue sin ser error, ya que TRUE es 1, pero es que ese while lo tiene todo....

Naguissa: Sencillo: Si haces:

int a = b = 1;

Tanto a como b valdrán 1. Ésto es debido a que b = 1 retorna el mismo 1 que estás asignando.

Así, en

while(int x = true)

"x = true" retorna "true".

Realmente está mal escrito, debería ser "while(true)" a secas, pero no es un error sintáctico.

Edito: Además, asigna un bool a un int. Sigue sin ser error, ya que TRUE es 1, pero es que ese while lo tiene todo....

Claro tienes toda la razón, fue por la carrera que lo escribi mal, aunque normalmente cuando usaba un While, evaluaba una variable (boolean x = true) y dentro del ciclo si queria salir de alli simplemente cambiaba el valor x = false; de todas maneras gracias por tus consejos, los tendre en cuenta ;)