本帖最后由 roc2 于 2019-11-4 11:29 編輯
上次的分享,我們獲取了一枚天氣信息,但是呢,信息最重要的屬性之一就是時效性,如何去確認我們信息的時效性呢,簡單,保持自己時間的準確嘍。 Time is valuable thing! 時間對我們是很重要的。通常,我們需要進行時間校準(PS:在很多時候,你細心留意就發(fā)現時間是錯誤的),一般就可以用NTP服務器進行獲取時間信息,下面使用零知-ESP8266上進行NTP時間的獲取。 一、硬件
電腦,windows系統(tǒng)
零知ESP8266開發(fā)板
micro-usb線
二、
(1)打開零知開源開發(fā)軟件,選擇零知ESP8266開發(fā)板,界面如圖所示:
19.png (148.89 KB, 下載次數: 34)
下載附件
2019-11-4 11:26 上傳
(2)電腦連接零知ESP8266開發(fā)板 (3)燒寫程序: ①可以直接選擇軟件中的示例程序
19.1.png (120.06 KB, 下載次數: 37)
下載附件
2019-11-4 11:26 上傳
②也可以上傳以下代碼: - <font color="rgb(77, 77, 77)"><font face="""><font style="font-size: 16px">/*
- * TimeNTP_ESP8266WiFi.ino
- * Example showing time sync to NTP time source
- *
- * This sketch uses the ESP8266WiFi library
- */
-
- #include <TimeLib.h>
- #include <ESP8266WiFi.h>
- #include <WiFiUdp.h>
-
- const char ssid[] = "xx"; // your network SSID (name)
- const char pass[] = "xx"; // your network password
-
- // NTP Servers:
- static const char ntpServerName[] = "cn.ntp.org.cn";
- //static const char ntpServerName[] = "time.nist.gov";
- //static const char ntpServerName[] = "time-a.timefreq.bldrdoc.gov";
- //static const char ntpServerName[] = "time-b.timefreq.bldrdoc.gov";
- //static const char ntpServerName[] = "time-c.timefreq.bldrdoc.gov";
-
- const int timeZone = 8; //BeiJing in China
-
- // const int timeZone = 1; // Central European Time
- //const int timeZone = -5; // Eastern Standard Time (USA)
- //const int timeZone = -4; // Eastern Daylight Time (USA)
- //const int timeZone = -8; // Pacific Standard Time (USA)
- //const int timeZone = -7; // Pacific Daylight Time (USA)
-
-
- WiFiUDP Udp;
- unsigned int localPort = 8888; // local port to listen for UDP packets
-
- time_t getNtpTime();
- void digitalClockDisplay();
- void printDigits(int digits);
- void sendNTPpacket(IPAddress &address);
-
- void setup()
- {
- Serial.begin(9600);
- while (!Serial) ; // Needed for Leonardo only
- delay(250);
- Serial.println("TimeNTP Example");
- Serial.print("Connecting to ");
- Serial.println(ssid);
- WiFi.begin(ssid, pass);
-
- while (WiFi.status() != WL_CONNECTED) {
- delay(500);
- Serial.print(".");
- }
-
- Serial.print("IP number assigned by DHCP is ");
- Serial.println(WiFi.localIP());
- Serial.println("Starting UDP");
- Udp.begin(localPort);
- Serial.print("Local port: ");
- Serial.println(Udp.localPort());
- Serial.println("waiting for sync");
- setSyncProvider(getNtpTime);
- setSyncInterval(300);
- }
-
- time_t prevDisplay = 0; // when the digital clock was displayed
-
- void loop()
- {
- if (timeStatus() != timeNotSet) {
- if (now() != prevDisplay) { //update the display only if time has changed
- prevDisplay = now();
- digitalClockDisplay();
- }
- }
- }
-
- void digitalClockDisplay()
- {
- // digital clock display of the time
- Serial.print(hour());
- printDigits(minute());
- printDigits(second());
- Serial.print(" ");
- Serial.print(day());
- Serial.print(".");
- Serial.print(month());
- Serial.print(".");
- Serial.print(year());
- Serial.println();
- }
-
- void printDigits(int digits)
- {
- // utility for digital clock display: prints preceding colon and leading 0
- Serial.print(":");
- if (digits < 10)
- Serial.print('0');
- Serial.print(digits);
- }
-
- /*-------- NTP code ----------*/
-
- const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
- byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets
-
- time_t getNtpTime()
- {
- IPAddress ntpServerIP; // NTP server's ip address
-
- while (Udp.parsePacket() > 0) ; // discard any previously received packets
- Serial.println("Transmit NTP Request");
- // get a random server from the pool
- WiFi.hostByName(ntpServerName, ntpServerIP);
- Serial.print(ntpServerName);
- Serial.print(": ");
- Serial.println(ntpServerIP);
- sendNTPpacket(ntpServerIP);
- uint32_t beginWait = millis();
- while (millis() - beginWait < 1500) {
- int size = Udp.parsePacket();
- if (size >= NTP_PACKET_SIZE) {
- Serial.println("Receive NTP Response");
- Udp.read(packetBuffer, NTP_PACKET_SIZE); // read packet into the buffer
- unsigned long secsSince1900;
- // convert four bytes starting at location 40 to a long integer
- secsSince1900 = (unsigned long)packetBuffer[40] << 24;
- secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
- secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
- secsSince1900 |= (unsigned long)packetBuffer[43];
- return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
- }
- }
- Serial.println("No NTP Response :-(");
- return 0; // return 0 if unable to get the time
- }
-
- // send an NTP request to the time server at the given address
- void 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();
- }
- </font></font></font>
復制代碼
然后驗證,并且上傳到開發(fā)板。 四、結果
19.2.png (64.67 KB, 下載次數: 26)
下載附件
2019-11-4 11:26 上傳
然后對照自己的時間:
19.3.jpg (1.98 KB, 下載次數: 32)
下載附件
2019-11-4 11:29 上傳
趕緊動手檢查看看自己的時間對不對呢?
我先校準自己的。 順便問你們一句:有沒有發(fā)現自己的時間變快了呢?(細思極恐)
|