PlatformIO+ESP32S3学习:通过WIFI与和风天气API获取指定地点的天气情况并显示

1. 硬件准备


你只需要有一个ESP32S3开发板。我目前使用的是:

购买地址:立创·ESP32S3R8N8 开发板

在这里插入图片描述

2. 和风天气API


2.1. 和风天气介绍

和⻛天气是中国领先的气象科技服务商、国家高新技术 企业,致力于运用先进气象模型结合大数据、人工智能 技术发展智慧型气象服务。
他们的业务包括气象数据分发、地理信息、气象可视 化、个人气象服务等,在全球10个国家建有数据中心, 为300余家中国及全球企业、50万开发者提供优质的数 据服务。

另外的话

和风天气支持用户免费使用订阅,只是一个用户只能创建一个项目API,但是对我们来说已经足够了,感谢和风天气!

2.2. 创建自己的天气API

请前往 和风天气API 官网,注册账号并进入控制台。

在这里插入图片描述

关于和风天气的API介绍和开发文档,参考控制台处的介绍:

在这里插入图片描述

开始创建属于我们的API !

在这里插入图片描述

和风天气项目创建参数填写:

在这里插入图片描述

完成创建!

在这里插入图片描述

2.3. API介绍

和风天气的 API介绍网页 如下:

在这里插入图片描述

本文将用的API是城市天气 -> 每日天气预报 -> 3天预报API 。【API的详细介绍页点我】

在这里插入图片描述

需要注意的是,如果是免费订阅,要将API Host更改为 devapi.qweather.com

这里以获取深圳3天的天气预报为例,关键的API参数说明如下:

https://devapi.qweather.com/v7/weather/3d?location=101280601&key=YOUR_KEY

请求参数包括必选和可选参数,参数之间使用&进行分隔。这里只给大家介绍必填项。
1. key(必选) : 用户认证key,请参考如何获取你的KEY。
2. location(必选) : 需要查询地区的LocationID或以英文逗号分隔的经度,纬度坐标(十进制,最多支持小数点后两位),LocationID可通过GeoAPI获取。例如 location=101010100 或 location=116.41,39.92

关于这个LocationID需要各位自行根据和风天气官方的github地址查询,这里我找到深圳的LocationID为:101280601

在这里插入图片描述

2.4. 手动验证API是否正确

首先回到你的和风天气管理台。你会看到你新建的项目。

在这里插入图片描述
复制你的密钥KEY
在这里插入图片描述

然后将你的KEY填充到下方API的YOUR_KEY

下方这个是获取深圳3天的天气预报API,只剩KEY没有填写

https://devapi.qweather.com/v7/weather/3d?location=101280601&key=YOUR_KEY

例如我的KEY是 ABCasdsdgsdfgdsgdfgdf,则我的API是

https://devapi.qweather.com/v7/weather/3d?location=101280601&key=ABCasdsdgsdfgdsgdfgdf

填写你的KEY后,直接复制该API,将它作为网址跳转到对应页面,你就会看的返回的天气数据。

在这里插入图片描述
关于API返回的数据具体的意思是什么,参考该API的介绍页。

在这里插入图片描述
根据返回的参数说明,这里我关注的是4个数据:
在这里插入图片描述

图标代码的说明:返回的数据中关于天气的说明只有空落落的数字,这些数字在API说明中代表着各个天气情况。数字对应的天气情况链接。

在这里插入图片描述

到这里我们就已经是准备好了,接下来可以上工程代码了。请准备好你的完整APIKEY

3. 工程创建


在VSCode中打开PlatformIO扩展创建工程。

在这里插入图片描述
设置工程向导

在这里插入图片描述
在这里插入图片描述
等待创建完成。

在这里插入图片描述

4. 安装驱动库

创建完成之后,我们在VSCode中打开我们刚才创建的工程文件夹。

在这里插入图片描述
在VSCode中回到PlatformIO的主页,准备给工程安装JSON的驱动库。

在这里插入图片描述
在这里插入图片描述

