【NodeMCU实时天气时钟温湿度项目 5】获取关于城市天气实况和天气预报的JSON信息(心知天气版)

|        今天是第五专题内容,主要是介绍如何从心知天气官网,获取包含当前天气实况和未来 3 天天气预报的JSON数据信息。
        在学习获取及显示天气信息前,我们务必要对JSON数据格式有个深入的了解。

        如您需要了解其它专题的内容,请点击下面的链接。
        第一专题内容,请参考:连接点亮SPI-TFT屏幕和UI布局设计
        第二专题内容,请参考:WIFI模式设置及连接
        第三专题内容,请参考:连接SHT30传感器,获取并显示当前环境温湿度数据(I2C)
        第四专题内容,请参考:通过NTPClient库获取实时网络时间并显示在TFT屏幕上

一、什么是JSON?

        JSON,是JavaScript Object Notation单词首字母的缩写,是一种轻量级的数据交换格式。它以易于阅读和编写的文本格式来存储和表示数据,通常用于在不同的系统之间进行数据交换。JSON数据以键值对或名值对的形式出现,可以包含对象、数组、字符串、数字等基本数据类型。它经常在Web开发、API通信等领域被广泛使用。
        通过NodeMCU的WiFi模块,我们可以很容易地从【心知天气】网站获取气象信息,包括天气实况和天气预报等各类数据,这些天气数据是未经压缩的JSON格式数据。关于JSON格式数据,网上有大量文章对其作用、语法规则和应用场景进行详细介绍,请大家自行查询了解。比如,JSON 基本使用_json怎么用-CSDN博客。

二、天气实况数据

       1. 天气实况。获取指定城市的天气实况,付费用户可获取全部数据,免费用户只返回天气现象文字、天气现象代码和气温 3 项数据。数据更新频率,国内城市在 15 分钟左右,国际城市在 20 分钟左右。

        2. 接口地址

