kylinpoet 发表于 2022-6-22 13:25:45

【Beetle ESP32-C3试用(二)】你WiFi的样子很美

本帖最后由 kylinpoet 于 2022-6-22 13:27 编辑

# 一:前言
前文我们大致介绍了Beetle ESP32-C3的上手使用,作为ESP生态的一个芯片,它的软件部分,[乐鑫科技](https://www.espressif.com/zh-hans/products/socs)这几年也在不断完善。 DF又在此基础上进行了一定的设计,整体上来说使用起来还是比较丝滑的。本文我们继续来聊聊其主打的WiFi功能。(如想了解前文请点击链接:)
[【Beetle ESP32-C3试用(一)】点灯是最好的体验](https://mc.dfrobot.com.cn/thread-313502-1-1.html?fromuid=805438)
# 二:WiFi连接
为了使用的通用性,本文使用Arduino进行编码测试,首先我们来看下,在Arduino里如何进行WiFi连接:
```c
#include <WiFi.h>

//修改WIFI名称以及密码
const char* ssid = "********";//WIFI名称
const char* password = "********";//WIFI密码

void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("Connecting");

//判断WIFI是否连接
while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
}

unsigned long lastTime = 0;
//设置每10秒显示测试数据
unsigned long timerDelay = 10000;

void loop() {
if ((millis() - lastTime) > timerDelay) {
    //检测WIFI是否已经连接
    if(WiFi.status()== WL_CONNECTED){
      Serial.print("WiFi Connected:");
      Serial.println(WiFi.localIP());
    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
}
}
```
WiFi的连接方式,和一般的WiFi芯片连接方式类似,我们可以直接刷入以上代码进行测试(因为加入了每10S的连接测试,所以代码稍长):

经长时间测试,模块还是比较稳定的。
# 三:WiFi界Hello World
## 3.1: http连接
连接WiFi后,获取天气预报是比较常规的做法。为了连接天气预报的API,我们需要先定义HTTP请求的函数,当然要先引入httpclient的头函数:`#include <HTTPClient.h>`
```c
#include <HTTPClient.h>
String httpGETRequest(const char* serverName) {
//...省略代码
//返回获得的数据用于Json处理
return payload;
}
```
笔者使用的是 (https://www.sojson.com/api/weather.html),这个网站的API,读者如有需要请自行查阅文档:

## 3.2 :JSON解析
因为大部分的API返回的都是JSON数据,所以我们在Arduino里引入JSON库,进行解析。
### 3.2.1 Arduino_JSON库
您需要安装Arduino_JSON库。通过 Arduino IDE Tools -> Manage Libraries 中输入 Arduino_JSON 并安装该库:

### 3.2.2 JSON解析
为了解析返回的JSON数据,我们需要进行如下操作:
```c
#include <Arduino_JSON.h>

JSONVar myObject = JSON.parse(jsonBuffer);
//判断解析是否成功
if (JSON.typeof(myObject) == "undefined") {
    Serial.println("Parsing input failed!");
    return;
}
Serial.print("JSON object = ");
Serial.println(myObject);

Serial.print("城市: ");
Serial.println(myObject["cityInfo"]["city"]);
Serial.print("时间: ");
Serial.println(myObject["time"]);            
Serial.print("温度: ");
Serial.print(myObject["data"]["wendu"]);
Serial.print(",湿度: ");
Serial.println(myObject["data"]["shidu"]);
```
解析后的数据:

完整代码如下(WiFi的ssid和password请自行修改):
```c
#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>


//修改WIFI名称以及密码
const char* ssid = "********";//WIFI名称
const char* password = "********";//WIFI密码

void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("Connecting");

//判断WIFI是否连接
while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
}

unsigned long lastTime = 0;
//设置每5秒显示测试数据
unsigned long timerDelay = 5000;

//北京城市代码
String city = "101010100";
//天气预报API
String serverPath = "http://t.weather.sojson.com/api/weather/city/" + city;
String jsonBuffer;


void loop() {
if ((millis() - lastTime) > timerDelay) {
    //检测WIFI是否已经连接
    if(WiFi.status()== WL_CONNECTED){
      jsonBuffer = httpGETRequest(serverPath.c_str());
      // Serial.println(jsonBuffer);
      //将解析的Json对象值储存在Jsonu缓冲区中
      JSONVar myObject = JSON.parse(jsonBuffer);

      //判断解析是否成功
      if (JSON.typeof(myObject) == "undefined") {
      Serial.println("Parsing input failed!");
      return;
      }
/*
      Serial.print("JSON object = ");
      Serial.println(myObject);*/
      Serial.print("城市: ");
      Serial.println(myObject["cityInfo"]["city"]);
      Serial.print("时间: ");
      Serial.println(myObject["time"]);            
      Serial.print("温度: ");
      Serial.print(myObject["data"]["wendu"]);
      Serial.print(",湿度: ");
      Serial.println(myObject["data"]["shidu"]);
    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
}

}


String httpGETRequest(const char* serverName) {
WiFiClient client;
HTTPClient http;

//连接网址
http.begin(client, serverName);

//发送HTTP站点请求
int httpResponseCode = http.GET();

//该数组用于储存获得的数据
String payload = "{}";

//将获得的数据放入数组
if (httpResponseCode>0) {
    // Serial.print("HTTP Response code: ");
    // Serial.println(httpResponseCode);
    payload = http.getString();
}
else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
}

//释放资源
http.end();

//返回获得的数据用于Json处理
return payload;
}
```
# 四:总结
使用Beetle ESP32-C3芯片进行WiFi连接还是比较方便的。整个测试过程数据稳定,理论上能进行长时间的真实环境使用。
建议DF开发部门进行整合库的开发,如http函数,使得使用更加方便。
页: [1]
查看完整版本: 【Beetle ESP32-C3试用(二)】你WiFi的样子很美