位置导航: 首页 / 物联网平台 / ESP8266心知天气应用 / 本页
在之前的课程里,我们学习了如何编写程序来利用ESP8266获取心知天气API数据。在我们开发需要天气信息的物联网项目时,可以使用心知天气API数据来获取天气信息。为了简化您的开发流程,提高开发效率。我们为您编写了一个专门用于获取心知天气的库,您只需要几行代码,就可以使用ESP8266获取天气信息。
本节课里,我们将向您讲解使用ESP8266-Seniverse库的具体方法。
1.准备工作
1.1 注册心知天气账户
使用本库前请预先注册好心知天气账号并且开通免费服务。如需了解详细操作方法,请点击这里前往我们制作的教程页面。
1.2 下载ESP8266-Seniverse库
请通过以下方式中的任何一种,来将ESP8266-Seniverse库下载到您的电脑中。
蓝奏云:https://wwa.lanzous.com/irrqvdns63i
GitHub:https://github.com/taichi-maker/ESP8266-Seniverse
码云:https://gitee.com/taijichuangke/ESP8266-Seniverse
1.3 将ESP8266-Seniverse库安装到Arduino IDE中
假如您不太确定如何操作,可以点击这里前往我们制作的图文教程页面。
1.4 将ArduinoJson库安装到Arduino IDE中
ArduinoJson库可通过以下渠道下载:
本站下载地址:太极创客网站下载页Arduino / ESP8266-NodeMCU第三方库下载部分
GitHub: https://github.com/bblanchon/ArduinoJson
2. 使用ESP8266-Seniverse库
ESP8266-Seniverse库可通过心知天气API获取以下免费信息:
– 实时天气信息(温度,天气)
– 天气预报信息(温度,天气,降水概率,风力,风向,湿度)
– 获取实时生活指数(穿衣,紫外线强度,洗车,旅游,感冒,运动)
接下来我们将提供三段示例程序的基本介绍。这三段示例程序分别用于实现以上列表中的三种功能。虽然是三段示例程序,但是程序实现的过程非常相似。我们将重点介绍以上列表中的第一个功能示例,也就是通过心知天气数据API获取实时天气信息。
2.1 获取实时天气信息示例程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : weather_now(rev.002) 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 初版建立时间20200602(最新修订时间20200607) 程序目的/Purpose : 使用ESP8266_Seniverse库通过心知天气服务器获取实时天气信息。 ----------------------------------------------------------------------- 本程序所属仓库网址 GitHub: https://github.com/taichi-maker/ESP8266-Seniverse Gitee: https://gitee.com/taijichuangke/ESP8266-Seniverse ----------------------------------------------------------------------- 其它说明 / Other Description 心知天气API文档说明: https://www.seniverse.com/docs 本程序为太极创客团队制作的免费视频教程《零基础入门学用物联网 》中一部分。该教程系统的 向您讲述ESP8266的物联网应用相关的软件和硬件知识。以下是该教程目录页: http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/ ***********************************************************************/ #include <ESP8266WiFi.h> #include <ESP8266_Seniverse.h> const char* ssid = "taichimaker"; // 连接WiFi名(此处使用taichi-maker为示例) // 请将您需要连接的WiFi名填入引号中 const char* password = "12345678"; // 连接WiFi密码(此处使用12345678为示例) // 请将您需要连接的WiFi密码填入引号中 // 请将您需要连接的WiFi密码填入引号中 // 心知天气API请求所需信息 // 请对以下信息进行修改,填入您的心知天气私钥以及需要获取天气信息的城市和温度单位 // 如需进一步了解心知天气API所提供的城市列表等信息,请前往心知天气官方产品文档网址: // https://www.seniverse.com/docs String reqUserKey = "XXXXXXXXXXXXXXXXX"; // 私钥 String reqLocation = "beijing"; // 城市 String reqUnit = "c"; // 摄氏/华氏 WeatherNow weatherNow; // 建立WeatherNow对象用于获取心知天气信息 void setup(){ Serial.begin(9600); Serial.println(""); connectWiFi(); // 连接wifi // 配置心知天气请求信息 weatherNow.config(reqUserKey, reqLocation, reqUnit); } void loop(){ if(weatherNow.update()){ // 更新天气信息 Serial.println(F("======Weahter Info======")); Serial.print("Server Response: "); Serial.println(weatherNow.getServerCode()); // 获取服务器响应码 Serial.print(F("Weather Now: ")); Serial.print(weatherNow.getWeatherText()); // 获取当前天气(字符串格式) Serial.print(F(" ")); Serial.println(weatherNow.getWeatherCode());// 获取当前天气(整数格式) Serial.print(F("Temperature: ")); Serial.println(weatherNow.getDegree()); // 获取当前温度数值 Serial.print(F("Last Update: ")); Serial.println(weatherNow.getLastUpdate()); // 获取服务器更新天气信息时间 Serial.println(F("========================")); } else { // 更新失败 Serial.println("Update Fail..."); Serial.print("Server Response: "); // 输出服务器响应状态码供用户查找问题 Serial.println(weatherNow.getServerCode()); // 心知天气服务器错误代码说明可通过以下网址获取 } // https://docs.seniverse.com/api/start/error.html delay(3000); } // 连接WiFi void connectWiFi(){ WiFi.begin(ssid, password); // 启动网络连接 Serial.print("Connecting to "); // 串口监视器输出网络连接信息 Serial.print(ssid); Serial.println(" ..."); // 告知用户NodeMCU正在尝试WiFi连接 int i = 0; // 这一段程序语句用于检查WiFi是否连接成功 while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 delay(1000); // 如果WiFi连接成功则返回值为WL_CONNECTED Serial.print(i++); Serial.print(' '); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值 } // 同时NodeMCU将通过串口监视器输出连接时长读秒。 // 这个读秒是通过变量i每隔一秒自加1来实现的。 Serial.println(""); // WiFi连接成功后 Serial.println("Connection established!"); // NodeMCU将通过串口监视器输出"连接成功"信息。 Serial.print("IP address: "); // 同时还将输出NodeMCU的IP地址。这一功能是通过调用 Serial.println(WiFi.localIP()); // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。 } |
以上示例程序是ESP8266-Seniverse库example目录中的weather_now程序。
首先在以上示例程序的第38行里,我们通过WeatherNow来建立对象获取心知天气的对象,该语句为WeatherNow weatherNow;
。
接下来程序第47行使用config函数配置连接心知天气的用户私钥(reqUserKey)、城市信息(reqLocation)以及温度单位(reqLocation)。weatherNow.config(reqUserKey, reqLocation, reqUnit)
在程序第51行使用update函数实现ESP8266开发板通过心知天气对天气信息进行更新 weatherNow.update()
。此函数返回值为bool型。在ESP8266成功连接心知天气服务器并且服务器返回响应状态码为200时,此函数将会返回真,否则会返回假。
程序的第54行使用了getServerCode()函数来获取心知天气服务器响应状态码。该函数可以获得的服务器响应状态。当用户通过ESP8266向心知天气发送的请求存在问题时(如私钥错误、请求信息内容错误等),服务器会通过响应状态码告知用户问题具体原因。您可以通过心知天气的官方文档获得服务器响应状态码所对应的具体问题原因。
程序56,58,60行分别使用了一系列函数用来获取开发板更新到的天气信息具体内容。这些函数的作用请见以下列表。
– 获取当前天气信息 (返回值类型:String): weatherNow.getWeatherText()
– 获取当前天气信息 (返回值类型:int): weatherNow.getWeatherCode()
– 获取当前温度信息 (返回值类型:int): weatherNow.getDegree()
程序第62行使用getLastUpdate()函数来获取心知天气公司的天气服务信息更新时间。
2.2 获取天气预报信息示例程序
以下示例程序与2.1 获取实时天气信息在结构上非常相似。这里我们将着重讲解程序中的不同部分。
首先程序第38行建立获取天气预报信息的对象名称使用的语句是Forecast forecast。这一点与以上程序有所区别。
另外在获取天气预报所使用的函数也与以上程序不同,以下列出了这一系列函数的具体用途(下列函数的参数i为获取第几天信息的天数序号。例:参数为0,则函数将会返回今天的天气预报信息。参数为1,则返回明天的天气预报…依此类推。参数i取值范围为0-2。):
– 获取白天天气信息(返回值类型:String): forecast.getDayText(i)
– 获取白天天气信息(返回值类型:int): forecast.getDayCode(i)
– 获取夜晚天气信息(返回值类型:String): forecast.getNightText(i)
– 获取夜晚天气信息(返回值类型:int): forecast.getNightCode(i)
– 获取最高气温(返回值类型:int) : forecast.getHigh(i)
– 获取最低气温(返回值类型:int) : forecast.getLow(i)
– 获取心知天气信息更新时间(返回值类型:String) :forecast.getLastUpdate(i)
– 获取降水概率信息(返回值类型:float): forecast.getRain(i)
– 获取风向信息(返回值类型:String): forecast.getWindDirection(i)
– 获取风速信息(返回值类型:float): forecast.getWindSpeed(i)
– 获取风力信息(返回值类型:int): forecast.getWindScale(i)
– 获取湿度信息(返回值类型:int): forecast.getHumidity(i)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : forecast(rev.001) 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 初版建立时间20200603 程序目的/Purpose : 使用ESP8266_Seniverse库通过心知天气服务器获取天气预报信息 ----------------------------------------------------------------------- 本程序所属仓库网址 GitHub: https://github.com/taichi-maker/ESP8266-Seniverse Gitee: https://gitee.com/taijichuangke/ESP8266-Seniverse ----------------------------------------------------------------------- 其它说明 / Other Description 心知天气API文档说明: https://www.seniverse.com/docs 本程序为太极创客团队制作的免费视频教程《零基础入门学用物联网 》中一部分。该教程系统的 向您讲述ESP8266的物联网应用相关的软件和硬件知识。以下是该教程目录页: http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/ ***********************************************************************/ #include <ESP8266WiFi.h> #include <ESP8266_Seniverse.h> const char* ssid = "taichimaker"; // 连接WiFi名(此处使用taichi-maker为示例) // 请将您需要连接的WiFi名填入引号中 const char* password = "12345678"; // 连接WiFi密码(此处使用12345678为示例) // 请将您需要连接的WiFi密码填入引号中 // 心知天气API请求所需信息 // 请对以下信息进行修改,填入您的心知天气私钥以及需要获取天气信息的城市和温度单位 // 如需进一步了解心知天气API所提供的城市列表等信息,请前往心知天气官方产品文档网址: // https://www.seniverse.com/docs String reqUserKey = "XXXXXXXXXXXXXXXXX"; // 私钥 String reqLocation = "beijing"; // 城市 String reqUnit = "c"; // 摄氏/华氏// 请将您需要连接的WiFi密码填入引号中 Forecast forecast; // 建立Forecast对象用于获取心知天气信息 void setup(){ Serial.begin(9600); Serial.println(""); connectWiFi(); // 连接wifi // 配置心知天气请求信息 forecast.config(reqUserKey, reqLocation, reqUnit); } void loop(){ if(forecast.update()){ // 更新天气信息 for(int i = 0; i < 3; i++){ Serial.print(F("========Day ")); Serial.print(i); Serial.println(F("========")); Serial.print(F("Day Weather: ")); Serial.print(forecast.getDayText(i)); Serial.print(F(" ")); Serial.println(forecast.getDayCode(i)); Serial.print(F("Night Weather: ")); Serial.print(forecast.getNightText(i)); Serial.print(F(" ")); Serial.println(forecast.getNightCode(i)); Serial.print(F("High: ")); Serial.print(forecast.getHigh(i)); Serial.println(F("°C")); Serial.print(F("LOW: ")); Serial.print(forecast.getLow(i)); Serial.println(F("°C")); Serial.print(F("Rainfall: ")); Serial.print(forecast.getRain(i)); Serial.println(F("%")); Serial.print(F("Wind Direction: ")); Serial.println(forecast.getWindDirection(i)); Serial.print(F("Wind Speed: ")); Serial.println(forecast.getWindSpeed(i)); Serial.print(F("Wind Scale: ")); Serial.println(forecast.getWindScale(i)); Serial.print(F("Humidity: ")); Serial.println(forecast.getHumidity(i)); Serial.print(F("Last Update: ")); Serial.println(forecast.getLastUpdate()); } Serial.print(F("Server Code: ")); Serial.println(forecast.getServerCode()); Serial.println(F("=====================")); } else { // 更新失败 Serial.println("Update Fail..."); //Serial.print("Server Response: "); // 输出服务器响应状态码供用户查找问题 //Serial.println(weatherNow.getServerCode()); // 心知天气服务器错误代码说明可通过以下网址获取 } // https://docs.seniverse.com/api/start/error.html delay(3000); } // 连接WiFi void connectWiFi(){ WiFi.begin(ssid, password); // 启动网络连接 Serial.print("Connecting to "); // 串口监视器输出网络连接信息 Serial.print(ssid); Serial.println(" ..."); // 告知用户NodeMCU正在尝试WiFi连接 int i = 0; // 这一段程序语句用于检查WiFi是否连接成功 while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 delay(1000); // 如果WiFi连接成功则返回值为WL_CONNECTED Serial.print(i++); Serial.print(' '); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值 } // 同时NodeMCU将通过串口监视器输出连接时长读秒。 // 这个读秒是通过变量i每隔一秒自加1来实现的。 Serial.println(""); // WiFi连接成功后 Serial.println("Connection established!"); // NodeMCU将通过串口监视器输出"连接成功"信息。 Serial.print("IP address: "); // 同时还将输出NodeMCU的IP地址。这一功能是通过调用 Serial.println(WiFi.localIP()); // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。 } |
2.3 获取生活指数信息示例程序
以下示例程序中的结构与操作方法都与以上示例程序非常相似,我们就不再赘述它的具体内容了,而只列出主要函数的功能用途:
– 获取洗车建议(返回值类型:String): lifeInfo.getCarWash()
– 获取穿衣建议(返回值类型:String): lifeInfo.getDressing()
– 获取流感建议(返回值类型:String): lifeInfo.getFactorFlu()
– 获取运动建议(返回值类型:String): lifeInfo.getExercise()
– 获取旅游建议(返回值类型:String): lifeInfo.getTravel()
– 获取紫外线建议(返回值类型:String): lifeInfo.getUV()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : life_info(rev.0.01) 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 初版建立时间20200603 程序目的/Purpose : 使用ESP8266_Seniverse库通过心知天气服务器获取生活信息 ----------------------------------------------------------------------- 本程序所属仓库网址 GitHub: https://github.com/taichi-maker/ESP8266-Seniverse Gitee: https://gitee.com/taijichuangke/ESP8266-Seniverse ----------------------------------------------------------------------- 其它说明 / Other Description 心知天气API文档说明: https://www.seniverse.com/docs 本程序为太极创客团队制作的免费视频教程《零基础入门学用物联网 》中一部分。该教程系统的 向您讲述ESP8266的物联网应用相关的软件和硬件知识。以下是该教程目录页: http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/ ***********************************************************************/ #include <ArduinoJson.h> #include <ESP8266WiFi.h> #include <ESP8266_Seniverse.h> const char* ssid = "taichimaker"; // 连接WiFi名(此处使用taichi-maker为示例) // 请将您需要连接的WiFi名填入引号中 const char* password = "12345678"; // 连接WiFi密码(此处使用12345678为示例) // 请将您需要连接的WiFi密码填入引号中 // 心知天气API请求所需信息 // 请对以下信息进行修改,填入您的心知天气私钥以及需要获取天气信息的城市和温度单位 // 如需进一步了解心知天气API所提供的城市列表等信息,请前往心知天气官方产品文档网址: // https://www.seniverse.com/docs String reqUserKey = "XXXXXXXXXXXXXXXXX"; // 私钥 String reqLocation = "beijing"; // 城市 String reqUnit = "c"; // 摄氏/华氏// 请将您需要连接的WiFi密码填入引号中 LifeInfo lifeInfo; // 建立Forecast对象用于获取心知天气信息 void setup(){ Serial.begin(9600); Serial.println(""); connectWiFi(); // 连接wifi // 配置心知天气请求信息 lifeInfo.config(reqUserKey, reqLocation, reqUnit); } void loop(){ if(lifeInfo.update()){ // 更新天气信息 Serial.println("Update OK"); Serial.print("Server Response: "); Serial.println(lifeInfo.getServerCode()); Serial.println(F("======Life Info=======")); Serial.print(F("Car Washing: ")); Serial.println(lifeInfo.getCarWash()); Serial.print(F("Dressing: ")); Serial.println(lifeInfo.getDressing()); Serial.print(F("Flu Factor: ")); Serial.println(lifeInfo.getFactorFlu()); Serial.print(F("Sport: ")); Serial.println(lifeInfo.getExercise()); Serial.print(F("Travel: ")); Serial.println(lifeInfo.getTravel()); Serial.print(F("UV: ")); Serial.println(lifeInfo.getUV()); Serial.print(F("Last Update: ")); Serial.println(lifeInfo.getLastUpdate()); Serial.println(F("======================")); } else { // 更新失败 Serial.println("Update Fail..."); Serial.print("Server Response: "); // 输出服务器响应状态码供用户查找问题 Serial.println(lifeInfo.getServerCode()); // 心知天气服务器错误代码说明可通过以下网址获取 } // https://docs.seniverse.com/api/start/error.html delay(3000); } // 连接WiFi void connectWiFi(){ WiFi.begin(ssid, password); // 启动网络连接 Serial.print("Connecting to "); // 串口监视器输出网络连接信息 Serial.print(ssid); Serial.println(" ..."); // 告知用户NodeMCU正在尝试WiFi连接 int i = 0; // 这一段程序语句用于检查WiFi是否连接成功 while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 delay(1000); // 如果WiFi连接成功则返回值为WL_CONNECTED Serial.print(i++); Serial.print(' '); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值 } // 同时NodeMCU将通过串口监视器输出连接时长读秒。 // 这个读秒是通过变量i每隔一秒自加1来实现的。 Serial.println(""); // WiFi连接成功后 Serial.println("Connection established!"); // NodeMCU将通过串口监视器输出"连接成功"信息。 Serial.print("IP address: "); // 同时还将输出NodeMCU的IP地址。这一功能是通过调用 Serial.println(WiFi.localIP()); // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。 } |