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

news2025/1/16 18:59:33

|        今天是第五专题内容,主要是介绍如何从心知天气官网,获取包含当前天气实况和未来 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);
 
  //开始连接wifi
  WiFi.begin(ssid, password);
 
  //等待WiFi连接,连接成功打印IP
  while (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客户端对象,对象名称client
  WiFiClient 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.coloradmin.cn/o/1653673.html

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

相关文章

鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main

阅读之前的说明 先说明&#xff0c;本篇很长&#xff0c;也很枯燥&#xff0c;若不是绝对的技术偏执狂是看不下去的.将通过一段简单代码去跟踪编译成ELF格式后的内容.看看ELF究竟长了怎样的一副花花肠子&#xff0c;用readelf命令去窥视ELF的全貌&#xff0c;最后用objdump命令…

吴恩达2022机器学习专项课程C2(高级学习算法)W1(神经网络):2.5 更复杂的神经网络

目录 示例填写第三层的层数1.问题2.答案 公式&#xff1a;计算任意层的激活值激活函数 示例 层数有4层&#xff0c;不包括输入层。 填写第三层的层数 1.问题 你能把第二个神经元的上标和下标填写出来吗&#xff1f; 2.答案 根据公式g(wxb)&#xff0c;这里的x对应的是上…

Liunx系统怎么设置免密登录?看这一篇!

远程口令爆破也是黑客常用的手段&#xff0c;有些人安全意识薄弱的会设置一些简单的密码&#xff0c;这样分分钟会被黑客爆破进去&#xff0c;一旦操作系统沦陷&#xff0c;里面的数据必将被黑客一览无余&#xff0c;使用免密登录可以有效降低密码被爆破的风险&#xff0c;具体…

C++学习第十二天(继承)

1、继承的概念以及定义 继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行拓展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&#x…

光伏设计的核心要素有哪些?

光伏设计是可再生能源领域中的一个重要分支&#xff0c;它涉及到将太阳能转换为电能的整个过程。在光伏系统的设计和构建过程中&#xff0c;有几个核心要素需要被充分考虑和精确计算&#xff0c;以确保系统的性能、可靠性和经济效益。 一、光照条件分析 光照条件是光伏系统设计…

从Python整数变量内存大小占用28字节谈起

实验结果 本机环境64位Python 3.12 内存布局图 0 4 8 12 16 20 24 28 |----------|----------|----------|----------|----------|----------|----------| | ob_refcnt | ob_type | ob_digit | …

C++初识多态(1)

1.多态要解决的问题&#xff08;引入&#xff09; 任何一种机制的存在&#xff0c;必然是有其存在的意义的&#xff0c;例如我们前面学过的函数重载&#xff0c;运算符重载&#xff0c;以及引用等等&#xff0c;都是解决一些特殊问题的&#xff1b; 下面通过一些具体的例子&a…

Postman的一些使用技巧

Postman 是一个流行的 API 开发工具&#xff0c;用于设计、开发、测试、发布和监控 API。在现代web开发中使用非常广泛。后端开发必备而且必会的工具。 目录 1.配置环境变量 2.动态变量 3.脚本 4.测试 5.模拟 6.监控 7.集合运行器 8.响应保存 9.请求历史 10.同步请求…

6、随机森林(Random forests)

Random forests started a revolution in machine learning 20 years ago. For the first time, there was a fast and reliable algorithm which made almost no assumptions about the form of the data, and required almost no preprocessing. In today’s lesson, you’ll…

数据结构——实现通讯录(附源码)

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…

党建教育vr虚拟现实展厅真正实现了绿色、低碳的展示方式

在数字化浪潮席卷的今天&#xff0c;传统企业门户官网已难以满足企业日益增长的展示需求。面对这一挑战&#xff0c;北京华锐凭借深厚的行业经验和领先的技术实力&#xff0c;为您提供全新的元宇宙虚拟展厅制作服务&#xff0c;助您轻松打破现实与虚拟的界限&#xff0c;开启企…

Flutter笔记:Widgets Easier组件库(11)- 使用提示吐丝(Tip Toasts)

Flutter笔记 Widgets Easier组件库&#xff08;11&#xff09;使用提示吐丝 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …

【文献解析】NeRF的原理是什么

论文&#xff1a;https://arxiv.org/abs/2003.08934 TensorFlow代码&#xff1a;https://github.com/bmild/nerfPyToch代码&#xff1a;https://github.com/yenchenlin/nerf-pytorch 一、文章概述 1.问题导向 从新视点生成照片级真实感输出需要正确处理复杂的几何体和材质反…

WEB基础--JDBC操作数据库

使用JDBC操作数据库 使用JDBC查询数据 五部曲&#xff1a;建立驱动&#xff0c;建立连接&#xff0c;获取SQL语句&#xff0c;执行SQL语句&#xff0c;释放资源 建立驱动 //1.加载驱动Class.forName("com.mysql.cj.jdbc.Driver"); 建立连接 //2.连接数据库 Stri…

提高谷歌抓取成功率:代理IP的7个使用误区

在当今数字化时代&#xff0c;数据采集和网络爬取已成为许多企业和个人必不可少的业务活动。对于爬取搜索引擎数据&#xff0c;特别是Google&#xff0c;使用代理IP是常见的手段。然而&#xff0c;使用代理抓取Google并不是一件轻松的事情&#xff0c;有许多常见的误区可能会导…

Ubuntu 部署agular项目

我的front-end是用的webpack&#xff0c;就直接执行的npm run build打包。 完成之后就可以\target\classes\static找到 &#xff0c;直接把整个static上传到需要部署的地方就可以了。 当然这个打包output路径也是angular.json配置好了的 sudo apt update sudo apt install n…

大模型微调之 在亚马逊AWS上实战LlaMA案例(三)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;三&#xff09; 使用 QLoRA 增强语言模型&#xff1a;Amazon SageMaker 上 LLaMA 2 的高效微调 语言模型在自然语言处理任务中发挥着关键作用&#xff0c;但训练和微调大型模型可能会占用大量内存且耗时。在本文中&…

华为数据之道第二部分导读

目录 导读 第二部分 第4章 面向“业务交易”的信息架构建设 信息架构的四个组件 数据资产目录 数据标准 数据模型 数据分布 信息架构原则&#xff1a;建立企业层面的共同行为准则 信息架构建设核心要素&#xff1a;基于业务对象进行设计和落地 按业务对象进行架构设…

十分钟掌握Java集合之List接口

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

Day 28 MySQL的数据备份与恢复

数据备份及恢复 1.概述 ​ 所有备份数据都应放在非数据库本地&#xff0c;而且建议有多份副本 备份&#xff1a; 能够防止由于机械故障以及人为误操作带来的数据丢失&#xff0c;例如将数据库文件保存在了其它地方 冗余&#xff1a; 数据有多份冗余&#xff0c;但不等备份&…