ESP32教程系列
1 - 认识ESP32
2 - Arduino IDE安装&配置
3 - 基本操作
4 - WiFi配网
5 - WebServer①
6 - Web Server②控制输出
7 - Web Server③ HTML&CSS基础
8 - Web Server④ 在Arduinio中添加HTML&CSS
9 - 异步网页服务器 Asynchronous Web Server(DHT11)
10 - OTA ESP32无线升级,告别数据线
ESP32实战系列
WiFi遥控小车
ESP32 Homekit系列
Homekit & Homespan介绍
点亮一颗LED
调节LED亮度
更新
2025.3.16 更新AP配网
前言
从本节开始介绍ESP32核心功能之一—物联网功能。在正式进入物联网之前,我们先了解下如何连接Wi-Fi。
如何配网
连接Wi-Fi的方法一般有两种。
一是通过代码里固定写死账号密码,这种比较适合在已经明确的固定场所使用,如家庭,工作地点,上电自动连入Wi-Fi,避免繁琐的人工配网过程。缺点不言而喻,灵活性低,当将设备移到不同地方时,需重新烧录代码。
二是通过手机配网。现在的智能家居就是使用这种方法,先通过连入设备的热点,告诉设备所要连接的Wi-Fi以及密码,即可自动连上。设备在记忆后,断电后下次上电时可自动连入Wi-Fi。优点就是灵活性高,缺点就是首次配网教麻烦,当然代码也会相对复杂。
方法一
我们在学习ESP32网络相关时,一般使用自带的示例代码去熟悉这些函数的功能,编写。所以教程里也是用这些示例。
我们使用ESP32自带的示例WebServer.
我们选择secrets.h选项卡
在这个文件里配置需要连接的WiFi名称和密码
// add you wifi network name and PassPhrase or use WiFi Manager
const char *ssid = ""; //WiFi名称
const char *passPhrase = ""; //WiFi密码
配置好以后,每次上电时,ESP32会自动连接该WiFi。
方法二
第二种方法呢,我们希望在ESP32上电的时候,由我们自行决定连接哪个WiFi。
那么官方也提供了一个示例代码。
我们打开这个WiFiSmartConfig示例代码。
#include "WiFi.h"
void setup() {
Serial.begin(115200); //配置串口通信速率
//初始化WiFi模块为Station,开启智能配网
WiFi.mode(WIFI_AP_STA);
WiFi.beginSmartConfig();
//等待手机端的智能配网
Serial.println("Waiting for SmartConfig.");
while (!WiFi.smartConfigDone()) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("SmartConfig received.");
//等待WiFi连接
Serial.println("Waiting for WiFi");
WiFi.begin();
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi Connected.");
//连接成功后打印IP地址
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void loop() {
// put your main code here, to run repeatedly:
}
使用智能配网时,我们需要用到手机上的APP。
安装应用:下载并安装 ESP Touch 应用(Android)或 ESPTouch 应用(iOS)。这个应用用于向ESP32发送Wi-Fi网络信息。
博主的手机为iPhone,以下说明以iPhone为例。
1、在应用商店下载下述App
该APP为Espressif官方App
2、配网
打开App后,界面如下。异常简洁。我们选择EspTouch即可。
确保手机已经连入WiFi,此时SSID处会出现相应的WIFI名称,在密码框中输入密码,最后点击屏幕最下方的确认即可完成配网。
那么在串口处会出现以下内容,说明联网成功。
第一行的…表示在等待配网。
配网成功后会显示IP地址。
WiFiSmartConfig的BUG
这一段官方的代码呢,仅为示例代码,过程是上电后需要等待手机配网,配网成功后打印IP地址。
#include "WiFi.h"
void setup() {
Serial.begin(115200); //配置串口通信速率
//初始化WiFi模块为Station,开启智能配网
WiFi.mode(WIFI_AP_STA);
WiFi.beginSmartConfig();
//等待手机端的智能配网
Serial.println("Waiting for SmartConfig.");
while (!WiFi.smartConfigDone()) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("SmartConfig received.");
//等待WiFi连接
Serial.println("Waiting for WiFi");
WiFi.begin();
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi Connected.");
//连接成功后打印IP地址
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void loop() {
// put your main code here, to run repeatedly:
}
经过实测,掉电再上电后,需要重新配网,那么这种做法在实际项目中就没有太大意义了。所以我们需要对这段代码进行改造。
逻辑就是,先检查是否有保存过的Wifi信息,有的话,去连接这个WiFi;没有则进入配网过程。
#include <WiFi.h>
void setup() {
Serial.begin(115200);
// 检查是否有保存的Wi-Fi配置信息
if (WiFi.status() != WL_CONNECTED) {
WiFi.begin(); // 尝试自动连接上次保存的Wi-Fi
Serial.println("尝试连接已保存的WiFi...");
// 等待连接成功
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
delay(500);
Serial.print(".");
attempts++;
}
}
// 如果无法自动连接Wi-Fi,则进入SmartConfig模式
if (WiFi.status() != WL_CONNECTED) {
Serial.println("\n开始配网...");
WiFi.beginSmartConfig(); // 启动SmartConfig
while (!WiFi.smartConfigDone()) {
delay(500);
Serial.print(".");
}
Serial.println("配网成功");
}
// 确保连接成功
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi已连接.");
Serial.print("IP地址: ");
Serial.println(WiFi.localIP());
}
void loop() {
// 在此处可以添加其他代码
}
上述代码虽然可以掉电保存已连接的WiFi,但我们想要更换WiFi的话就比较困难了,所以我们需要加一个外部操作,如按键,按下按键时,清除原来已保存的wifi信息,重新进入配网过程。
#include <WiFi.h>
#define BUTTON_PIN 0 // 使用GPIO 0作为按键引脚(可以根据硬件情况更改)
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP); // 设置按键引脚为输入并启用上拉电阻
// 检查按键是否被按下
if (digitalRead(BUTTON_PIN) == LOW) { // 如果按键按下,进入配网模式
Serial.println("Button pressed, clearing Wi-Fi settings...");
WiFi.disconnect(true, true); // 清除保存的Wi-Fi信息
delay(1000); // 给清除过程一些时间
}
// 检查是否有保存的Wi-Fi配置信息
if (WiFi.status() != WL_CONNECTED) {
WiFi.begin(); // 尝试连接保存的Wi-Fi
Serial.println("Trying to connect to saved Wi-Fi...");
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
delay(500);
Serial.print(".");
attempts++;
}
}
// 如果无法自动连接Wi-Fi,则进入SmartConfig模式
if (WiFi.status() != WL_CONNECTED) {
Serial.println("\nStarting SmartConfig...");
WiFi.beginSmartConfig(); // 启动SmartConfig
while (!WiFi.smartConfigDone()) {
delay(500);
Serial.print(".");
}
Serial.println("SmartConfig Success");
}
// 确保连接成功
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi已连接.");
Serial.print("IP地址: ");
Serial.println(WiFi.localIP());
}
void loop() {
// 在此处可以添加其他代码
}
方法三
原理:ESP32启动AP模式,用户连接后通过网页配置WiFi。
需要的库:WiFiManager
#include <WiFiManager.h> // 必须安装WiFiManager库
#include <WiFi.h>
#include <ESPmDNS.h> // 可选:用于mDNS服务(局域网域名访问)
void setup() {
Serial.begin(115200);
Serial.println("\n启动中...");
// 初始化WiFiManager
WiFiManager wifiManager;
// 可选配置 ----------------------------------------
// 设置配网超时时间(单位:秒,超时后自动重启)
wifiManager.setTimeout(180);
// 自定义AP名称和密码(默认无密码)
// wifiManager.autoConnect("ESP32-AP", "12345678");
// ------------------------------------------------
// 尝试连接已保存的WiFi,若失败则启动配网AP
if (!wifiManager.autoConnect("ESP32-Config")) {
Serial.println("配网失败,重启设备");
delay(3000);
ESP.restart(); // 重启
}
// 配网成功后的逻辑 --------------------------------
Serial.println("\nWiFi已连接!");
Serial.print("IP地址: ");
Serial.println(WiFi.localIP());
// 可选:启用mDNS服务(通过域名访问ESP32)
if (MDNS.begin("esp32")) {
Serial.println("mDNS域名: esp32.local");
}
// 在此添加后续代码(如启动Web服务器、OTA等)
}
void loop() {
// 保持连接,防止看门狗复位
delay(1000);
}
烧录之后,使用手机连接SSID为ESP32-Config的网络,无需密码。
在网页浏览器里输入:http://192.168.4.1
点击【Configure WiFi】
选择要连接的网络,并输入密码,最后点击Save按钮即可。
拓展
各位有兴趣也可以将上述配网信息显示在OLED中。针对OLED类的I2C设备做一个小拓展。
博主以前也买过不少OLED模块,但每次买回来都要折腾一番。主要是地址与模块上显示的地址不匹配。Arduino自带了一个I2C地址扫描示例,我们可以利用这个示例代码来查找我们所连接的I2C地址是多少。
#include "Wire.h"
void setup() {
Serial.begin(115200);
Wire.begin(5,4); //Wire.begin(SDA,SCL),根据具体的开发板进行修改
}
void loop() {
byte error, address;
int nDevices = 0;
delay(5000);
Serial.println("Scanning for I2C devices ...");
for (address = 0x01; address < 0x7f; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.printf("I2C device found at address 0x%02X\n", address);
nDevices++;
} else if (error != 2) {
Serial.printf("Error %d at address 0x%02X\n", error, address);
}
}
if (nDevices == 0) {
Serial.println("No I2C devices found");
}
}
找到地址后会在串口中显示。
结束
以上就是配网的基本教程。
如有错误,欢迎指正。
如果喜欢,欢迎关注微信公众号:+大钱硬件
苹果智能家居HomeKit系列文章
ESP32 Homekit实战 - Homekit & Homespan介绍
ESP32 Homekit实战 - 点亮一颗LED