538浏览
查看: 538|回复: 0

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

[复制链接]
本帖最后由 kylinpoet 于 2022-6-22 13:27 编辑

一:前言

前文我们大致介绍了Beetle ESP32-C3的上手使用,作为ESP生态的一个芯片,它的软件部分,乐鑫科技这几年也在不断完善。 DF又在此基础上进行了一定的设计,整体上来说使用起来还是比较丝滑的。本文我们继续来聊聊其主打的WiFi功能。(如想了解前文请点击链接:)
【Beetle ESP32-C3试用(一)】点灯是最好的体验

二:WiFi连接

为了使用的通用性,本文使用Arduino进行编码测试,首先我们来看下,在Arduino里如何进行WiFi连接:

#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的连接测试,所以代码稍长):
WedJune-202206224527..png
经长时间测试,模块还是比较稳定的。

三:WiFi界Hello World

3.1: http连接

连接WiFi后,获取天气预报是比较常规的做法。为了连接天气预报的API,我们需要先定义HTTP请求的函数,当然要先引入httpclient的头函数:  #include <HTTPClient.h>

#include <HTTPClient.h>
String httpGETRequest(const char* serverName) {
  //...省略代码
  //返回获得的数据用于Json处理
  return payload;
}

笔者使用的是 https://www.sojson.com/api/weather.html,这个网站的API,读者如有需要请自行查阅文档:
WedJune-202206227589..png

3.2 :JSON解析

因为大部分的API返回的都是JSON数据,所以我们在Arduino里引入JSON库,进行解析。

3.2.1 Arduino_JSON库

您需要安装Arduino_JSON库。通过 Arduino IDE Tools -> Manage Libraries 中输入 Arduino_JSON 并安装该库:
WedJune-202206221154..png

3.2.2 JSON解析

为了解析返回的JSON数据,我们需要进行如下操作:

#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"]);

解析后的数据:
WedJune-202206224623..png
完整代码如下(WiFi的ssid和password请自行修改):

#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函数,使得使用更加方便。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail