JSON解析,ESP32轻松获取时间气温和天气

前言

玩ESP一定会需要获取网络上的各种讯息,而比较入门的内容就是获取网络时间,通过连接NTP服务器来完成。

另一个家是获取气温和天气,通常用在时钟类的项目上面。

这里提供最简单的方法说明如何获取,以及要怎么样方便快捷的解析JSON

用到的头文件以及功能

#include <Thread.h> //多线程

#include <U8g2lib.h>  //U8glib,一个知名绘图库

#include <Wire.h> //I2C相关函数

#include <WiFi.h> //ESP32 Wifi相关函数

#include "time.h" //时间的处理

#include <HTTPClient.h> //获取http

#include <ArduinoJson.h> //解析json

1. 连接网络和时间获取

所有的基本就是连接网络,这里使用Wifi进行连接,因为从简所以先定义ssid和密码

const char *ssid = "wifi账号"; //

const char *password = "wifi的密码";

然后就是定义ntp服务器,使用的是阿里云的服务器需要注意的是夏令时和时区的时间偏移,我们是北京时间,GMT+8所以就是28800

​const char *ntpServer = "ntp.aliyun.com"; //时间服务器

const long gmtOffset_sec = 28800;         //时间偏移

const int daylightOffset_sec = 0;

然后就是启动wifi,等待wifi连接,这里用到的连接函数是Wifi.begin(),然后通过判断Wifi.status()是否是WL_CONNECTED来判断ESP32这会儿有没有连接到路由器

这里我用一个变量i来做计数器,达到127时候就提示出错,连不上网。

WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED)

  {

    delay(50);

    Serial.print(".");

    //u8g2.setCursor(2 + (i++), );

    u8g2.drawLine(0, 0, (i++), 0);

    u8g2.sendBuffer();

    if (i == 127)

    {

      DisError();

    }

  }

如果连接上,就是获取时间,使用configTime函数来完成

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

最后断开连接,关闭ESP32的Wifi功能达到省电的目的,实测关闭Wifi仅打开OLED的情况下功耗在20ma左右。

WiFi.disconnect(true);

  WiFi.mode(WIFI_OFF);

整个函数如下

//获取网上的时间

void getNetTime()

{

  int i = 0;

  Serial.printf("Connecting to %s ", ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED)

  {

    delay(50);

    Serial.print(".");

    //u8g2.setCursor(2 + (i++), );

    u8g2.drawLine(0, 0, (i++), 0);

    u8g2.sendBuffer();

    if (i == 127)

    {

      Desirer();

    }

  }

  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

  u8g2.setDrawColor(1);

  u8g2.setFont(font1);

  u8g2.setCursor(10, 48);

  clearHalf();

  u8g2.setDrawColor(1);

  u8g2.print("Get Time!"); //TODO 获取时间的提示

  // u8g2.sendBuffer();


  printLocalTime();

  Serial.println(" CONNECTED");

  WiFi.disconnect(true);

  WiFi.mode(WIFI_OFF);

}

获取天气和JSON解析

要获取天气需要在连接Wifi的情况下,具体在上一章节进行了说明,在连接到Wifi热点/路由器的情况下,访问API,获取JSON并且解析出天气和气温,这是ESP32在这一个章节要做的事情。

因为是在线获取,所以需要使用动态JSON解析,这里使用的库是AduinoJson,使用DynamicJsonDocument 来初始化一个存储Json数据的内存空间

DynamicJsonDocument doc(2048);

我们使用的是心知天气,它的api格式如下,需要自行去注册账号并且申请API(完全免费),如何申请在本文中略过。需要自定义的有API私钥和你所在的城市。

String tagethttp = "https://api.seniverse.com/v3/weather/now.json?key=这里填写你的API Key &location=这里填城市拼音名称&language=en";

这里需要实例化一个HTTPClient,然后使用begin函数去尝试连接

  HTTPClient https;

https.begin(tagethttp);

完成https连接后,在这里需要描述一下ArduinoJson的用法,用于解析我们用API获取到的数据

直接获取的天气的Json数据是这样的:

