En este ejemplo, va a utilizar su Escudo WiFi 101 con la placa Arduino o Genuino Zero, o una placa MKR1000, para consultar un servidor Network Time Protocol (NTP). De este modo, la placa puede obtener el tiempo a través de Internet.
Hardware necesario
Escudo Wifi101 Arduino
Placa Arduino o Genuino Zero
o
Placa MKR1000
Circuito
El pin digital 7 se utiliza como un pin de diálogo entre el escudo WiFi 101 y la placa, y no debe ser utilizado.
Usted debe tener acceso a una red inalámbrica 802.11b/g que se conecte a internet para este ejemplo. Tendrá que cambiar la configuración de red en el programa para que se corresponda con su red SSID particular.
En la imagen superior, la placa Arduino o Genuino Zero se apilan debajo del escudo WiFi.
Código
// Cliente UDP NTP // Obtiene la hora de un servidor de tiempo de Network Time Protocol (NTP) // Demuestra uso de UDP sendPacket y ReceivePacket // Para más información sobre los servidores de tiempo NTP y // los mensajes que se necesita para comunicarse con ellos, ver // http://en.wikipedia.org/wiki/Network_Time_Protocol // Creado el 4 de Septiembre de 2010 por Michael Margolis // modificado el 9 de Abril de 2012 por Tom Igoe // Este código es de dominio público. #include <SPI.h> #include <WiFi101.h> #include <WiFiUdp.h> int status = WL_IDLE_STATUS; char ssid[] = "mynetwork"; // su red SSID (nombre) char pass[] = "mypassword"; // su password de red int keyIndex = 0; // su numero índice clave de red (sólo se precisa para WEP) unsigned int localPort = 2390; // puerto local para escuchar los paquetes UDP IPAddress timeServer(129, 6, 15, 28); // time.nist.gov servidor NTP const int NTP_PACKET_SIZE = 48; // la indicación de la hora esta en los primeros 48 bytes del mensaje NTP byte packetBuffer[ NTP_PACKET_SIZE]; //buffer para mantener los paquetes entrantes y salientes //Una instancia UDP para no retrasar el envío y recepción de paquetes a través de UDP WiFiUDP Udp; void setup() { // Abrir las comunicaciones serie y esperar a que se abra el puerto: Serial.begin(9600); while (!Serial) { ; //esperar a que el puerto serie se conecte. Necesario para el puerto USB nativo solamente } // comprobar la presencia del escudo: if (WiFi.status() == WL_NO_SHIELD) { Serial.println("Escudo WiFi no presente"); // no continua: while (true); } // intenta conectar a la red Wifi: while ( status != WL_CONNECTED) { Serial.print("Intentado conectar con SSID: "); Serial.println(ssid); // Conectarse a la red WPA / WPA2. Cambie esta línea si se utiliza una red abierta o WEP: status = WiFi.begin(ssid, pass); // espera 10 segundos para la conexion: delay(10000); } Serial.println("Conectado a wifi"); printWifiStatus(); Serial.println("\nIniciando conexión con el servidor..."); Udp.begin(localPort); } void loop() { sendNTPpacket(timeServer); // enviar un paquete a un servidor de tiempo NTP // esperar a ver si está disponible una respuesta delay(1000); if ( Udp.parsePacket() ) { Serial.println("Paquete recibido"); // Hemos recibido un paquete, leer los datos de el Udp.read(packetBuffer, NTP_PACKET_SIZE); // leer el paquete en el buffer // La marca de tiempo comienza en el byte 40 del paquete recibido y es de cuatro bytes, // o dos palabras, long. En primer lugar, extraer las dos palabras: unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); // Combinar los cuatro bytes (dos palabras) en un entero largo // Esto es la hora NTP (segundos desde el 1 de Enero de 1900): unsigned long secsSince1900 = highWord << 16 | lowWord; Serial.print("Segundos desde el 1 de de 1900 = " ); Serial.println(secsSince1900); // Ahora convertir el tiempo NTP en días: Serial.print("Unix time = "); // El tiempo Unix comienza el 1 de Enero de 1970. En segundos, eso es 2208988800: const unsigned long seventyYears = 2208988800UL; // restar setenta años: unsigned long epoch = secsSince1900 - seventyYears; //imprimir el tiempo Unix: Serial.println(epoch); // imprimir la hora, minutos y segundos: Serial.print("El tiempo UTC es "); // UTC es el tiempo Greenwich Meridian (GMT) Serial.print((epoch % 86400L) / 3600); // imprimir la hora (igual a 86400 segundos por dia) Serial.print(':'); if ( ((epoch % 3600) / 60) < 10 ) { // En los primeros 10 minutos de cada hora, vamos a querer un '0' a la izquierda Serial.print('0'); } Serial.print((epoch % 3600) / 60); // imprimir el minuto (igual 3600 segundos por minuto) Serial.print(':'); if ( (epoch % 60) < 10 ) { // En los primeros 10 segundos de cada minuto, vamos a querer un '0' a la izquierda Serial.print('0'); } Serial.println(epoch % 60); // imprimir el segundo } // espera diez segundos antes de pedir de nuevo la hora delay(10000); } // enviar una solicitud al servidor NTP tiempo en la dirección dada unsigned long sendNTPpacket(IPAddress& address) { //Serial.println("1"); // establecer todos los bytes en la memoria intermedia a 0 memset(packetBuffer, 0, NTP_PACKET_SIZE); // Inicializar los valores necesarios para formar una solicitud NTP // (Ver dirección de arriba para obtener más información sobre los paquetes) //Serial.println("2"); packetBuffer[0] = 0b11100011; // LI, Version, Mode packetBuffer[1] = 0; // Stratum, o tipo de reloj packetBuffer[2] = 6; // intervalo de sondeo packetBuffer[3] = 0xEC; // Mirar reloj de precisión // 8 bytes de cero para Root Delay & Root Dispersion packetBuffer[12] = 49; packetBuffer[13] = 0x4E; packetBuffer[14] = 49; packetBuffer[15] = 52; //Serial.println("3"); // A todos los campos NTP se han dado valores, ahora // puede enviar un paquete que pide una marca de tiempo: Udp.beginPacket(address, 123); // la ssolicitudes NTP ppor el puerto 123 //Serial.println("4"); Udp.write(packetBuffer, NTP_PACKET_SIZE); //Serial.println("5"); Udp.endPacket(); //Serial.println("6"); } void printWifiStatus() { // imprimir el SSID de la red a la que está conectado: Serial.print("SSID: "); Serial.println(WiFi.SSID()); // imprimir la dirección IP del escudo WiFi: IPAddress ip = WiFi.localIP(); Serial.print("Dirección IP: "); Serial.println(ip); // imprimir la potencia de la señal: long rssi = WiFi.RSSI(); Serial.print("Potencia de la señal (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); }
No hay comentarios:
Publicar un comentario