找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9371|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

arduino獲取網(wǎng)絡(luò)時間程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:76244 發(fā)表于 2015-4-7 01:31 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
#include <EtherCard.h>


#define RELAY_PIN        2
#define SECONDS_IN_DAY          86400
#define START_YEAR              1900
#define TIME_ZONE               +8
static int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
static byte ntpServer[] = {193,204,114,232};
static byte srcPort = 0;
unsigned long lastTime =0;
uint32_t timeStamp;
boolean requestSent;
unsigned int day,month,year,hour, minute,second;
#define INTERVAL                1000

static byte mymac[]  = {0xDD,0xDD,0xDD,0x00,0x00,0x01};
static byte myip[]   = {192,168,1,2};
byte Ethernet::buffer[700];

char* on  = "ON";
char* off = "OFF";

boolean relayStatus;
char* relayLabel;
char* linkLabel;

void setup () {

  Serial.begin(57600);
  Serial.println("WebRelay Demo");

  if(!ether.begin(sizeof Ethernet::buffer, mymac, 10))
    Serial.println( "Failed to access Ethernet controller");
  else
    Serial.println("Ethernet controller initialized");
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");
  else
  Serial.println("DHCP configuration done");  

  ether.printIp("My IP: ", ether.myip);
  // ether.printIp("Netmask: ", ether.mymask);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);  
  relayStatus = false;
  relayLabel = off;
  linkLabel = on;
    requestSent = false;
}

void loop() {

  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);

  if(pos) {

    if(strstr((char *)Ethernet::buffer + pos, "GET /?ON") != 0) {
      relayStatus = true;
      relayLabel = on;
      linkLabel = off;
    } else if(strstr((char *)Ethernet::buffer + pos, "GET /?OFF") != 0) {
      relayStatus = false;
      relayLabel = off;
      linkLabel = on;
    }
    digitalWrite(RELAY_PIN, relayStatus);
    BufferFiller bfill = ether.tcpOffset();
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
      "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
      "<html><head><meta name='viewport' content='width=200px'/></head><body>"
      "<div style='position:absolute;width:200px;height:200px;top:50%;left:50%;margin:-100px 0 0 -100px'>"
      "<div style='font:bold 14px verdana;text-align:center'>Relay is $S</div>"
      "<br><div style='text-align:center'>"
      "<a href='/?$S'><img src='http://www.lucadentella.it/files/bt_$S.png'></a>"
       "<br><a href='\'>$D/$D/$D</a><br>"
       "<a href='\'>Time:$D:$D:$D</a>"
      "</div></div></body></html>"
      ), relayLabel, linkLabel, linkLabel,day,month,year,hour,minute,second);

      ether.httpServerReply(bfill.position());
    }
    distime();

}

void distime()
{
    if(requestSent && ether.ntpProcessAnswer(&timeStamp, srcPort)) {
    Serial.println("NTP answer received");
    Serial.print("Timestamp: ");
    Serial.println(timeStamp);
    printDate(timeStamp + 3600 * TIME_ZONE+100);
    requestSent = false;
  }

unsigned long  time = millis();  
  if(time - lastTime > INTERVAL) {
    lastTime = time;
    ether.ntpRequest(ntpServer, srcPort);
    Serial.println("NTP request sent");
    requestSent = true;
  }
}
void printDate(uint32_t timeStamp) {

  year = START_YEAR;
  while(1) {
    uint32_t seconds;
    if(isLeapYear(year)) seconds = SECONDS_IN_DAY * 366;
    else seconds = SECONDS_IN_DAY * 365;
    if(timeStamp >= seconds) {
      timeStamp -= seconds;
      year++;
    } else break;
  }

   month = 0;
  while(1) {   
    uint32_t seconds = SECONDS_IN_DAY * days_in_month[month];
    if(isLeapYear(year) && month == 1) seconds = SECONDS_IN_DAY * 29;
    if(timeStamp >= seconds) {
      timeStamp -= seconds;
      month++;
    } else break;
  }  
  month++;

day = 1;
  while(1) {
    if(timeStamp >= SECONDS_IN_DAY) {
      timeStamp -= SECONDS_IN_DAY;
      day++;
    } else break;
  }  

hour = timeStamp / 3600;
   minute = (timeStamp - (uint32_t)hour * 3600) / 60;
second = (timeStamp - (uint32_t)hour * 3600) - minute * 60;

  Serial.println("Current date and time:");

  if(day < 10) Serial.print("0");
  Serial.print(day);
  Serial.print("/");

  if(month < 10) Serial.print("0");
  Serial.print(month);
  Serial.print("/");  

  Serial.println(year);

  if(hour < 10) Serial.print("0");
  Serial.print(hour);
  Serial.print(":");

  if(minute < 10) Serial.print("0");
  Serial.print(minute);
  Serial.print(":");

  if(second < 10) Serial.print("0");
  Serial.println(second);

}

boolean isLeapYear(unsigned int year) {

  return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:731673 發(fā)表于 2020-8-14 21:50 | 只看該作者
不會吧,一個獲取網(wǎng)絡(luò)時間程序有這么長
回復(fù)

使用道具 舉報

板凳
ID:808286 發(fā)表于 2020-8-16 15:00 | 只看該作者
請問有什么模塊可以做到嗎
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表