搜索ArduinoJson,安装来自Benoit BlanchonArduinoJson库。

在这里插入图片描述

将库添加到我们的工程之中。

在这里插入图片描述

在这里插入图片描述

安装完成之后,打开platformio.ini文件,可以看到已经安装上了驱动库。

在这里插入图片描述

这里还有一个问题,和风天气API返回的JSON格式是带了Gzip压缩的。

为了能够在ESP32S3中进行Gzip的解压操作,引用了github上的一个开源项目,来自pfalcon的uzlib。感谢伟大的开源贡献者!

在这里插入图片描述

在我们的工程中,去lib文件夹下新建一个文件夹uzlib,将仓库中的 src 文件夹下的文件全部拉下来保存在我们在工程中新建的uzlib文件夹下。

在这里插入图片描述

5. 编辑代码


在工程中的src文件夹下的新建 weather.cpp 文件。

在这里插入图片描述
weather.cpp 中写入如下代码:

#include "weather.h"Weather::Weather(String apiKey, String location)
{this->apiKey = apiKey;this->location = location;
}bool Weather::update()
{HTTPClient http;   //用于访问网络WiFiClient *stream;int size;http.begin("https://devapi.qweather.com/v7/weather/3d?location="+ this->location + "&key=" + this->apiKey); //获取近三天天气信息int httpcode = http.GET();   //发送GET请求if(httpcode > 0){if(httpcode == HTTP_CODE_OK){stream = http.getStreamPtr();   //读取服务器返回的数据size = http.getSize();}}else{Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpcode).c_str());}http.end();   //结束当前连接uint8_t inbuff[size];stream->readBytes(inbuff, size);uint8_t *outbuf = NULL;uint32_t out_size = 0;int result = ArduinoUZlib::decompress(inbuff,size, outbuf, out_size);deserializeJson(doc, outbuf);today = doc["daily"][0].as<JsonObject>();tomorrow = doc["daily"][1].as<JsonObject>();return true;
}//获取天气数据中的当天最高气温数据
int Weather::getTempMax(bool is_today)
{if(is_today){return today["tempMax"].as<int>();}else{return tomorrow["tempMax"].as<int>();}
}//获取天气数据中的当天最低气温数据
int Weather::getTempMin(bool is_today)
{if(is_today){return today["tempMin"].as<int>();}else{return tomorrow["tempMin"].as<int>();}
}//获取天气数据中的天气标识代码
int Weather::getWeather(bool is_today, bool is_day)
{if(is_today){if(is_day)return today["iconDay"].as<int>();elsereturn today["iconNight"].as<int>();}else{if(is_day)return tomorrow["iconDay"].as<int>();elsereturn tomorrow["iconNight"].as<int>();}
}

在工程中的include文件夹下的新建 weather.h 文件。

在这里插入图片描述
weather.h 中写入如下代码:

#ifndef _WEATHER_H
#define _WEATHER_H#include "Arduino.h"
#include "ArduinoJson.h"
#include "ArduinoUZlib.h"
#include "HTTPClient.h"//定义天气类
class Weather
{public:Weather(String apiKey, String location);bool update();  //发送一次请求信息,获取天气数据//只需要今明日的天气与温度,故仅设置了以下若干函数int getTempMax(bool is_today);int getTempMin(bool is_today);int getWeather(bool is_today, bool is_day);private:String apiKey;                  //天气API密钥String location;                //地点StaticJsonDocument<2048> doc;   //Json容器JsonObject today, tomorrow;     //可根据返回的json信息自行定义其他天气数据
};#endif

打开工程下的src文件夹下的main.cpp,并且写入如下代码:

