连接WiFi与实现爬取天气——ESP32学习笔记

零、前言

在这里我们先要认识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.com/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.com/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.com)

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

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
实现ESP32与MCU串口之间的通信,并通过无线WiFi与计算机连接,你可以按照以下步骤进行: 1. 硬件连接:将ESP32的一个串口引脚(如GPIO1和GPIO3)连接到MCU的对应串口引脚(如TX和RX)。确保连接的线路正确,以便实现双向通信。 2. 设置ESP32与MCU串口通信:在ESP32的代码中,使用Serial.begin()函数初始化ESP32与MCU之间的串口通信。指定合适的波特率(如9600)和相应的引脚(如GPIO1为TX,GPIO3为RX)。例如,以下代码初始化了ESP32与MCU的串口通信: ```cpp void setup() { Serial.begin(9600); // 初始化ESP32与MCU的串口通信,波特率为9600 } void loop() { // 在这里编写你的代码 } ``` 3. 设置ESP32与计算机的无线WiFi连接:使用WiFi库在ESP32连接WiFi网络。在代码中,你需要提供WiFi网络的名称(SSID)和密码。例如,以下代码连接到名为"myWiFi"的WiFi网络: ```cpp #include <WiFi.h> const char* ssid = "myWiFi"; const char* password = "password"; void setup() { Serial.begin(9600); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); } void loop() { // 在这里编写你的代码 } ``` 4. 实现数据交互:通过串口通信,在ESP32和MCU之间传输数据。你可以使用Serial.print()和Serial.println()函数在ESP32和MCU之间发送和接收数据。例如: 在ESP32中发送数据到MCU: ```cpp void setup() { Serial.begin(9600); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); } void loop() { Serial.println("Hello MCU!"); // 发送数据到MCU delay(1000); } ``` 在MCU中接收来自ESP32的数据: ```cpp void setup() { Serial.begin(9600); // 初始化与ESP32的串口通信 } void loop() { if (Serial.available()) { // 检查是否有可读取的数据 char data = Serial.read(); // 读取数据 // 在这里处理接收到的数据 Serial.println(data); // 将接收到的数据发送回ESP32 } } ``` 5. 实现ESP32与计算机之间的无线通信:通过WiFi连接,使ESP32能够与计算机进行无线通信。你可以使用WiFiClient和WiFiServer库在ESP32实现与计算机之间的数据传输。例如,在ESP32上创建一个简单的Web服务器,以便通过计算机的Web浏览器访问ESP32上的数据: ```cpp #include <WiFi.h> WiFiServer server(80); void setup() { Serial.begin(9600); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); server.begin(); } void loop() { WiFiClient client = server.available(); if (client) { String request = client.readStringUntil('\r'); client.flush(); // 在这里处理来自计算机的请求 // 并向计算机发送响应 client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println(); client.println("<html><body><h1>Hello from ESP32!</h1></body></html>"); client.stop(); } } ``` 通过以上步骤,你可以实现ESP32与MCU之间的串口通信,并通过无线WiFi与计算机进行通信。 请注意,确保ESP32和MCU之间的串口设置正确,并且ESP32可以成功连接WiFi网络。如果遇到连接问题,可以检查硬件连接、波特率设置、WiFi网络设置和代码逻辑。 希望这些步骤能帮助你实现ESP32与MCU串口通信,并通过无线WiFi与计算机进行通信!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BAKUMAN#0704

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值