
注:本系列为个人学习 ESP32 的记录,主要通过再记录的方式学习,参考和搬运转载极客侠 GeeksMan 的文章。
著作权归极客侠 GeeksMan 所有,基于 GPL 3.0 协议。原文链接:https://docs.geeksman.com/esp32/Arduino/01.esp32-arduino-intro.html
连接无线路由器,将 ESP32 的 IP 地址等信息通过 Shell 控制台输出显示。
由于 ESP32 内置 WIFI 功能,所以直接在开发板上使用即可,无需额外连接。
Arduino 已经集成了 Wi-Fi 模块,因此我们可以直接使用该模块。
模块包含热点 AP 模式和客户端 STA 模式,热点 AP 是指电脑或手机端直接连接 ESP32 发出的热点实现连接,如果电脑连接模块 AP 热点,这样电脑就不能上网,因此在使用电脑端和模块进行网络通信时,一般情况下都是使用 STA 模式。也就是电脑和设备同时连接到相同网段的路由器上。
下面是一些 ESP32 Arduino 库中常用的 Wi-Fi 相关函数的介绍:
WiFi.begin(ssid, password):该函数用于连接到 Wi-Fi 网络。需要提供要连接的网络的 SSID 和密码作为参数。
WiFi.disconnect():该函数用于断开当前的 Wi-Fi 连接。
WiFi.status()
:该函数返回当前 Wi-Fi 连接的状态。返回值可能是以下之一:
WL_CONNECTED:已连接到 Wi-Fi 网络。WL_DISCONNECTED:未连接到 Wi-Fi 网络。WL_IDLE_STATUS:Wi-Fi 处于空闲状态。WL_NO_SSID_AVAIL:未找到指定的 Wi-Fi 网络。WiFi.localIP():该函数返回 ESP32 设备在 Wi-Fi 网络中分配的本地 IP 地址。
WiFi.macAddress():该函数返回 ESP32 设备的 MAC 地址。
WiFi.scanNetworks():该函数用于扫描周围可用的 Wi-Fi 网络。它返回一个整数,表示扫描到的网络数量。可以使用其他函数(如 WiFi.SSID() 和 WiFi.RSSI())来获取每个网络的详细信息。
WiFi.SSID(networkIndex):该函数返回指定索引的扫描到的 Wi-Fi 网络的 SSID。
WiFi.RSSI(networkIndex):该函数返回指定索引的扫描到的 Wi-Fi 网络的信号强度(RSSI)。
#include <WiFi.h>
#define LED 2
// 定义 Wi-Fi 名与密码
const char * ssid = "WiFi名";
const char * password = "WiFi密码";
void setup() {
Serial.begin(9600);
// 断开之前的连接
WiFi.disconnect(true);
// 连接 Wi-Fi
WiFi.begin(ssid, password);
Serial.print("正在连接 Wi-Fi");
// 检测是否链接成功
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("连接成功");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// 使用板载 LED 反馈连接成功
pinMode(LED, OUTPUT);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
digitalWrite(LED, HIGH);
delay(1500);
digitalWrite(LED, LOW);
}
void loop() {
}
在 C 和 C++ 编程语言中,const char * 是一个常见的类型声明,通常用于表示指向字符常量的指针。让我们逐个解释这个声明的各个部分:
const:这是一个关键字,表示指针所指向的数据是常量,即不可修改。使用 const 修饰指针可以确保在使用指针时不会意外地修改所指向的数据;char:这是字符类型的关键字,表示该指针指向的数据是字符类型的数据。char 类型通常用于表示单个字符或字符数组;*:这是指针声明符号,用于表示将声明一个指向特定类型的指针。在这种情况下,它表示将声明一个指向 char 类型数据的指针。const char *:将上述部分组合在一起,表示一个指向字符常量的指针。这意味着该指针指向的字符数据是不可修改的。
可以使用 const char *声明来指向字符串常量,例如:
const char *str = "Hello, world!";
在上面的示例中,str 是一个指向字符常量的指针,它指向存储在内存中的字符串 "Hello, world!"。通过使用 const 关键字,我们确保不会通过 str 指针修改该字符串的内容。
刚才我们已经可以正常连接 WiFi 了,接下来,我们就可以来创建热点了。
#include <WiFi.h>
// 设置要创建的热点名与密码
const char * ssid = "ESP32_AP";
const char * password = "12345678";
void setup() {
Serial.begin(9600);
// 创建热点
WiFi.softAP(ssid, password);
// 打印热点 IP
Serial.print("Wi-Fi 接入的 IP:");
Serial.println(WiFi.softAPIP());
}
void loop() {
}
ESP32支持2.4G网络,通过发送HTTP请求获取API数据,例如获取实时天气数据。一般来说,天气数据是由一些公共 API 接口提供的,这些接口需要向它们发送 HTTP 请求以获取数据。
当我们在浏览器中输入网址或者使用应用程序时,我们实际上是向服务器发出请求。HTTP 请求是客户端(如浏览器)与服务器之间通信的方式,用于获取或发送 Web 资源。这些资源可以是文本文件、图像、脚本等,客户端通过 HTTP 协议发起请求,服务器返回相应的响应。
HTTP 请求通常由以下几个部分组成:
请求行:包含请求方法、请求 URL 和 HTTP 协议版本,例如GET https://www.baidu.com/content-search.xml HTTP/1.1
GET 是请求方法,https://www.baidu com/ 是 URL 地址,HTTP/1.1 指定了协议版本。
HTTP 协议版本一般都是 HTTP/1.1,URL 是你要访问的地址,而请求方法除了 GET 还有 POST、PUT、DELETE 经常使用的 4 个请求方式,以及一些其他的请求方法。
请求头:包含与请求相关的信息,例如浏览器类型、请求时间等。请求体:包含请求所需的数据。我们虽然可以对任意网址发送网络请求,但是这样毫无意义,比如,我想要获取某个地区的天气状况,就需要调用相对应的接口,也就是 API。
API(Application Programming Interface)是指应用程序编程接口,它定义了应用程序之间进行通信的方式和规范。API 允许不同的应用程序之间进行数据交换,使得应用程序可以共享资源和信息,从而提高应用程序的效率和可用性。
API 通常使用 HTTP 请求来提供服务,客户端通过发送 HTTP 请求访问 API,服务器则通过 HTTP 响应返回所需的数据。API 可以提供许多不同的服务,例如访问数据库、获取实时数据、处理图像等。
当我们使用别人提供的 API 的时候就需要遵守别人制定的规则,使用对应的链接、请求方法等等,我们需要查看 API 文档来获取这些信息。比如,我们今天使用聚合数据的 API 接口。

