2800浏览
查看: 2800|回复: 0

7x71 RGB柔性屏测试2:NTP网络时钟

[复制链接]
7x71 RGB柔性屏测试2:NTP网络时钟图2
NTP【Network Time Protocol】是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms。

1.前期准备:
Nodemcu   (引脚对应的是8266的引脚,不是开发板上丝印对应的引脚)
7x71 RGB柔性屏测试2:NTP网络时钟图3

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]

7x71 RGB柔性屏测试2:NTP网络时钟图1


遇到的问题和其他人一样,底层是直接写在51上的,正常秒跳动应该是两个“ :”跳动的,但是现在只能整体刷新,效果非常的不理想。



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail