问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ESP32 WiFi配网教程:两种配网方法详解及代码示例

创作时间:
作者:
@小白创作中心

ESP32 WiFi配网教程:两种配网方法详解及代码示例

引用
CSDN
1.
https://blog.csdn.net/weixin_44736441/article/details/143259156

本文将介绍ESP32的WiFi配网方法,包括固定账号密码和手机智能配网两种方式。文章详细描述了每种方法的具体实现步骤,并提供了相应的代码示例。此外,文章还讨论了官方示例代码的局限性,并给出了改进方案,增加了按键控制重新配网的功能。最后,文章还介绍了如何使用I2C地址扫描示例来查找OLED模块的地址。

前言

从本节开始介绍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() {
  // 在此处可以添加其他代码
}

拓展

各位有兴趣也可以将上述配网信息显示在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");
  }
}

找到地址后会在串口中显示。

结束

以上就是配网的基本教程。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号