2017-03-28 3 views
-3

Diese Codes Arduino NTP Verbindungen Code, wollen UTC Berechnung (DD-MM-JJJJ)Das Arduino NTP, möchte ich Daten ausdrucken (DD-MM-JJJJ)

Unterstützung lib und Header:

#include "WiFiEsp.h" 
#include "WiFiEspUdp.h" 
//kor UTC time + 9 

// Emulate Serial1 on pins 6/7 if not present 
#ifndef HAVE_HWSERIAL1 
#include "SoftwareSerial.h" 
#include "TimeLib.h" 
SoftwareSerial Serial1(8, 9); // RX, TX 
#endif 

globale Variable:

char ssid[] = "xxxxxxx";   // your network SSID (name) 
char pass[] = "xxxxxxx";  // your network password 
int status = WL_IDLE_STATUS;  // the Wifi radio's status 

char timeServer[] = "0.asia.pool.ntp.org"; // NTP server 
unsigned int localPort = 2390;  // local port to listen for UDP packets 

const int NTP_PACKET_SIZE = 48; // NTP timestamp is in the first 48 bytes of the message 
const int UDP_TIMEOUT = 2000; // timeout in miliseconds to wait for an UDP packet to arrive 

byte packetBuffer[NTP_PACKET_SIZE]; // buffer to hold incoming and outgoing packets 

// A UDP instance to let us send and receive packets over UDP 
WiFiEspUDP Udp; 

Alle-Codes:

void setup() 
{ 
    // initialize serial for debugging 
    Serial.begin(9600); 
    // initialize serial for ESP module 
    Serial1.begin(9600); 
    // initialize ESP module 
    WiFi.init(&Serial1); 

    // check for the presence of the shield 
    if (WiFi.status() == WL_NO_SHIELD) { 
    Serial.println("WiFi shield not present"); 
    // don't continue 
    while (true); 
    } 

    // attempt to connect to WiFi network 
    while (status != WL_CONNECTED) { 
    Serial.print("Attempting to connect to WPA SSID: "); 
    Serial.println(ssid); 
    // Connect to WPA/WPA2 network 
    status = WiFi.begin(ssid, pass); 
    } 
    Serial.println("You're connected to the network"); 
    Udp.begin(localPort); 
} 

void loop() 
{ 
    sendNTPpacket(timeServer); // send an NTP packet to a time server 

    // wait for a reply for UDP_TIMEOUT miliseconds 
    unsigned long startMs = millis(); 
    while (!Udp.available() && (millis() - startMs) < UDP_TIMEOUT) {} 

    Serial.println(Udp.parsePacket()); 
    if (Udp.parsePacket()) { 
    Serial.println("packet received"); 
    // We've received a packet, read the data from it into the buffer 
    Udp.read(packetBuffer, NTP_PACKET_SIZE); 

    // the timestamp starts at byte 40 of the received packet and is four bytes, 
    // or two words, long. First, esxtract the two words: 

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); 
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); 
    // combine the four bytes (two words) into a long integer 
    // this is NTP time (seconds since Jan 1 1900): 
    unsigned long secsSince1900 = highWord << 16 | lowWord; 
    Serial.print("Seconds since Jan 1 1900 = "); 
    Serial.println(secsSince1900); 

    // now convert NTP time into everyday time: 
    Serial.print("Unix time = "); 
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800: 
    const unsigned long seventyYears = 2208988800UL; 
    // subtract seventy years: 
    unsigned long epoch = (secsSince1900 - seventyYears)+32400; 
    // unsigned long epoch = (secsSince1900 - seventyYears); 
    // print Unix time: 
    Serial.println(epoch); 
    // print the hour, minute and second: 
    Serial.println("The UTC time is ");  // UTC is the time at Greenwich Meridian (GMT) 
    Serial.println((epoch/31556926)+1970); 
    // Serial.println((epoch/86400L)%7); 
    //0=Thursday,1=Friday,2=Saturday,3=Sunday,4=Monday,5=Tuesday,6=Wednesday 
    Serial.print((epoch % 86400L)/3600); // print the hour (86400 equals secs per day) 
    Serial.print(':'); 
    if (((epoch % 3600)/60) < 10) { 
     // In the first 10 minutes of each hour, we'll want a leading '0' 
     Serial.print('0'); 
    } 
    Serial.print((epoch % 3600)/60); // print the minute (3600 equals secs per minute) 
    Serial.print(':'); 
    if ((epoch % 60) < 10) { 
     // In the first 10 seconds of each minute, we'll want a leading '0' 
     Serial.print('0'); 
    } 
    Serial.println(epoch % 60); // print the second 


    } 

    // wait ten seconds before asking for the time again 
    delay(1000); 
} 