https://api.seniverse.com/v3/weather/now.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c

        3. 请求参数说明

        4. 返回结果示例 (免费用户仅返回 ”now" 的前三项数值)

{"results": [{"location": {"id": "C23NB62W20TF","name": "西雅图","country": "US","path": "西雅图,华盛顿州,美国","timezone": "America/Los_Angeles","timezone_offset": "-07:00"},"now": {"text": "多云", //天气现象文字"code": "4", //天气现象代码"temperature": "14", //温度,单位为c摄氏度或f华氏度"feels_like": "14", //体感温度,单位为c摄氏度或f华氏度"pressure": "1018", //气压,单位为mb百帕或in英寸"humidity": "76", //相对湿度,0~100,单位为百分比"visibility": "16.09", //能见度,单位为km公里或mi英里"wind_direction": "西北", //风向文字"wind_direction_degree": "340", //风向角度,范围0~360,0为正北,90为正东,180为正南,270为正西"wind_speed": "8.05", //风速,单位为km/h公里每小时或mph英里每小时"wind_scale": "2", //风力等级,请参考:http://baike.baidu.com/view/465076.htm"clouds": "90", //云量,单位%,范围0~100,天空被云覆盖的百分比 #目前不支持中国城市#"dew_point": "-12" //露点温度,请参考:http://baike.baidu.com/view/118348.htm #目前不支持中国城市#},"last_update": "2015-09-25T22:45:00-07:00" //数据更新时间(该城市的本地时间)}]
}

三、未来15天逐日天气预报

        1. 天气预报。获取指定城市未来最多 15 天每天的白天和夜间预报。一般每天更新 3-4 次。付费用户可获取全部数据,免费用户只返回 3 天天气预报。降水预报目前只支持国内城市。

        2. 接口地址及示例:北京今天和未来 4 天的预报。

https://api.seniverse.com/v3/weather/daily.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c&start=0&days=5

        3. 请求参数说明

        4. 返回结果示例

{"results": [{"location": {"id": "WX4FBXXFKE4F","name": "北京","country": "CN","path": "北京,北京,中国","timezone": "Asia/Shanghai","timezone_offset": "+08:00"},"daily": [{                          //返回指定days天数的结果"date": "2015-09-20",              //日期(该城市的本地时间)"text_day": "多云",                //白天天气现象文字"code_day": "4",                  //白天天气现象代码"text_night": "晴",               //晚间天气现象文字"code_night": "0",                //晚间天气现象代码"high": "26",                     //当天最高温度"low": "17",                      //当天最低温度"precip": "0",                    //降水概率,范围0~1,单位百分比(目前仅支持国外城市)"wind_direction": "",             //风向文字"wind_direction_degree": "255",   //风向角度,范围0~360"wind_speed": "9.66",             //风速,单位km/h(当unit=c时)、mph(当unit=f时)"wind_scale": "",                 //风力等级"rainfall": "0.0",                //降水量,单位mm"humidity": "76"                  //相对湿度,0~100,单位为百分比}, {"date": "2015-09-21","text_day": "晴","code_day": "0","text_night": "晴","code_night": "0","high": "27","low": "17","precip": "0","wind_direction": "","wind_direction_degree": "157","wind_speed": "17.7","wind_scale": "3","rainfall": "0.0","humidity": "76"}, {...                               //更多返回结果}],"last_update": "2015-09-20T18:00:00+08:00" //数据更新时间(该城市的本地时间)}]
}

四、编程实现获取天气实况和未来 3 天天气预报信息

        【编程环境】VSCode + PlatformIO,Platforms:Espressif 8266,Framework: Arduino
        以下是具体实现代码,可以复制到 main.cpp 中,修改个别信息后,直接编译上传即可。需要修改的项目,在第五部分详细说明。

#include <ESP8266WiFi.h>const char* host = "api.seniverse.com"; // 心知天气 API 接口地址
const int httpPort = 80;              // http端口80// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "xcb940";
const char* password = "87589940abc";void wifiClientRequest();void setup() {//初始化串口设置Serial.begin(9600);Serial.println("");//设置ESP8266工作模式为无线终端模式WiFi.mode(WIFI_STA);//开始连接wifiWiFi.begin(ssid, password);//等待WiFi连接,连接成功打印IPwhile (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.print(".");}Serial.println("");Serial.println("WiFi Connected!");wifiClientRequest();  
}void loop(){}// 向服务器发送HTTP请求,在串口监视器打印 HTTP请示内容,HTTP响应头信息和请求的数据,包括天气实况和未来3天的天气预报(免费用户只返回3天的)
void wifiClientRequest(){// 建立WiFi客户端对象,对象名称clientWiFiClient client;    //以下代码,请求返回天气实况信息// 建立字符串,用于HTTP请求String httpRequest =  String("GET /v3/weather/now.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c") + " HTTP/1.1\r\n" +"Host: " + host + "\r\n" +"Connection: close\r\n" +"\r\n";// 通过串口输出连接服务器名称以便查阅连接服务器的网址                      Serial.print("Connecting to "); Serial.print(host); // 连接网络服务器,请求并返回信息if (client.connect(host, httpPort)){ Serial.println(" Success!");        // 连接成功后串口输出“Success”信息    client.print(httpRequest);          // 向服务器发送HTTP请求Serial.println("Sending request: ");// 通过串口输出HTTP请求信息内容以便查阅Serial.println(httpRequest);     // 通过串口输出网络服务器响应信息Serial.println("Web Server Response:");        while (client.connected() || client.available()){ if (client.available()){String line = client.readStringUntil('\n');Serial.println(line);}}  client.stop();                      // 断开与服务器的连接Serial.print("Disconnected from "); // 并且通过串口输出断开连接信息Serial.print(host);} else{    // 如果连接不成功则通过串口输出“连接失败”信息Serial.println(" connection failed!");client.stop();}  Serial.println("");Serial.println("");//以下代码,请求返回未来3天天气预报(免费用户只返回3天的数据)// 建立字符串,用于HTTP请求 httpRequest =  String("GET /v3/weather/daily.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c&start=0&days=3") + " HTTP/1.1\r\n" +"Host: " + host + "\r\n" +"Connection: close\r\n" +"\r\n";// 通过串口输出连接服务器名称以便查阅连接服务器的网址                      Serial.print("Connecting to "); Serial.print(host); // 连接网络服务器,if (client.connect(host, httpPort)){ Serial.println(" Success!");        // 连接成功后串口输出“Success”信息client.print(httpRequest);          // 向服务器发送HTTP请求Serial.println("Sending request: ");// 通过串口输出HTTP请求信息内容以便查阅Serial.println(httpRequest);     // 通过串口输出网络服务器响应信息Serial.println("Web Server Response:");        while (client.connected() || client.available()){ if (client.available()){String line = client.readStringUntil('\n');Serial.println(line);}}   client.stop();                      // 断开与服务器的连接Serial.print("Disconnected from "); // 并且通过串口输出断开连接信息Serial.print(host);} else{    // 如果连接不成功则通过串口输出“连接失败”信息Serial.println(" connection failed!");client.stop();}  
}

五、特别提醒需要修改的部分信息

        (1)修改WiFi连接信息

// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "xcb940";
const char* password = "87589940abc";

        (2)修改第 43 行http请求:“key = your_api_key”  ------->> 修改为您自己的密钥, “location = beijing”       ------->> 修改为您所希望的所在地区

//第43行
String httpRequest =  String("GET /v3/weather/now.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c") + " HTTP/1.1\r\n" +

        (3)修改第 82行http请求:“key = your_api_key”------->> 修改为您自己的密钥, “location = beijing” ------->> 修改为您所希望的所在地区

//第 82行 
httpRequest =  String("GET /v3/weather/daily.json?key=your_api_keyu&location=beijing&language=zh-Hans&unit=c&start=0&days=3") + " HTTP/1.1\r\n" +

六、运行结果分析

       程序编译上传成功执行后,如果在串口监视器找到以下包含天气信息的两个JSON数据,一个是包含天气实况的信息,另一个是包含未来 3 天天气预报的信息。那么,恭喜您:现在可以正常从心知天气官网获取天气数据信息了。
        项目源代码下载:
        百度网盘:https://pan.baidu.com/s/11ggPQdj9rzYP3Av97Z85Kg?pwd=aira,提取码:aira

//以下返回的天气实况{"results":[{"location":{"id":"WX4FBXXFKE4F","name":"北京","country":"CN","path":"北京,北京,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"晴","code":"0","temperature":"29"},"last_update":"2024-05-08T15:44:15+08:00"}]}//以下返回的是未来 3 天的天气预报
{"results":[{"location":{"id":"WX4FBXXFKE4F","name":"北京","country":"CN","path":"北京,北京,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"daily":[{"date":"2024-05-08","text_day":"晴","code_day":"0","text_night":"晴","code_night":"1","high":"30","low":"14","rainfall":"0.00","precip":"0.00","wind_direction":"西南","wind_direction_degree":"225","wind_speed":"23.4","wind_scale":"4","humidity":"56"},{"date":"2024-05-09","text_day":"晴","code_day":"0","text_night":"多云","code_night":"4","high":"30","low":"16","rainfall":"0.00","precip":"0.00","wind_direction":" 
南","wind_direction_degree":"180","wind_speed":"8.4","wind_scale":"2","humidity":"48"},{"date":"2024-05-10","text_day":"多云","code_day":"4","text_night":"多云","code_night":"4","high":"29","low":"17","rainfall":"0.00","precip":"0.00","wind_direction":"西南","wind_direction_degree":"225","wind_speed":"3.0","wind_scale":"1","humidity":"71"}],"last_update":"2024-05-07T08:00:00+08:00"}]}

        下一个专题,我们将解析从心知天气官网获取到的JSON数据,并把它们显示到 TFT 液晶显示屏上。敬请关注。

        参考文档
        1. JSON 基本使用_json怎么用-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/833769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言----杨辉三角

各位看官们好。学习到这里想必大家应该对C语言的了解也是很深刻的了吧。但是我们也不能忘记我们一起学习的知识啊。在我们以前学习C语言的时候我想大家应该都听说过杨辉三角吧。虽然我们把其中的规律找到那么这个代码就简单很多了。那么接下里我们就来讲讲杨辉三角。 首先我们先…

sql 注入 1

当前在email表 security库 查到user表 1、第一步&#xff0c;知道对方goods表有几列&#xff08;email 2 列 good 三列&#xff0c;查的时候列必须得一样才可以查&#xff0c;所以创建个临时表&#xff0c;select 123 &#xff09; 但是你无法知道对方goods表有多少列 用order …

场外期权个股怎么对冲?

今天期权懂带你了解场外期权个股怎么对冲&#xff1f;场外个股期权是一种在非交易所市场进行的期权交易&#xff0c;它允许投资者针对特定的股票获得未来买入或卖出的权利。 场外期权个股怎么对冲&#xff1f; 持有相反方向的期权&#xff1a;这是最直接的对冲方法&#xff0c…

Elasticsearch中的三种分页策略深度解析:原理、使用及对比

码到三十五 &#xff1a; 个人主页 在Elasticsearch中&#xff0c;分页是查询操作中不可或缺的一部分。随着数据量的增长&#xff0c;如何高效地分页查询数据急需需要面对的问题。Elasticsearch提供了三种主要的分页方式&#xff1a;from size、scroll和search_after。下面详细…

STM32系统架构

以下是STM32系统架构中的各个重要组件和功能&#xff1a; 组件描述Cortex-M内核ARM Cortex-M系列内核&#xff0c;如M0、M0、M3、M4、M7等Flash存储器存储程序代码和数据SRAM存储程序运行时数据和堆栈外设接口GPIO、SPI、I2C、UART、TIM、ADC、DAC、USB、CAN、Ethernet等时钟和…

大模型微调实战之强化学习 贝尔曼方程及价值函数(五)

大模型微调实战之强化学习 贝尔曼方程及价值函数&#xff08;五&#xff09; 现在&#xff0c; 看一下状态-动作值函数的示意图&#xff1a; 这个图表示假设首先采取一些行动(a)。因此&#xff0c;由于动作&#xff08;a&#xff09;&#xff0c;代理可能会被环境转换到这些状…

源代码烧录场景防泄密的四种方式

在各行各业中&#xff0c;外设烧录是一项常见的操作&#xff0c;涉及到对硬件设备进行固件更新或配置文件的写入。然而&#xff0c;外设烧录过程中的文件管理和安全审计一直是一个挑战&#xff0c;传统的烧录方法往往无法提供足够的安全保障。本文将介绍如何利用沙盒防泄密软件…

ENVI拓展工具资源去哪里找

ENVI拓展工具资源去哪里找&#xff1f; 文章目录 ENVI拓展工具资源去哪里找&#xff1f;前言网站&#xff08;链接见文末&#xff09;ENVI应用商店&#xff08;App Store&#xff09;ENVI官方提供第三方制作自己制作 总结参考 前言 ENVI 拓展工具是指 ENVI 软件的扩展功能或插…

Linux系统编程--网络编程

一、OSI网络七层模型 OSI模型将整个网络通信过程分解为七个层次&#xff0c;每个层次都为网络通信提供了特定的功能。以下是OSI模型的七个层次&#xff0c;从上到下依次是&#xff1a; 应用层&#xff08;Application Layer&#xff09;&#xff1a;为应用软件提供网络服务&am…

Python数据可视化------地图

基础地图使用 # 地图基本演示 # 导包 from pyecharts.charts import Map from pyecharts.options import TitleOpts, VisualMapOpts# 准备地图对象 cmap Map() # 准备数据&#xff08;列表&#xff09; data [("北京市", 99), ("上海市", 199), ("…

【大模型】LLaMA-1 模型介绍

文章目录 一、背景介绍二、模型介绍2.1 模型结构2.2 模型超参数2.3 SwiGLU 三、代码分析3.1 模型结构代码3.2 FairScale库介绍 四、LLaMA家族模型4.1 Alpaca4.2 Vicuna4.3 Koala(考拉)4.4 Baize (白泽)4.5 Luotuo (骆驼&#xff0c;Chinese)4.6 其他 参考资料 LLaMA&#xff08…

微信小程序16: 组件通信

父子组件之间的通信 父子组件通信一共有三种方式 属性绑定 用于父组件向子组件的指定属性设置数据&#xff0c;仅能设置JSON兼容的数据 事件绑定 用于子组件向父组件传递数据&#xff0c;可以传递任意数据 获取组件实例 父组件还可以通过this.selectComponent()获取子组件的实…

vue 语法2

【5】条件渲染和列表渲染 &#xff08;1&#xff09;条件渲染v-if v-else-if v-else 条件渲染根据表达式的真假值来渲染不同的元素或组件。 v-if&#xff1a;当表达式的值为真时&#xff0c;渲染该元素或组件。 v-else-if&#xff1a;当前面的 v-if 或 v-else-if 的表达式为假…

【机器视觉】C# .NET 8 部署yolov9 onnx对象检测

这段代码展示了一个使用YOLOv9进行对象检测的简单测试框架。代码主体以及其功能分为以下几个关键部分&#xff1a; 创建测试图片数组 _testImages&#xff0c;它包含了图片文件名和对应的标签。使用 buildTests 方法来从给定的文件名中加载图片并调整尺寸&#xff0c;准备测试数…

linux数据备份与恢复

目录 前言 1、数据备份和恢复中的两个关键性指标 2、linux系统的定时任务 1&#xff09;本地定时任务crontab 在实验测试过程中&#xff0c;遇到多次crontab任务不执行问题 &#xff0c;总结下来主要有几个方面原因&#xff1a; 2)分布式定时任务系统Jenkins 3、备份存储…

如何用二维码实现现代仓库管理?(附详细实现过程)

简道云团队曾参与过近300企业的仓库管理软件的部署&#xff0c;要想知道如何实现用二维码管理仓库&#xff0c;首先要对整体流程有清晰的框架&#xff01; 1、产品数据的录入2、设计电子库存卡3、库存盘点单4、库存盘点报表 总结一下就是——数卡单表&#xff0c;四步实现&…

补一 继承的使用

继承的关键词为extends 模型为 public class 子类 extends 父类

中国热门高端dating约会交友软件有哪些?国内权威Dating App红黑排行榜推荐

在dating 软件刷了无数个男人后终于脱单啦&#xff0c;跟大家分享一些我的个人感受 1、二狗 颜值⭐️⭐️⭐️ 真实性 ⭐️⭐️⭐️⭐️⭐️ 用户质量⭐️⭐️⭐️⭐️ ⭕️优点&#xff1a;整体用户质量较高&#xff0c;用户集中在金融、互联网和体制内行业。用户需进行学历、…

速来get!多微信聚合聊天功能大揭秘!

随着网络时代的发展&#xff0c;微信成为了职场中不可或缺的沟通工具&#xff0c;很多人都有着多个微信号&#xff0c;而要想高效管理这些账号&#xff0c;那就少不了工具的帮忙。 通过微信管理系统&#xff0c;可以轻松实现多个微信号聚合聊天&#xff0c;提高沟通效率。 1、…