当前位置: 首页 > news >正文

做外贸怎么连接国外网站整形网站 源码

做外贸怎么连接国外网站,整形网站 源码,做网站开发服务商,自己怎么做网站赚钱吗今天是第六专题#xff0c;主要内容是#xff1a;导入ArduinoJson功能库#xff0c;借助该库解析从【心知天气】官网返回的JSON数据#xff0c;并显示在 TFT 屏幕上。 如您需要了解其它专题的内容#xff0c;请点击下面的链接。 第一专题内容#xff0c;请参考主要内容是导入ArduinoJson功能库借助该库解析从【心知天气】官网返回的JSON数据并显示在 TFT 屏幕上。 如您需要了解其它专题的内容请点击下面的链接。         第一专题内容请参考连接点亮SPI-TFT屏幕和UI布局设计         第二专题内容请参考WIFI模式设置及连接         第三专题内容请参考连接SHT30传感器获取并显示当前环境温湿度数据I2C         第四专题内容请参考通过NTPClient库获取实时网络时间并显示在TFT屏幕上         第五专题内容请参考获取关于城市天气实况和天气预报的JSON信息心知天气版 一、【心知天气】官网JSON数据特点 1、通过API返回的JSON数据是未经压缩的明文JSON数据可以直接使用ArduinoJson功能库解析需要的数值JSON数据解析过程简单方便。         2、天气实况数据。付费用户可获取全部数据免费用户只返回天气现象文字、天气现象代码和气温 3 项数据可供使用的数据比较少。数据更新频率国内城市在 15 分钟左右国际城市在 20 分钟左右。         3、天气预报数据。可获取指定城市未来最多 15 天每天的白天和夜间预报。一般每天更新 3-4 次。付费用户可获取全部数据免费用户只返回 3 天天气预报可供使用的数据比较少。         说明如果仅作程序调试使用可申请开通试用版能通过API获取全部数据试用期14天。         二、添加ArduinoJson库 1、ArduinoJson库。是为 Arduino 和 IOT(Internet Of Things物联网)开的 C JSON库使用简单、高效通用性强在Github具备很高的活跃度。支持JSON数据的序列化、反序列化或称序列化还原、解析、MessagePack、流数据、过滤以及其他功能。官网链接Github站点。        2、添加库方法。打开 PlatformIO 界面选择 Libraries 图标在搜索栏内输入 ArduinoJson在查询结果中选择ArduinoJson by Benoit Blanchon库,添加到项目中。        3、使用方法。解析JSON天气信息数据的程序代码我们一般借助ArduinoJson官网提供的工具助手Assistant先生成基本代码然后根据项目需要进行取舍或进行格式转换后再复制到项目中。本文第三部分我们进行示例说明。        4、重要文档。关于安装库建构和解析JSON官方示例API参考FAQ等有关信息请查阅官网 documentation 的内容。 三、解析JSON数据方法步骤  这是从【心知天气】官网通过API请求返回的原始JSON数据。 // 这是从【心知天气】官网通过API请求返回的原始JSON数据 {results:[{location:{id:WWE0TGW4PX6N,name:济南,country:CN,path:济南,济南,山东,中国,timezone:Asia/Shanghai,timezone_offset:08:00},now:{text:晴,code:0,temperature:28,feels_like:27,pressure:989,humidity:31,visibility:26.6,wind_direction:南,wind_direction_degree:201,wind_speed:30.0,wind_scale:5,clouds:15,dew_point:},last_update:2024-05-10T11:07:4108:00}]} 在这部分我们以【心知天气】返回的JSON数据为例来说明生成解析代码的方法。         1、打开ArduinoJson官网。点选页面上方菜单栏 [Assistant]显示以下界面。Board项选择NodeMCU 1.0 (ESP-12E Module)Mode项选择 Deserialize Input项选择 String。点击右下方按钮 [NextJSON]。 2、复制JSON代码。将上述JSON原始数据复制到页面的【Input】输入框内点击右下方按钮 【NextProgram】。        3、生成解析程序代码。以下输入框内就是使用助手自动生成解析代码。将代码复制到项目中稍加调整修改后就可以很方便地取出JSON内的数值了。        4、测试。新建一个项目把以下代码复制到 main.cpp 中然后编译上传到开发板。 #include Arduino.h #include ArduinoJson.hvoid setup() {// Initialize serial portSerial.begin(9600);while (!Serial)continue;// JSON input string.const char *json {\results\:[{\location\:{\id\:\WWE0TGW4PX6N\,\name\:\济南\,\country\:\CN\,\path\:\济南,济南,山东,中国\,\timezone\:\Asia/Shanghai\,\timezone_offset\:\08:00\},\now\:{\text\:\晴\,\code\:\0\,\temperature\:\28\,\feels_like\:\27\,\pressure\:\989\,\humidity\:\31\,\visibility\:\26.6\,\wind_direction\:\南\,\wind_direction_degree\:\201\,\wind_speed\:\30.0\,\wind_scale\:\5\,\clouds\:\15\,\dew_point\:\\},\last_update\:\2024-05-10T11:07:4108:00\}]};// String input;JsonDocument doc;DeserializationError error deserializeJson(doc, json);if (error){Serial.print(deserializeJson() failed: );Serial.println(error.c_str());return;}JsonObject results_0 doc[results][0];// Fetch the valuesSerial.println();Serial.println();Serial.print(地区名称: );Serial.println(doc[results][0][location][name].asString());Serial.print(当前天气: );Serial.println(doc[results][0][now][text].asString());Serial.print(当前温度: );Serial.println(doc[results][0][now][temperature].asString());Serial.print(空气湿度: );Serial.println(doc[results][0][now][humidity].asString());Serial.print(能见度: );Serial.println(doc[results][0][now][visibility].asString());Serial.print(风向: );Serial.println(doc[results][0][now][wind_direction].asString());Serial.print(风力: );Serial.println(doc[results][0][now][wind_scale].asString() 级);Serial.print(风速: );Serial.println(doc[results][0][now][wind_speed].asString() 公里/每小时);Serial.print(更新时间: );Serial.println(doc[results][0][last_update].asString().substring(0, 16)); }void loop(){}如果您在串口监视器看到如下输出信息那就说明成功了。 四、本项目获取和解析JSON数据结构和功能函数 关于获取和解析天气信息JSON数据的数据结构和函数都封装在weather_xinzhi.h文件中其中主要包括 2 个数据结构 和 4 个功能 函数。        1、实况天气数据结构struct weather_now_data{}用于保存解析成功后的实况天气信息。 struct weather_now_data {// 天气现象文字包括阴晴雨雪等天气状态的描述String text ;// 天气现象代码int code -1;// 温度单位为c摄氏度String temperature 0;// 体感温度默认单位摄氏度int feels_like 0;// 大气压强默认单位百帕int pressure -1;// 相对湿度0~100单位为百分比int humidity -1;// 能见度默认单位公里int visibility -1;// 风向文字String wind_direction ;// 风向角度范围0~3600为正北90为正东180为正南270为正西String wind_direction_degree -1;// 风速单位为km/h公里每小时或mph英里每小时int wind_speed -1;// 风力等级String wind_scale -1;// 数据更新时间该城市的本地时间String last_update ; } wd; 2、天气预报数据结构struct weather_tmr_data{}用于保存获取到的天气预报信息。 struct weather_tmr_data {String location_name; // 预报地区名称String date ; // 日期该城市的本地时间String text_day ; // 白天天气现象文字String code_day ; // 白天天气现象代码String text_night ; // 晚间天气现象文字String code_night ; // 晚间天气现象代码String high ; // 当天最高温度String low ; // 当天最低温度String precip ; // 降水概率范围0~1单位百分比目前仅支持国外城市String wind_direction ; // 风向文字String wind_direction_degree ; // 风向角度范围0~360String wind_speed ; // 风速单位km/h当unitc时、mph当unitf时String wind_scale ; // 风力等级String rainfall ; // 降水量单位mmString humidity ; // 相对湿度0~100单位为百分比String last_update ; // 数据更新时间该城市的本地时间 };weather_tmr_data wtd[3]; 3、获取实况天气函数void get_now_Weather() // 获取实况天气函数 void get_now_Weather() {// 检查WI-FI是否已连接if (WiFi.status() WL_CONNECTED){// 准备发起请求std::unique_ptrBearSSL::WiFiClientSecure client(new BearSSL::WiFiClientSecure);client-setInsecure();HTTPClient https;// Serial.print([HTTPS] begin...\n);// 请求接口if (https.begin(*client, https://api.seniverse.com/v3/weather/now.json?key key location city_name languagezh-Hansunitc)){// 获取HTTP的状态码一般200成功出现其他的比如404、500 均为各种报错int httpCode https.GET();Serial.println(httpCode);if (httpCode 0){if (httpCode HTTP_CODE_OK || httpCode HTTP_CODE_MOVED_PERMANENTLY){// 从接口获取数据String payload https.getString();Serial.println(payload);// 调用解析函数JsonDocument doc;DeserializationError err deserializeJson(doc, payload);if (err.code() DeserializationError::Ok){get_now_weather_data(doc);}else{Serial.println(数据解析出错);}}}else{Serial.printf([HTTP] GET... failed, error: %s\n, https.errorToString(httpCode).c_str());}https.end();}} } 4、获取未来几天的天气预报函数void get_tmr_Weather()可以在 https.begin() 函数中根据需要修改起始日期和天数。 // 获取未来3天的天气预报 void get_tmr_Weather() {// 检查WI-FI是否已连接if (WiFi.status() WL_CONNECTED){// 准备发起请求std::unique_ptrBearSSL::WiFiClientSecure client(new BearSSL::WiFiClientSecure);client-setInsecure();HTTPClient https;// 请求接口if (https.begin(*client, https://api.seniverse.com/v3/weather/daily.json?key key location city_name languagezh-Hansunitcstart1days3)){// 获取HTTP的状态码一般200成功出现其他的比如404、500 均为各种报错int httpCode https.GET();Serial.println(httpCode);if (httpCode 0){if (httpCode HTTP_CODE_OK || httpCode HTTP_CODE_MOVED_PERMANENTLY){// 从接口获取数据String payload https.getString();Serial.println(payload);// 调用解析函数JsonDocument doc;DeserializationError err deserializeJson(doc, payload);if (err.code() DeserializationError::Ok){get_tmr_weather_data(doc);}else{Serial.println(数据解析出错);}}}else{Serial.printf([HTTP] GET... failed, error: %s\n, https.errorToString(httpCode).c_str());}https.end();}} } 5、提取实况天气具体数值的函数void get_now_weather_data(JsonDocument doc) void get_now_weather_data(JsonDocument doc) {// 将数据保存到weahter_data 的结构体方便后续调用wd.text doc[results][0][now][text].asString();wd.code doc[results][0][now][code];wd.temperature doc[results][0][now][temperature].asString();wd.feels_like doc[results][0][now][feels_like].asint();wd.pressure doc[results][0][now][pressure].asint();wd.humidity doc[results][0][now][humidity].asint();wd.visibility doc[results][0][now][visibility].asint();wd.wind_direction doc[results][0][now][wind_direction].asString();wd.wind_direction_degree doc[results][0][now][wind_direction_degree].asString();wd.wind_speed doc[results][0][now][wind_speed].asint();wd.wind_scale doc[results][0][now][wind_scale].asString();wd.last_update doc[results][0][last_update].asString().substring(0, 16);wd.last_update.replace(T, ); } 6、提取未来天气预报具体数值的函数void get_tmr_weather_data(JsonDocument doc) void get_tmr_weather_data(JsonDocument doc) {// 将数据保存到weahter_tmr_data 的结构体方便后续调用wtd[0].location_name doc[results][0][location][name].asString(); 日期该城市的本地时间wtd[0].date doc[results][0][daily][0][date].asString(); 日期该城市的本地时间wtd[0].text_day doc[results][0][daily][0][text_day].asString(); // 白天天气现象文字wtd[0].code_day doc[results][0][daily][0][code_day].asString(); // 白天天气现象代码wtd[0].text_night doc[results][0][daily][0][text_night].asString(); // 晚间天气现象文字wtd[0].code_night doc[results][0][daily][0][code_night].asString(); // 晚间天气现象代码wtd[0].high doc[results][0][daily][0][high].asString(); // 当天最高温度wtd[0].low doc[results][0][daily][0][low].asString(); // 当天最低温度wtd[0].precip doc[results][0][daily][0][precip].asString(); // 降水概率范围0~1单位百分比目前仅支持国外城市wtd[0].wind_direction doc[results][0][daily][0][wind_direction].asString(); // 风向文字wtd[0].wind_direction_degree doc[results][0][daily][0][wind_direction_degree].asString(); // 风向角度范围0~360wtd[0].wind_speed doc[results][0][daily][0][wind_speed].asString(); // 风速单位km/h当unitc时、mph当unitf时wtd[0].wind_scale doc[results][0][daily][0][wind_scale].asString(); // 风力等级wtd[0].rainfall doc[results][0][daily][0][rainfall].asString(); // 降水量单位mmwtd[0].humidity doc[results][0][daily][0][humidity].asString(); // 相对湿度0~100单位为百分比wtd[0].last_update doc[results][0][last_update].asString().substring(0, 16); // 数据更新时间该城市的本地时间wtd[0].last_update.replace(T, ); } 7、说明。关于 main.cpp 内容的修改主要集中在调用既有功能函数和调整显示位置方面请大家自行阅读代码。         特别提醒修改两项内容1WiFi连接的 ssid 和 password2心知天气私钥。         免费用户获的信息数据受到限制可以申请开通试用版测试体验全部信息数据。 // 项目 main.cpp 主要内容 #include Arduino.h #include TFT_eSPI.h #include ArduinoJson.h// 连接wifi用的库 #include ESP8266WiFi.h #include ESP8266HTTPClient.h/**配置您所在环境的wifi 账号和密码注意切勿连接 5G的频率、不要使用双频融合路由器注意账号密码必须完全正确包括字母大小写、空格、中划线、下划线 */ const char *ssid xcb940; const char *password 87589940abc;//const char *ssid LGCWZS; //const char *password 87129168;// 构造函数实例化 TFT 屏幕对象 TFT_eSPI tft TFT_eSPI();// WiFi 连接函数声明 void connectWiFi();// 程序用到的字库文件后面会详细说明 #include hefeng-min-40px.h #include weather_font20.h #include weather_font16.h// 网络时钟的刷新频率 unsigned long last_ntp 0; const long interval_ntp 1000; // 网络时钟的刷新频率毫秒// 今日天气的刷新频率 unsigned long last_weather 0; const long interval_weather 1000 * 60 * 5; // 今日天气的刷新频率毫秒,每300毫秒更新一次// 明日天气的刷新频率 unsigned long last_tmr_weather 0; const long interval_tmr_weather 1000 * 60 * 60; // 明天天气的刷新频率毫秒每3600毫秒更新一次// 温湿度传感器的刷新频率 unsigned long last_sht 0; const long interval_sht 3000; // 温湿度传感器的刷新频率毫秒每3000毫秒更新一次// 心知天气免费版密钥************** // const String key **************;// 心知天气试用版密钥**************有效期14天自2024-05-09始 const String key **************;// 你的城市ID获取方法参考课程 const String city_name jinan;#include sht30.h #include ntptime.h #include weather_xinzhi.hvoid setup() {Serial.begin(115200);tft.init();tft.setSwapBytes(true);tft.setRotation(0);tft.fillScreen(TFT_BLACK);tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.setTextSize(2);// 联网tft.println(Wi-Fi String(ssid));// initWiFi();connectWiFi();tft.println();tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.println();// 今日天气tft.println(Get Today weather);get_now_Weather();get_tmr_Weather();tft.setTextSize(1);tft.println();tft.setTextSize(2);// 对时tft.println(Get NTP Time);initNtp();// 温湿度传感器tft.println();tft.println(load Sensor Data..);sht30_setup();tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.println();tft.println(start...);delay(500);tft.fillScreen(TFT_BLACK); }void loop() {// 获取单片机启动至今的毫秒数unsigned long currentMillis millis();// 显示当前日期星期几农历// update ntp 时间if (last_ntp 0 || currentMillis - last_ntp interval_ntp){last_ntp currentMillis;loopNtp();tft.loadFont(weather_font16);tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.drawString(dt.localDate weekOfDate1(dt.year, dt.month, dt.day) outputLunarDate(dt.year, dt.month, dt.day), 0, 0);tft.unloadFont();tft.setTextSize(5);tft.setTextColor(TFT_GREEN, TFT_BLACK, true);tft.drawString(dt.localTime, 0, 30);}// 今日天气if (last_weather 0 || currentMillis - last_weather interval_weather){if (last_weather 0){get_now_Weather();}last_weather currentMillis;// 擦除指定区域tft.fillRect(55, 90, 240, 40, TFT_BLACK);tft.setTextColor(TFT_YELLOW, TFT_BLACK, true);tft.loadFont(hefeng40);// tft.drawString(icon(wd.now_icon), 10, 90);tft.unloadFont();tft.loadFont(weather_font20);tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.drawString(Now: String(wd.temperature) ° wd.text, 55, 90);tft.drawString(wd.wind_direction 风 String(wd.wind_scale) 级 wd.wind_speed KM/H, 55, 110);tft.drawLine(0, 140, 240, 140, TFT_WHITE);}// 明日天气if (last_tmr_weather 0 || currentMillis - last_tmr_weather interval_tmr_weather){if (last_tmr_weather 0){get_tmr_Weather();}last_tmr_weather currentMillis;// 擦除指定区域tft.fillRect(55, 150, 240, 40, TFT_BLACK);tft.loadFont(hefeng40);tft.setTextColor(TFT_YELLOW, TFT_BLACK, true);// tft.drawString(icon(wtd[1].iconDay), 10, 150);tft.unloadFont();tft.loadFont(weather_font20);tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.drawString(明天 String(wtd[0].low) ° - String(wtd[0].high) °, 55, 150);tft.drawString(wtd[0].text_day 风力 wtd[0].wind_scale 级, 55, 170);// 这条线其实没必要重新绘制tft.drawLine(0, 200, 240, 200, TFT_WHITE);}// 温湿度传感器的数据if (last_sht 0 || currentMillis - last_sht interval_sht){last_sht currentMillis;sht30();tft.loadFont(weather_font20);tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.drawString(室温, 0, 210);tft.setTextColor(TFT_GREEN, TFT_BLACK, true);tft.drawString(String(sht_data.temperature) C , 40, 210);tft.setTextColor(TFT_WHITE, TFT_BLACK, true);tft.drawString(湿度, 120, 210);tft.setTextColor(TFT_GREEN, TFT_BLACK, true);tft.drawString(String(sht_data.humidity) % , 170, 210); //3原为120的x轴位置因为视觉上似乎贴的优点近了} }// 连接wifi void connectWiFi() {Serial.print(Connecting to );Serial.println(ssid);// 设置WiFi工作在终端模式参数可选填WIFI_AP、WIFI_STA、WIFI_AP_STA、WIFI_OFFWiFi.mode(WIFI_STA);// 开始连接WiFi.begin(ssid, password);// 检查连接是否成功while (WiFi.status() ! WL_CONNECTED){delay(500);Serial.print(.);tft.print(.);}tft.println();tft.println();tft.setTextColor(TFT_GREEN, TFT_BLACK, true);tft.println(WiFi.localIP());// 设置当路由器断开连接时是否启动自动重新连接功能。true: 启用自动重新连接false不启用此功能WiFi.setAutoReconnect(true);// 设置是否将WiFi参数保存于Flash中默认为true即在每次调用WiFi.begin()、WiFi.softAP()、WiFi.disconnect、WiFi.softAPdisconnect方法时都会将相关数据写入到Flash中// 当设置为false时以上动作将不会把数据写入Flash中仅仅改变内存中的WiFi设置WiFi.persistent(true);// 连接成功后在串口监视器显示自身IP地址以下5行代码作调试用Serial.println();Serial.println(WiFi connected);Serial.println(IP address: );Serial.println(WiFi.localIP());Serial.println(); }五、项目运行展示 NodeMcu1.0_天气时钟温湿度展示 六、项目源代码下载 百度网盘下载地址         https://pan.baidu.com/s/1-cENF6LaInjF3sw_qs40Vg?pwdme32         提取码me32        部分代码来自于网络大神如有异议请联系。 参考文档 1. JSON 基本使用_json怎么用-CSDN博客 2. JSON——概述、JSON语法、序列化和反序列化_所有文档都可以通过json序列化吗-CSDN博客
http://www.dnsts.com.cn/news/171766.html

