2832| 0
|
7x71 RGB柔性屏测试2:NTP网络时钟 |
NTP【Network Time Protocol】是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms。 1.前期准备: Nodemcu (引脚对应的是8266的引脚,不是开发板上丝印对应的引脚) Time库 Timezone库 2.安装烧录: 下载好两个库文件后,直接解压到Arduino的libraries文件夹下就可以了。安装好库文件之后直接烧录进8266就可以啦: [mw_shl_code=c,false]#include <Arduino.h> #include <HardwareSerial.h> #include<stdlib.h> #include <SoftwareSerial.h> #include "DFRobot_SerialScreen771.h" #include <TimeLib.h> #include <ESP8266WiFi.h> #include <WiFiUdp.h> #ifdef ARDUINO_AVR_UNO SoftwareSerial Serial1( 2, 5 ); //RX, TX #endif DFRobot_SerialScreen771 screen; const char ssid[] = "Develop"; // your network SSID (name) const char pass[] = "ccbfudevelop"; // your network password static const char ntpServerName[] = "ntp.aliyun.com"; //NTP服务器,阿里云 const int timeZone = 8; //时区,北京时间为+8 WiFiUDP Udp; unsigned int localPort = 8888; // local port to listen for UDP packets time_t getNtpTime(); void setup() { Serial.begin( 115200 ); Serial1.begin( 19200 ); screen.begin( Serial1 ); screen.setDbgSerial( Serial ); 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 ); screen.setBrightness(eBrightLevel_5); //screen.setMoveMode(eMove_right); } time_t prevDisplay = 0; void loop() { if( timeStatus() != timeNotSet ) { if( now() != prevDisplay ) { prevDisplay = now(); showtime(); } } } void showtime() { int Hour = hour(); int Min = minute(); int Sec = second(); //char TIME[8]; char HOUR[3]; char MIN[3]; char SEC[3]; itoa( Hour, HOUR, 10 ); itoa( Min, MIN, 10 ); itoa( Sec, SEC, 10 ); strcat( HOUR, ":" ); strcat( HOUR, MIN ); strcat( HOUR, ":" ); strcat( HOUR, SEC ); screen.setMessageList( 1, HOUR ); screen.displayBanner( "A" ); } 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(); } [/mw_shl_code] 遇到的问题和其他人一样,底层是直接写在51上的,正常秒跳动应该是两个“ :”跳动的,但是现在只能整体刷新,效果非常的不理想。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed