admin管理员组

文章数量:1619292

零、前言

在这里我们先要认识json:

JOSN是一种轻量级的数据交换格式,遵循以下规则:

1.并列的数据之间用逗号(,)分隔

2.映射用冒号(:)表示

3.并列数据的集合(数组)用方括号([])表示

4.映射的集合(对象)用大括号({})表示

一、连接WiFi

由于要使用WiFi和连接到互联网,我们要在头文件中首先引入WiFi和HTTPClient这两个库,然后通过begin函数来连接上WiFi

在这里WiFi.begin("WiFi名称", "WiFi密码");

输入相对应的WiFi名称和密码就可以连接上WiFi了,

while (WiFi.status() != WL_CONNECTED)
	{ //这里是阻塞程序,直到连接成功
		delay(300);
		Serial.print(".");
	}

然后使用阻塞程序,意思就是当你的WiFi没有连接上去时会一直重新连接,如果一直连不上(串口显示Connecting...),因该是WiFi名称或者密码连接错误。

接着在set up函数中打印IP地址用来证明WiFi连接成功。

void setup()
{

	Serial.begin(115200); // open the serial port at 115200 bps;
	delay(100);

	Serial.print("Connecting.. ");

	WiFi_Connect();

	Serial.println("WiFi connected");

	Serial.println("IP address: ");
	Serial.println(WiFi.localIP());
}

二、爬取信息

下面定义一个长整型变量wenDu用来显示一会要打印出来的温度。然后定义一个字符串存放天气的url,这里我用的是和风天气来爬取温度,

	long int wenDu = 0;
	String weatherUrl = "https://devapi.qweather/v7/weather/now?location=113.62701403693164,34.747358802645046&key=b408a1df55fa4c22b270be9a6a27f561&gzip=n&en";
	DynamicJsonDocument doc(1024);

然后就是使用begin函数http.begin(weatherUrl)来进入这样的一个网址,定义一个httpCode来存放这个网址所返回的代码,如果能够正常进入的话这个返回的http.GET()应该返回的值为200。

然后当收到正确的内容后,我们定义一个字符串用于存放爬取网站的json信息

		Serial.printf("HTTP Get Code: %d\r\n", httpCode);
		if (httpCode == HTTP_CODE_OK) // 收到正确的内容
		{
			String resBuff = http.getString();

			//输出示例{"code":"200","updateTime":"2021-10-03T11:32+08:00","fxLink":"http://hfx.link/1tsq1","now":{"obsTime":"2021-10-03T11:23+08:00","temp":"28","feelsLike":"31","icon":"104","text":"阴","wind360":"180","windDir":"南风","windScale":"2","windSpeed":"7","humidity":"73","precip":"0.0","pressure":"993","vis":"11","cloud":"100","dew":"21"},"refer":{"sources":["QWeather","NMC","ECMWF"],"license":["no commercial use"]}}
			Serial.println(resBuff);

			deserializeJson(doc, resBuff);
			wenDu = doc["now"]["temp"];
			Serial.printf("温度: %ld \r\n", wenDu);
		}

三、开始使用json解析

 然后通过在线解析工具我们可以看到json想要传递给我们的一些讯息,在这里我要用到的信息温度就是now这一对象的一个属性temp(温度),就可以使用doc[][]来进行解析,第一个参数是对象名称,第二个参数是这个对象中的一个属性的名称,这样子就能得到我们想要的数据,最后打印出来就可以了。


		Serial.printf("HTTP Get Error: %s\n", http.errorToString(httpCode).c_str());

成品示例:

最后附上整个代码段

#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include "../lib/ArduinoJson/ArduinoJson.h"

// JOSN是一种轻量级的数据交换格式,遵循以下规则:
// 1.并列的数据之间用逗号(,)分隔
// 2.映射用冒号(:)表示
// 3.并列数据的集合(数组)用方括号([])表示
// 4.映射的集合(对象)用大括号({})表示

//	WiFi的初始化和连接
void WiFi_Connect()
{
	WiFi.begin("CMCC-CVe2", "ardxy3eq");
	while (WiFi.status() != WL_CONNECTED)
	{ //这里是阻塞程序,直到连接成功
		delay(300);
		Serial.print(".");
	}
}

void setup()
{

	Serial.begin(115200); // open the serial port at 115200 bps;
	delay(100);

	Serial.print("Connecting.. ");

	WiFi_Connect();

	Serial.println("WiFi connected");

	Serial.println("IP address: ");
	Serial.println(WiFi.localIP());
}
	long int wenDu = 0;
	String weatherUrl = "https://devapi.qweather/v7/weather/now?location=113.62701403693164,34.747358802645046&key=b408a1df55fa4c22b270be9a6a27f561&gzip=n&en";
	DynamicJsonDocument doc(1024);
  void getWeather()
  {
	  HTTPClient http;
	  http.begin(weatherUrl); 
	  int httpCode = http.GET();
	  if (httpCode > 0)
	{
		// httpCode will be negative on error
		Serial.printf("HTTP Get Code: %d\r\n", httpCode);
		if (httpCode == HTTP_CODE_OK) // 收到正确的内容
		{
			String resBuff = http.getString();

			//输出示例{"code":"200","updateTime":"2021-10-03T11:32+08:00","fxLink":"http://hfx.link/1tsq1","now":{"obsTime":"2021-10-03T11:23+08:00","temp":"28","feelsLike":"31","icon":"104","text":"阴","wind360":"180","windDir":"南风","windScale":"2","windSpeed":"7","humidity":"73","precip":"0.0","pressure":"993","vis":"11","cloud":"100","dew":"21"},"refer":{"sources":["QWeather","NMC","ECMWF"],"license":["no commercial use"]}}
			Serial.println(resBuff);

			deserializeJson(doc, resBuff);
			wenDu = doc["now"]["temp"];
			Serial.printf("温度: %ld \r\n", wenDu);
		}
	}
	else
	{
		Serial.printf("HTTP Get Error: %s\n", http.errorToString(httpCode).c_str());
	}

	http.end();

  }
void loop()
{

	getWeather();
	delay(5000);
	delay(5000);
}

本篇文章参考:

ESP32超详细教程-使用VSCode(基于Arduino框架)_哔哩哔哩_bilibili

和风天气开发平台:和风天气开发平台 ~ 高效强大的天气API,天气SDK和天气插件 (qweather)

本人也是单片机小白,本篇文章仅用于学习分享的目的,文章中有错误的地方欢迎指出,希望大家友好交流谢谢你的观看。

本文标签: 学习笔记天气wifi