// send an NTP request to the time server at the given address 
void sendNTPpacket(char *ntpSrv) 
{ 
    // 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(ntpSrv, 123); //NTP requests are to port 123 
    Serial.println(); 

    Udp.write(packetBuffer, NTP_PACKET_SIZE); 

    Udp.endPacket(); 
} 

Serien Monitor Prints:

packet received 
Seconds since Jan 1 1900 = 3699648843 
Unix time = 1490692443 
The UTC time is 
2017 
9:14:03 

Epoche UTC Wert ist, will UTC Wertberechnung DD-MM-JJJJ.

Antwort

0

Wandeln Sie Ihre EPOCH-Zeit (Sekunden ab 1970) in separate Tokens um (Tag, Monat, Jahr, Stunde, Minute, Sekunde) und formatieren Sie sie als String.

char str[20]; 
sprintf(str, "%02d:%02d.%04d", date.day, date.month, date.year); 
//Use your formatted date string not 

Beispiel dekodieren Bibliothek

void TM_RTC_GetDateTimeFromUnix(TM_RTC_t* data, uint32_t unix) { 
    uint16_t year;  
    data->Unix = unix;   /* Store unix time to unix in struct */ 
    data->Seconds = unix % 60; /* Get seconds from unix */ 
    unix /= 60;     /* Go to minutes */ 
    data->Minutes = unix % 60; /* Get minutes */ 
    unix /= 60;     /* Go to hours */ 
    data->Hours = unix % 24; /* Get hours */ 
    unix /= 24;     /* Go to days */ 
    data->WeekDay = (unix + 3) % 7 + 1; /* Get week day, monday is first day */ 

    year = 1970;    /* Process year */ 
    while (1) { 
     if (RTC_LEAP_YEAR(year)) { 
      if (unix >= 366) { 
       unix -= 366; 
      } else { 
       break; 
      } 
     } else if (unix >= 365) { 
      unix -= 365; 
     } else { 
      break; 
     } 
     year++; 
    } 
    /* Get year in xx format */ 
    data->Year = (uint8_t) (year - 2000); 
    /* Get month */ 
    for (data->Month = 0; data->Month < 12; data->Month++) { 
     if (RTC_LEAP_YEAR(year)) { 
      if (unix >= (uint32_t)RTC_Months[1][data->Month]) { 
       unix -= RTC_Months[1][data->Month]; 
      } else { 
       break; 
      } 
     } else if (unix >= (uint32_t)RTC_Months[0][data->Month]) { 
      unix -= RTC_Months[0][data->Month]; 
     } else { 
      break; 
     } 
    } 

    data->Month++;   /* Month starts with 1 */ 
    data->Day = unix + 1;  /* Date starts with 1 */ 
} 

Mehr hier (Alle Strukturen und Makros):

https://github.com/MaJerle/stm32fxxx_hal_libraries/blob/master/00-STM32_LIBRARIES/tm_stm32_rtc.c

https://github.com/MaJerle/stm32fxxx_hal_libraries/blob/master/00-STM32_LIBRARIES/tm_stm32_rtc.h

Verwandte Themen