#include <Arduino.h>
#include <WiFi.h>
#include "weather.h"  //定义Weather类,用于解析Json数据并返回天气数据//WIFI
#define WIFI_SSID "lckfb"         //要连接的WIFI名称
#define WIFI_PASSWORD "12345678"  //要连接的WIFI密码
#define WIFI_RETRY_COUNT  20      //WIFI连接重试数//和风天气预报
#define USER_KEY      "d89d4706adcc4fb89d6f166cb420ee39" //密钥
#define LOCATION_ID   "101280601"  //地点标识:深圳int weatherid;      //根据和风天气API返回的天气ID显示对应天气
bool is_day = 1;    //白天为1,夜晚为0
bool is_today = 1;  //今天为1,明天为0//创建天气对象
Weather weather(USER_KEY, LOCATION_ID);//根据和风天气API返回天气标识
void WeatherIcon(int weatherid)
{switch(weatherid){case 100://白天晴Serial.println("白天晴\r\n");break;case 101://多云case 102://少云case 151://夜间多云case 152://夜间少云case 103://晴间多云Serial.println("多云\r\n");break;case 104://阴天Serial.println("阴天\r\n");break;case 150://夜间晴朗Serial.println("夜间晴朗\r\n");break;case 153://夜间晴间多云Serial.println("夜间多云\r\n");break;case 305://小雨case 309://毛毛雨/细雨Serial.println("小雨\r\n");break;case 300://阵雨case 350://夜间阵雨case 306://中雨case 399://雨case 313://冻雨case 314://小到中雨Serial.println("阵雨\r\n");break;case 301://强阵雨case 351://夜间强阵雨case 307://大雨case 308://极端降雨case 310://暴雨case 311://大暴雨case 312://特大暴雨case 315://中到大雨case 316://大到暴雨case 317://暴雨到大暴雨case 318://大暴雨到特大暴雨Serial.println("大雨\r\n");break;case 302://雷阵雨Serial.println("雷阵雨\r\n");break;case 303://强雷阵雨Serial.println("强雷阵雨\r\n");break;//雪天case 400://小雪case 401://中雪case 402://大雪case 403://暴雪case 404://雨夹雪case 405://雨雪天气case 406://阵雨夹雪case 407://阵雨夹雪case 408://小到中雪case 409://中到大雪case 410://雪case 456://阵雨夹雪case 457://阵雪case 499://雪Serial.println("雪天\r\n");break;//雾霾case 500://薄雾case 501://雾case 509://浓雾case 510://强浓雾case 514://大雾case 515://特强浓雾Serial.println("雾天\r\n");break;case 502://霾case 511://中度霾case 512://重度霾case 513://严重霾Serial.println("雾霾\r\n");break;}
}void setup() 
{int count = 0;char disp_buf[50]={0};//串口初始化Serial.begin(9600);//尝试连接WIFI网络WiFi.begin(WIFI_SSID, WIFI_PASSWORD); //尝试连接直至超时while (WiFi.status() != WL_CONNECTED) {count++;if (count > WIFI_RETRY_COUNT){Serial.println("\r\nconnection failed.\r\n");break;}delay(500);Serial.print(".");}//获取天气数据weather.update();//WIFI断开连接WiFi.disconnect();//显示最低与最高温度sprintf(disp_buf, "TempMin = %d", weather.getTempMin(is_today));Serial.println(disp_buf);sprintf(disp_buf, "TempMax = %d", weather.getTempMax(is_today));Serial.println(disp_buf);//显示天气标识代码sprintf(disp_buf, "WeatherCode = %d", weather.getWeather(is_today, is_day));Serial.println(disp_buf);//根据天气标识代码确定天气WeatherIcon(weather.getWeather(is_today, is_day));
}void loop() 
{delay(1000);
}

6. 代码验证

代码编写完成之后,将ESP32S3开发板接入电脑。我当前的开发板上是CH340K的驱动,故我这里选择COM3端口。

在这里插入图片描述
编译并下载到开发板中。

在这里插入图片描述

打开串口监视器。

在这里插入图片描述

实际获取天气数据的效果如下:
最低温度26,最高温度31,天气代码为307,对应的就是大雨。
在这里插入图片描述

查看和风天气的API中天气代码说明,确认数据是正确的。

在这里插入图片描述

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

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

相关文章

成为git砖家(2): gitk 介绍

大家好&#xff0c;我是白鱼。这篇我们介绍 gitk。 gitk 和 fork 界面对比 当我们在 macOS 上执行 brew install git 后&#xff0c; 得到了 git 命令行工具。 然而这条命令并不会安装 gitk. gitk 是 git 自带的图形化界面工具&#xff0c;也可以称为“穷人版 fork”&#xf…

美国演员工会和电视广播艺人工会针对电子游戏发行商的罢工于 7 月 26 日举行

美国演员工会&#xff08;SAG-AFTRA&#xff09;正在对电子游戏发行商进行罢工&#xff0c;以保护演员不被人工智能所利用。经过一年半的谈判&#xff0c;双方仍未达成协议。该工会希望确保人工智能不会被用作利用大型游戏中演员的手段。 他们在网站上声明&#xff0c;“从事电…

搭建自己的金融数据源和量化分析平台(三):读取深交所股票列表

深交所的股票信息读取比较简单&#xff1a; 看上图&#xff0c;爬虫读取到下载按钮的链接之后发起请求&#xff0c;得到XLS文件后直接解析就可以了。 这里放出深交所爬虫模块的代码&#xff1a; # -*- coding: utf-8 -*- # 深圳交易所爬虫 import osimport pandas as pd imp…

fastapi教程(四):做出响应

请求体现的是后端的数据服务能力&#xff0c;而响应体现的是后端向前端的数据展示能力。 一&#xff0c;一个完整的web响应应该包含哪些东西 一个完整的 Web 响应通常包含以下几个主要部分&#xff1a; 1. 状态行- HTTP 版本- 状态码- 状态消息例如&#xff1a;HTTP/1.1 200…

全开源收银系统源码-支付通道

1.收银系统开发语言 核心开发语言: PHP、HTML5、Dart后台接口: PHP7.3后合管理网站: HTML5vue2.0element-uicssjs线下收银台&#xff08;安卓/PC收银、安卓自助收银&#xff09;: Dart3框架&#xff1a;Flutter 3.19.6助手: uniapp商城: uniapp 2.支付通道 智慧新零售收银系统…

一下午连续故障两次,谁把我们接口堵死了?!

唉。。。 大家好&#xff0c;我是程序员鱼皮。又来跟着鱼皮学习线上事故的处理经验了喔&#xff01; 事故现场 周一下午&#xff0c;我们的 编程导航网站 连续出现了两次故障&#xff0c;每次持续半小时左右&#xff0c;现象是用户无法正常加载网站&#xff0c;一直转圈圈。 …

小白学习webgis的详细路线

推荐打开boss直聘搜索相关岗位&#xff0c;查看岗位要求&#xff0c;对症下药是最快的。 第一阶段&#xff1a;基础知识准备 计算机基础 操作系统&#xff1a;理解Windows、Linux或macOS等操作系统的基本操作&#xff0c;学会使用命令行界面。网络基础&#xff1a;掌握TCP/I…

平价不入耳运动耳机哪款最好?五款回购榜优品种草

许多有健身运动习惯的朋友在选择耳机时会优先考虑不入耳耳机&#xff0c;因为它佩戴舒适&#xff0c;稳固性和安全性更高&#xff0c;不仅在运动时不会轻易掉落&#xff0c;还能够方便我们在进行户外运动时接收外界的声音。那么&#xff0c;平价不入耳运动耳机哪款最好&#xf…

docker-compose 根据yaml拉取镜像出问题

在学习go微服务时&#xff0c;用docker-compose启动nacos以及对应的mysql时出现上面的问题&#xff0c; 使用的yaml如下 version: "3.8" services:nacos:image: nacos/nacos-server:${NACOS_VERSION}container_name: nacos-standalone-mysqlenv_file:- ../env/cust…

javaEE(1)

一. Web开发概述 Web开发:指的是从网页中向后端程序发送请求,与后端程序进行交互 Web服务器:是一种软件,向浏览器等Web客户端提供文档等数据,实现数据共享,它是一个容器,是一个连接用户和程序之间的中间键 二. Web开发环境搭建 我们要实现前后端交互,首先需要中间键Web服务…

重生之“我打数据结构,真的假的?”--6.排序

1.排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使⼀串记录&#xff0c;按照其中的某个或某些关键字的⼤⼩&#xff0c;递增或递减的排列起来的 操作。 1.1排序分类 2.排序算法实现 2.1插入排序 直接插⼊排序是⼀种简单的插⼊排序法&#xff0c;其基本思想是&#…

【Nginx】Windows生成ssl证书,Nginx反向代理HTTPS

下载 OpenSSL 环境 Windows、Linux, 证书我是在Windows上生成的自签证书。 https://slproweb.com/products/Win32OpenSSL.htmlWin64 OpenSSL v3.3.1 EXE&#xff08;这个&#xff09; | MSISelect Additional Tasks页面勾选 The OpenSSL binaries (/bin) directory 然后将Op…

一篇文章学完Python基础

1. 字符串 str1 "Hello" str2 " World" print(str1 str2) # 输出&#xff1a;HelloWorld 1.1 字符替换 text "Hello, World!" new_text text.replace("World", "Python") print(new_text) # 输出&#xff1a;…

2024第八届自然语言处理与信息检索国际会议 (NLPIR 2024)即将召开!

2024第八届自然语言处理与信息检索国际会议 (NLPIR 2024)将于2024年12月13-15日在日本冈山的冈山大学举行。NLPIR 2024将为自然语言处理与信息检索领域的专家学者提供一个交流与合作的平台&#xff0c;推动该领域的学术进步和技术创新。同时&#xff0c;本次会议也将为相关企业…

Golang 高性能 Websocket 库 gws 使用与设计(一)

前言 大家好这里是&#xff0c;白泽&#xff0c;这期分析一下 golang 开源高性能 websocket 库 gws。 视频讲解请关注&#x1f4fa;B站&#xff1a;白泽talk 介绍 gws&#xff1a;https://github.com/lxzan/gws &#xff5c;GitHub &#x1f31f; 1.2k&#xff0c;高性能的 …

0724,select +tcp 聊天室喵

目录 TCP协议喵 723__01&#xff1a;使用select实现一个基于UDP的一对一即时聊天程序。 001: 002: TIMEWAI OR BUG 721作业&#xff1a; 01&#xff1a;在一对一聊天的基础上&#xff0c;使用select实现一对多的回显服务。&#xff08;回显服务即接收到客户端发送的数…

Pyppeteer 的使用

puppeteer 是基于Node.js 开发的一个工具, 有了它&#xff0c;我们可以利用 JavaScript 控制 Chrome 浏览器的一些操作。当然&#xff0c; puppeteer 也可以用于网络爬虫&#xff0c;其 API 及其完善&#xff0c;功能非常强大。 Pyppeteer 其实是 puppeteer 的 python 实现&…

.net 连接达梦数据库开发环境部署

.net 开发环境部署 1. 环境准备 测试工具 Visual Studio2022 数据库版本 dm8 2. 搭建过程 1 &#xff09;创建新项目 2 &#xff09;选择创建空项目 3 &#xff09;配置新项目 4 &#xff09;右键 DM1 新建一个项 5 &#xff09;加 载 驱 动 &#xff0c; 新 建 …

0722_驱动3 地址映射驱动点灯

一、为什么需要地址映射 在芯片手册上查看到的地址属于物理地址&#xff0c;在硬件层 在内核空间地址属于虚拟地址&#xff0c;在内核层 在驱动中&#xff0c;操作的是虚拟地址 需要将物理地址《--mmu内存管理单元--》虚拟地址映射 二、映射API接口 void *ioremap(unsigned lon…

backtrace

介绍 arm平台的调用栈与x86平台的调用栈大致相同&#xff0c;稍微有些区别&#xff0c;主要在于栈帧的压栈内容和传参方式不同。在arm平台的不同程序&#xff0c;采用的编译选项不同&#xff0c;程序运行期间的栈帧也会不同。有些工具在对arm的调用栈回溯时&#xff0c;可能会…