{"results":[{"location":{"id":"WX4FBXXFKE4F","name":"Beijing","country":"CN","path":"Beijing,Beijing,China","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"Overcast","code":"9","temperature":"26"},"last_update":"2021-08-11T21:24:24+08:00"}]}

浏览器优化后可以看出来是一个多层结构,分为location和now

ArduinoJson可以帮助我们快速简单的解析数据,它是以层层分析的形式,首先获取到Json数据,此时是字符串

String payload = https.getString();

之后需要解析为Json,存储到刚才划分的DynamicJsonDocument存储空间

deserializeJson(doc, payload);

接着就是先用JsonObject来获取整个Json数据中,now那部分内容

JsonObject results_0 = doc["results"][0];

JsonObject results_0_now = results_0["now"];

接着是获取天气

weather = results_0_now["text"];

以及气温

temperature = results_0_now["temperature"];

这样就可以完成所有解析了。

整个获取天气和气温,解析JSON代码如下,我用U8G2来实现OLED显示:

int temperature = 0;
const char *weather;
void getHttp() //TODO 获取http网页
{
  DynamicJsonDocument doc(2048);
  HTTPClient https;
  https.begin(tagethttp);
  int httpCode = https.GET();
  u8g2.setFont(font1);
  u8g2.clear();
  u8g2.setCursor(3, 50);
  if (httpCode > 0)
  {

    u8g2.sendBuffer();
    String payload = https.getString();
    deserializeJson(doc, payload);
    JsonObject results_0 = doc["results"][0];
    JsonObject results_0_now = results_0["now"];
    weather = results_0_now["text"];
    temperature = results_0_now["temperature"];
  }
  else
  {

    u8g2.print("Get http Failed");
    u8g2.sendBuffer();
    delay(1000);
  }
}

更多工具

这里还要提供一个方法,是使用在线工具来快速的预览你获得的数据,以及筛选他们的结果

https://wandbox.org/permlink/hcB7LwkuBtcUc3u6

在上面这边写一些代码,就可以在下面直接查看到最终输出的结果,可以说是非常快速而且容易使用。

### 回答1: ESP32是一个高度集成的微控制器,可以轻松获取时间天气信息。要实现这个功能,我们可以按照以下步骤进行: 1. 获取时间: 首先,我们需要连接到互联网。ESP32支持Wi-Fi连接,可以通过其内置的Wi-Fi模块连接到无线网络。在成功连接到网络后,我们可以使用NTP(网络时间协议)服务器来获取当前的时间。ESP32可以使用内置的NTP客户端库,向NTP服务器发送请求,并接收到时间戳。通过简单的编程,我们可以将时间戳转换为可读的格式,例如年、月、日、时、分、秒。这样,我们就可以在ESP32上获取到准确的时间了。 2. 获取天气: 为了获取天气信息,我们可以使用一些开放的天气API。这些API可以提供实时的天气数据,例如温度、湿度、气压、风速等信息。首先,我们需要注册一个天气API账号,并获取API密钥。然后,我们可以使用ESP32的Wi-Fi连接,向天气API服务器发送请求,并传递所需的参数,如地理位置、API密钥等。服务器将返回相应的天气数据,我们可以解析这些数据并提取所需的信息。最后,我们可以在ESP32上显示或存储这些天气数据,以便后续使用。 综上所述,借助ESP32的强大功能和互联网连接,我们可以轻松地实现获取时间天气的功能。这样,我们可以在自己的项目中通过ESP32来监控和展示实时的时间和天气信息。 ### 回答2: 使用ESP32获取时间天气,可以通过以下步骤实现: 1. 连接到Wi-Fi网络:首先,通过ESP32的Wi-Fi模块连接到一个可用的Wi-Fi网络。这可以通过调用适当的库函数来完成。确保提供正确的凭证和网络名称。 2. 获取时间:连接到Wi-Fi网络后,可以使用网络时间协议(NTP)服务器来获取当前时间。ESP32上的库函数可用于与NTP服务器进行通信并获取正确的时间戳。使用该时间戳进行所需的日期和时间的计算。 3. 获取天气:获取天气需要从一个天气API获取数据。选择一个提供天气数据的信任和可用的API,并创建一个帐户。根据API提供的说明,使用ESP32上的HTTP请求库函数向API发送请求,并从响应中提取所需的天气数据。 4. 解析和显示:一旦获取了天气数据,可以将其解析为所需的格式。这可以根据所选择的API和数据结构来完成。然后将数据显示在连接到ESP32的显示屏上,或者使用其他输出设备来显示天气信息。 5. 循环刷新:在代码中设置一个循环,以便定期刷新时间和天气数据。这可以使用延时函数或定时器来实现。 需要注意的是,确保适当理解所使用的库函数和API文档,并确保将授权和权限考虑在内。此外,网络连接和数据获取的稳定性也需要考虑,以确保系统的可靠性和准确性。 ### 回答3: 要通过ESP32获取时间天气信息,我们可以采取以下步骤: 1. 首先,需要连接ESP32与互联网,可以通过WiFi或其他网络连接方式实现。建立稳定的网络连接,使ESP32能够访问互联网。 2. 使用一种合适的开发环境例如Arduino IDE,开始编写ESP32的代码。引入相关的库,例如WiFi库和HTTP客户端库以便进行网络数据传输。 3. 在代码中,需要使用适当的API或服务提供者来获取时间天气信息。可以通过调用时间API获取当前时间,例如使用NTP(网络时间协议)服务器。对于天气信息,可以使用天气API,例如OpenWeatherMap或其他提供天气数据的服务。 4. 配置和发送HTTP请求以获取所需的数据。使用所选的时间API和天气API的URL和参数设置HTTP请求。确保将请求中包括必要的身份验证信息(如果有)。 5. 处理返回的数据。从HTTP响应中提取时间和天气信息。根据API的响应格式,可以使用适当的JSON解析器来提取所需的数据。 6. 在ESP32上显示或使用所获取的时间和天气信息。可以使用适当的显示设备(例如OLED显示屏)来显示信息,或者将其发送到其他设备(例如移动应用程序或服务器)。 以上是大致的步骤,其中涉及到的具体代码和细节取决于所选择的开发环境和使用的API。这是一个基本框架,可以根据需要进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值