|
30家元
程序都是数码之家大神写的,我只是合并了一下。
程序设定的是10秒读取一次NTP时间,30分钟访问一次天气网页
但是,30分钟左右必定重启一次
麻烦大神分析一下
是不是一直访问网页,导致内存满了?负荷过重?该如何处理
代码如下
- /*
- 1,本人能力有限,程序存在BUG,目前问题是30分钟不到不定时重启。
- 2,程序为10秒获取一次时间,30分钟获取一次天气数据。
- 3,请登陆京东云【http://wx.jdcloud.com/market/datas/26/10610】获取APPKEY。
- 注意:未登陆直接“点击获取”APPKEY的“4ae4a2fcf405ce9beca0109018101d10”为无效APPKEY。
- 4,获取步骤:打开网址---点击立即测试---登陆(没注册的需要注册)---重新打开网址---点击立即测试即会出现APPKEY。
- */
- #include <ESP8266WiFi.h>
- #include <ESP8266HTTPClient.h>
- #include <WiFiUdp.h>
- #define PIN_LED 12
- #define KEY_FLASH 0
- char ssid[] = "TANG";
- char pass[] = "12345678";
- //NTP
- #define time_zone 8 //时区(要格林尼治时间加减的小时,北京为东八区,要将格林威治时间+8小时)
- unsigned int localPort = 2390; // local port to listen for UDP packets
- IPAddress timeServerIP; // time.nist.gov NTP server address
- const char* ntpServerName = "ntp1.aliyun.com";
- const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
- byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
- WiFiUDP udp;
- String print_send2;
- int jisu;
- void setup()
- {
- //初始化
- Serial.begin(115200);//串口波特率115200
- Serial.println();
- Serial.println();
- pinMode(PIN_LED, OUTPUT);
- pinMode(KEY_FLASH, INPUT_PULLUP);
- digitalWrite(PIN_LED, HIGH);
- delay(1500);
- Serial.print("Connecting to ");
- Serial.println(ssid);
- WiFi.begin(ssid, pass);
- while (WiFi.status() != WL_CONNECTED) {
- delay(500);
- Serial.print(".");
- }
- Serial.println("");
- Serial.println("WiFi connected");
- Serial.println("IP address: ");
- Serial.println(WiFi.localIP());
- Serial.println("Starting UDP");
- udp.begin(localPort);
- Serial.print("Local port: ");
- Serial.println(udp.localPort());
- }
- void loop()
- {
- jisu++;
- if (jisu > 180)jisu = 0;
- if (WiFi.status() != WL_CONNECTED)
- {
- Serial.println("wifi连接失败");
- }
- else
- {
- digitalWrite(PIN_LED, LOW);//WiFi led
- if (jisu == 3)
- {
- send2();
- delay(10000);
- }
- else
- {
- NTP(); // 更新时间
- delay(10000);
- }
- }
- }
- void send2()
- {
- HTTPClient http;
- Serial.print("[HTTP] begin...\n");
- http.begin("http://way.jd.com/he/freeweather?city=CN101280304&appkey=**************");//API
- Serial.print("[HTTP] GET...\n");
- int httpCode = http.GET();
- if (httpCode > 0) {
- Serial.printf("[HTTP] GET... code: %d\n", httpCode);
- if (httpCode == HTTP_CODE_OK)
- {
- String payload1, payload2, payload3;
- int chars1, chars2;
- //解析
- String payload = http.getString();
- chars1 = payload.indexOf("code");
- chars2 = payload.indexOf(""", chars1 + 7);
- payload1 = payload.substring(chars1 + 7, chars2);
- if (payload1 == "10000") //代码为1000是正确返回数据
- {
- // 查找地区
- chars1 = payload.indexOf("basic");
- chars2 = payload.indexOf(""", chars1 + 19);
- payload2 = payload.substring(chars1 + 16, chars2);
- print_send2 = payload2 + " 现在:";
- //----------------------------------------------天气实况
- chars1 = payload.indexOf("now");
- chars2 = payload.indexOf("}", chars1 + 150);
- payload1 = payload.substring(chars1, chars2);
- //天气实况文字
- chars1 = payload1.indexOf("txt");
- chars2 = payload1.indexOf(""", chars1 + 6);
- payload2 = payload1.substring(chars1 + 6, chars2);
- print_send2 = print_send2 + payload2 + ",湿度:";
- //体感温度
- chars1 = payload1.indexOf("hum");
- chars2 = payload1.indexOf(""", chars1 + 6);
- payload2 = payload1.substring(chars1 + 6, chars2);
- print_send2 = print_send2 + payload2 + "%,温度:";
- //温度
- chars1 = payload1.indexOf("tmp");
- chars2 = payload1.indexOf(""", chars1 + 6);
- payload2 = payload1.substring(chars1 + 6, chars2);
- print_send2 = print_send2 + payload2 + "℃,";
- //风向
- chars1 = payload1.indexOf("dir");
- chars2 = payload1.indexOf(""", chars1 + 6);
- payload2 = payload1.substring(chars1 + 6, chars2);
- print_send2 = print_send2 + payload2;
- //风力
- chars1 = payload1.indexOf("sc");
- chars2 = payload1.indexOf(""", chars1 + 5);
- payload2 = payload1.substring(chars1 + 5, chars2);
- print_send2 = print_send2 + "/" + payload2 + "级,空气:";
- //空气质量
- chars1 = payload.indexOf("qlty");
- chars2 = payload.indexOf(""", chars1 + 7);
- payload2 = payload.substring(chars1 + 7, chars2);
- print_send2 = print_send2 + payload2 + "。今天:";
- //----------------------------------------------天气预报,今天
- chars1 = payload.indexOf("daily_forecast");
- chars2 = payload.indexOf("]");
- payload1 = payload.substring(chars1, chars2);
- //今天白天天气状况文字
- chars1 = payload1.indexOf("txt_d");
- chars2 = payload1.indexOf(""", chars1 + 8);
- payload2 = payload1.substring(chars1 + 8, chars2);
- //今天夜间天气状况文字
- chars1 = payload1.indexOf("txt_n");
- chars2 = payload1.indexOf(""", chars1 + 8);
- payload3 = payload1.substring(chars1 + 8, chars2);
- //今天天气状况文字一样就只显示一个
- if (payload2 == payload3)
- print_send2 = print_send2 + payload3 + " ";
- else//不一样就转
- print_send2 = print_send2 + payload2 + "转" + payload3 + " ";
- //今天最高温度
- chars1 = payload1.indexOf("max");
- chars2 = payload1.indexOf(""", chars1 + 6);
- payload2 = payload1.substring(chars1 + 6, chars2);
- print_send2 = print_send2 + payload2 + "/";
- //今天最低温度
- chars1 = payload1.indexOf("min");
- chars2 = payload1.indexOf(""", chars1 + 6);
- payload2 = payload1.substring(chars1 + 6, chars2);
- print_send2 = print_send2 + payload2 + "℃,";
- //今天风向
- chars1 = payload1.indexOf("dir");
- chars2 = payload1.indexOf(""", chars1 + 6);
- payload2 = payload1.substring(chars1 + 6, chars2);
- print_send2 = print_send2 + payload2;
- //今天风力
- chars1 = payload1.indexOf("sc");
- chars2 = payload1.indexOf(""", chars1 + 5);
- payload2 = payload1.substring(chars1 + 5, chars2);
- print_send2 = print_send2 + "/" + payload2 + "级。明天:";
- //----------------------------------------------天气预报,明天
- chars1 = payload.indexOf("daily_forecast");
- chars1 = payload.indexOf("astro", chars1 + 150);
- chars2 = payload.indexOf("astro", chars1 + 150);
- payload1 = payload.substring(chars1, chars2);
- //明天白天天气状况文字
- chars1 = payload1.indexOf("txt_d");
- chars2 = payload1.indexOf(""", chars1 + 8);
- payload2 = payload1.substring(chars1 + 8, chars2);
- //明天夜间天气状况文字
- chars1 = payload1.indexOf("txt_n");
- chars2 = payload1.indexOf(""", chars1 + 8);
- payload3 = payload1.substring(chars1 + 8, chars2);
- //明天天气状况文字一样就只显示一个
- if (payload2 == payload3)
- print_send2 = print_send2 + payload3 + " ";
- else//不一样就转
- print_send2 = print_send2 + payload2 + "转" + payload3 + " ";
- //明天最高温度
- chars1 = payload1.indexOf("max");
- chars2 = payload1.indexOf(""", chars1 + 6);
- payload2 = payload1.substring(chars1 + 6, chars2);
- print_send2 = print_send2 + payload2 + "/";
- //明天最低温度
- chars1 = payload1.indexOf("min");
- chars2 = payload1.indexOf(""", chars1 + 6);
- payload2 = payload1.substring(chars1 + 6, chars2);
- print_send2 = print_send2 + payload2 + "℃,";
- //明天风向
- chars1 = payload1.indexOf("dir");
- chars2 = payload1.indexOf(""", chars1 + 6);
- payload2 = payload1.substring(chars1 + 6, chars2);
- print_send2 = print_send2 + payload2;
- //明天风力
- chars1 = payload1.indexOf("sc");
- chars2 = payload1.indexOf(""", chars1 + 5);
- payload2 = payload1.substring(chars1 + 5, chars2);
- print_send2 = "[Timetianqi1] " + print_send2 + "/" + payload2 + "级。 **";
- Serial.println(print_send2);//发送数据
- }
- else//接收数据出错
- print_send2 = "**数据返回出错,请检查APPKEY接口***";
- }
- else//访问状态出错
- print_send2 = "********数据接口访问出错********";
- }
- else//访问失败
- print_send2 = "********数据接口访问失败********";
- http.end();
- }
- void NTP() {
- WiFi.hostByName(ntpServerName, timeServerIP);
- sendNTPpacket(timeServerIP);
- delay(5000);
- int cb = udp.parsePacket();
- if (!cb) {
- Serial.println("无法连接阿里云时间服务器");
- return;
- }
- else {
- udp.read(packetBuffer, NTP_PACKET_SIZE);
- unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
- unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
- unsigned long secsSince1900 = highWord << 16 | lowWord;
- const unsigned long seventyYears = 2208988800UL;
- unsigned long epoch = secsSince1900 - seventyYears;
- unsigned long Time = time_zone * 3600 + epoch;
- unsigned long Y2KTime = (Time - 946684800) / 86400;
- unsigned long YTime;
- unsigned int Year;
- unsigned int Month = 0;
- unsigned long Day;
- //日期
- if (Y2KTime % 146097 <= 36525)
- {
- Year = 2000 + Y2KTime / 146097 * 400 + Y2KTime % 146097 / 1461 * 4 + (Y2KTime % 146097 % 1461 - 1) / 365;
- YTime = (Y2KTime % 146097 % 1461 - 1) % 365 + 1;
- }
- else
- {
- Year = 2000 + Y2KTime / 146097 * 400 + (Y2KTime % 146097 - 1) / 36524 * 100 + ((Y2KTime % 146097 - 1) % 36524 + 1) / 1461 * 4 + (((Y2KTime % 146097 - 1) % 36524 + 1) % 1461 - 1) / 365;
- YTime = (((Y2KTime % 146097 - 1) % 36524 + 1) % 1461 - 1) % 365 + 1;
- }
- Day = YTime;
- unsigned char f = 1; //循环标志
- while (f)
- {
- switch (Month)
- {
- case 0:
- if (Day < 31)
- f = 0;
- else
- Day -= 31;
- break;
- case 1:
- if (Day < 29)
- f = 0;
- else
- {
- if (LY(Year))
- {
- Day -= 29;
- }
- else
- {
- Day -= 28;
- }
- }
- break;
- case 2:
- if (Day < 31)
- f = 0;
- else
- Day -= 31;
- break;
- case 3:
- if (Day < 30)
- f = 0;
- else
- Day -= 30;
- break;
- case 4:
- if (Day < 31)
- f = 0;
- else
- Day -= 31;
- break;
- case 5:
- if (Day < 30)
- f = 0;
- else
- Day -= 30;
- break;
- case 6:
- if (Day < 31)
- f = 0;
- else
- Day -= 31;
- break;
- case 7:
- if (Day < 31)
- f = 0;
- else
- Day -= 31;
- break;
- case 8:
- if (Day < 30)
- f = 0;
- else
- Day -= 30;
- break;
- case 9:
- if (Day < 31)
- f = 0;
- else
- Day -= 31;
- break;
- case 10:
- if (Day < 30)
- f = 0;
- else
- Day -= 30;
- break;
- case 11:
- if (Day < 31)
- f = 0;
- else
- Day -= 31;
- break;
- }
- Month += 1;
- }
- Day += 1;
- Serial.print("[Timetianqi2] ");
- Serial.print(Year);
- Serial.print("-");
- if (Month < 10) {
- Serial.print('0');
- }
- Serial.print(Month);
- Serial.print("-");
- if (Day < 10) {
- Serial.print('0');
- }
- Serial.print(Day);
- Serial.print(" ");
- //时间
- if ((Time % 86400L) / 3600 < 10)
- {
- }
- Serial.print("");
- if ( (Time % 86400L) / 3600 < 10 ) {
- Serial.print('0');
- }
- Serial.print((Time % 86400L) / 3600);
- Serial.print(':');
- if ( ((Time % 3600) / 60) < 10 ) {
- Serial.print('0');
- }
- Serial.print((Time % 3600) / 60);
- Serial.print(':');
- if ( (Time % 60) < 10 ) {
- Serial.print('0');
- }
- Serial.print(Time % 60);
- Serial.print("**");
- Serial.println();
- }
- }
- unsigned long sendNTPpacket(IPAddress& address)
- {
- Serial.println("sending NTP packet...");
- memset(packetBuffer, 0, NTP_PACKET_SIZE);
- packetBuffer[0] = 0b11100011;
- packetBuffer[1] = 0;
- packetBuffer[2] = 6;
- packetBuffer[3] = 0xEC;
- packetBuffer[12] = 49;
- packetBuffer[13] = 0x4E;
- packetBuffer[14] = 49;
- packetBuffer[15] = 52;
- udp.beginPacket(address, 123);
- udp.write(packetBuffer, NTP_PACKET_SIZE);
- udp.endPacket();
- }
- unsigned char LY(unsigned int y)//判断是否为闰年
- {
- if (y % 400 == 0)
- return 1;
- if (y % 100 == 0)
- return 0;
- if (y % 4 == 0)
- return 1;
- }
复制代码
|
|