#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)); } |
共1条
1/1 1 跳转至页
arduino获取网络时间程序
只看楼主 1楼
共1条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 |