相关文章:

  • 阿里云服务器做电影网站吗网站规划说明
  • 上传空间网站北京做网站哪家公司最好
  • 赛门仕博做网站怎么样页面设计层次架构包括什么
  • 书画网站模板下载公司网址格式怎么写
  • 怎样在外管局网站做延期付款动易网站 首页模板修改
  • 广东网站建设开发公司wordpress手机 不适应
  • 服装网站建设如何解决企业网站建立网络虚拟社区时对于企业
  • 动易网站 模板企业年金查询app
  • 广州智能建站html电影网页设计实例代码
  • 大同滕佳科技网站建设邯郸市教育公共服务平台
  • 互联网平台排名wordpress怎么seo好
  • 传媒网站制作杭州建设网站设计的公司
  • 网站建设与网页设计实践报告wordpress 保护wp-login.php
  • 视频网站哪个做的好黑客入侵网课
  • 网站升级通知自动跳跃i岗网站建设
  • 做网站技术人员vs网站开发建表怎么肩啊
  • 网站网络资源建立wordpress 自定义插件
  • 呼和浩特建站wordpress统计访问了
  • 企业网站开发报价形式商务信息网官网
  • 网站建设 投资预算开封网站建设优化
  • 哪家公司建设网站好目前企业常见的网络推广方式有哪些
  • 胶南市城乡建设局网站短视频app开发有哪些公司
  • 风雨同舟 网站建设wordpress内网无法访问
  • 财政网站 建设方案windows优化大师的优点
  • 同ip多域名做同行业网站福建泉州曾明军的网站
  • 算命网站搭建qingdao城乡住房建设厅网站
  • 高米店网站建设公司企业网站管理系统设计报告
  • 学做ps的网站制作网站域名需要多少钱
  • 一个公司做100个网站安徽省网站备案快吗
  • 做的高大上的网站好用的代码网站