总之,HTTP 请求是客户端与服务器之间通信的方式,API 则是应用程序之间通信的方式。通过 HTTP 请求访问 API,我们可以实现不同应用程序之间的数据交换和共享。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于 Web 应用程序之间的数据传输。它是一种文本格式,易于阅读和编写,并且可以被各种编程语言支持。
JSON 数据由键值对组成,其中键是字符串,值可以是字符串、数字、布尔值、数组、对象等数据类型。一个基本的 JSON 对象看起来像这样:
{
"name": "十八加十八",
"age": 22,
"isStudent": true,
"hobbies": ["打羽毛球", "骑自行车"],
"address": {
"city": "揭阳",
"state": "广东"
}
}
其中,name、age、isStudent、hobbies 和 address 都是键,而对应的值分别是字符串 "十八加十八"、数字 22、布尔值 true、字符串数组 ["打羽毛球", "骑自行车"] 和一个嵌套的 JSON 对象 { "city": "揭阳", "state": "广东" }。
JSON 数据通常用于 Web 应用程序中,例如从后端服务器获取数据或向后端服务器发送数据。在前端 JavaScript 中,可以使用内置的 JSON 对象将 JSON 字符串转换为 JavaScript 对象,或将 JavaScript 对象转换为 JSON 字符串。
想要发送 HTTP 请求,我们就需要用到 HTTPClient 库。
HTTPClient 库是一个用于 Arduino 的 HTTP 客户端库,它提供了一组函数来轻松地发送 HTTP 请求并处理服务器响应。HTTPClient 库基于 ESP-IDF 的 HTTP 客户端实现,并在 Arduino 框架下进行了封装,使其易于使用。
以下是 HTTPClient 库的一些常用功能和函数:
HTTPClient http;:创建 HTTPClient 对象。http.begin(url):指定要发送请求的 URL。http.addHeader(name, value):添加 HTTP 头部。http.setAuthorization(username, password):设置 HTTP 基本身份验证的用户名和密码。http.setTimeout(timeout):设置请求超时时间(以毫秒为单位)。http.GET():发送 GET 请求,并返回一个 HTTP 状态码。http.POST(payload):发送 POST 请求,并将 payload 作为请求正文。http.responseStatusCode():获取响应的状态码。http.responseHeaders():获取响应的头部。http.responseBody():获取响应的正文。http.getString():获取响应正文作为字符串。http.getStream():获取响应正文作为流对象。http.end():关闭连接并释放资源。我们从 Web 服务获取的是 JSON 数据,要想解析 JSON 数据,可以使用 Arduino 的 ArduinoJSON 库。ArduinoJSON 库使您能够解析和生成 JSON 数据,以及在 Arduino 上处理 JSON 格式的数据。
下面是使用 ArduinoJSON 库(v7 及以上版本)解析 JSON 数据的基本步骤:
引入 ArduinoJson.h 头文件;
#include <ArduinoJson.h>
创建一个 JsonDocument 对象来存储和处理 JSON 数据。
在较新版本的 ArduinoJson 库中,DynamicJsonDocument 和 StaticJsonDocument 已被统一为 JsonDocument。您不再需要预先指定大小,库会在解析时自动为您管理内存,这简化了使用流程。
JsonDocument doc; // 无需指定大小
使用 deserializeJson() 函数将 JSON 数据解析到 JsonDocument 对象中,并检查是否出错。
这是一个非常关键的步骤。deserializeJson() 会返回一个 DeserializationError 对象,通过检查这个对象可以判断解析是否成功。
// json 是包含 JSON 数据的字符串或字符数组
DeserializationError error = deserializeJson(doc, json);
// 检查解析是否成功
if (error) {
Serial.print("deserializeJson() failed: ");
Serial.println(error.c_str());
return; // 如果解析失败,应停止后续操作
}
doc:JsonDocument 对象,用于存储解析后的 JSON 数据。json:包含 JSON 数据的字符串或字符数组。通过键名 (key) 从 JsonDocument 对象中获取值。
对于基本类型(如 int, float, bool),通常可以直接赋值。对于字符串,推荐使用 const char* 以获得更高效率。如果需要显式类型转换,也可以继续使用 .as<type>() 方法。
// 示例1:直接获取整型值
int temp = doc["result"]["realtime"]["temperature"];
// 示例2:获取字符串,使用 const char* 更高效
const char* info = doc["result"]["realtime"]["info"];
// 示例3:如果需要,也可以使用 .as<String>() 来创建一个String对象
String infoString = doc["result"]["realtime"]["info"].as<String>();
"key":JSON 对象的键。const char* 会直接指向 JsonDocument 内存中的数据,避免了不必要的内存复制,特别适合内存有限的微控制器。因此,我们使用聚合数据的获取实时天气网络数据的代码可以这么写:
#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
//WiFi设置
const char* ssid = "Eighteen-WiFi";
const char* password = "zxcvbnm1818";
//定义天气网络数据
String url = "http://apis.juhe.cn/simpleWeather/query";
String city = "佛山";
String key = "51053fd81c1b2ebdb77b9ff9f9d3d6d7";
void setup() {
//设置波特率
Serial.begin(9600);
//断开旧WiFi
WiFi.disconnect(true);
//连接 WiFi
WiFi.begin(ssid,password);
Serial.print("正在连接:WiFi");
// 检测是否连接成功
while (WiFi.status()!=WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println(""); // 换行,让输出更美观
Serial.print("连接成功!");
Serial.print("IP address: ");
//打印WiFi的IP地址
Serial.println(WiFi.localIP());
//创建HTTPClient对象
HTTPClient http;
//发送GET请求
http.begin(url+"?city="+city+"&key="+key);
int http_code =http.GET();
Serial.printf("
Http 状态码:%d
",http_code);
if (http_code > 0) { // 检查请求是否成功
// 获取响应数据
String response =http.getString();
Serial.println("响应数据:");
Serial.println(response);
http.end();
// 创建 JsonDocument 对象 <-- 修改在这里
JsonDocument doc;
// 解析 JSON 数据,并增加错误检查
DeserializationError error = deserializeJson(doc, response);
if (error) {
Serial.print("deserializeJson() failed: ");
Serial.println(error.c_str());
// 如果解析失败,则不继续执行
return;
}
// 从解析后的 JSON 文档中获取值
unsigned int temp = doc["result"]["realtime"]["temperature"];
// 使用 const char* 可以更高效获取数据
const char* info = doc["result"]["realtime"]["info"];
int aqi = doc["result"]["realtime"]["aqi"];
Serial.printf("温度:%u
", temp);
Serial.printf("天气:%s
", info);
Serial.printf("空气指数:%d
", aqi);
} else {
Serial.printf("HTTP GET请求失败, 错误: %s
", http.errorToString(http_code).c_str());
http.end();
}
}
void loop() {
}
我们目前使用的这些 API 接口,都是其他公司提供的服务,而如果我们想要搭建自己的 API 接口,该怎么办呢?
首先,你需要明白,想要搭建自己的 API 接口,其实就是搭建你自己的网站,而搭建网站分为前端和后端,前端和后端是指构成Web应用程序的两个主要部分:
后端的功能往往是由编程语言(如 Python、Java 等)和相关框架实现的,而前端通常由 HTML、CSS 和 JavaScript 等技术实现。前端和后端需要通过网络协议(如 HTTP)进行通信,将前端用户输入的数据传递到后端进行处理,再将处理结果返回到前端。
前端和后端的交互使得 Web 应用程序具有强大的功能和可扩展性。
如果你是非科班出身,想要转行做程序员,前端是你最好的选择,WEB 前端是最容易入门的编程岗位,初级前端技术很容易掌握,高级前端需要一步步学习和工作经验的积累。
后端的分类就很多了,国内主流的后端开发使用的是 Java、Go、Python、Node.js、C++、Rust、PHP 等。所以你该怎么选呢?以下仅代表我个人建议:
Article Navigation System © 2025
欢迎来到我的留言板,留下你的足迹,与我分享你的想法和感受。
点击文本框会有惊喜哦`(。•̀ᴗ-)✧