ESP32 的 WIFI 功能是模块内置的,通过 ESP32 的基础库调用一些函数就可以轻松使用它。
Wifi STA 模式:
让 ESP32 连接附近 WIFI,可以上网访问数据。
// 代码显示搜索连接附近指定的 WIFI
// 通过 pin 按键可断开连接#include <WiFi.h>
#include <Arduino.h>const char* ssd = "么么";
const char* pasd= "yaoqiao321";const byte LED = 2;
const byte PIN = 4;void setup()
{Serial.begin(115200);pinMode(PIN, INPUT_PULLUP);pinMode(LED, OUTPUT);digitalWrite(LED, LOW);Serial.print("[WiFi] 开始连接:");Serial.println(ssd);WiFi.begin(ssd, pasd);for(uint8_t i=0; i<20; i++){switch(WiFi.status()) // 检查 WiFi 连接状态{case WL_NO_SSID_AVAIL:{Serial.println("[WiFi] 没有找到 SSID");break;}case WL_SCAN_COMPLETED:{Serial.println("[WiFi] 扫描完成");break;}case WL_CONNECTED:{Serial.println("[WiFi] 已连接!");Serial.print("[WiFi] IP 地址:");Serial.println(WiFi.localIP());i = 21;break;}case WL_CONNECT_FAILED:{Serial.print("[WiFi] 失败 - 未连接! ");return;}case WL_CONNECTION_LOST:{Serial.println("[WiFi] 连接丢失");break;}case WL_DISCONNECTED:{Serial.println("[WiFi] 连接已断开");break;}default:{Serial.print("[WiFi] WiFi 状态:");Serial.println(WiFi.status());break;}}delay(1000);if(i == 20){Serial.print("[WiFi] 连接失败!");WiFi.disconnect(); // 断开连接return;}}digitalWrite(LED, HIGH);
}void loop()
{if (digitalRead(PIN) == LOW){Serial.println("[WiFi] 正在断开连接!");if(WiFi.disconnect(true, false)){Serial.println("[WiFi] 已断开连接");}delay(1000);}
}
官方 API:
// 代码连接 WIFI 访问 NTP 服务器时间#include <Arduino.h>
#include <WiFi.h>const char* ssd = "vivo X80";
const char* pasd= "YQY1122334455";
const char* ntp_server = "ntp.aliyun.com"; // NTP 服务器
const int gmt_offset = 8 * 60 * 60; // UTC/GMT+8,东 8 时区偏移量,单位秒
const int daylight_offset = 0; // 夏令时偏移值,单位秒const byte LED = 2;void setup()
{pinMode(LED, OUTPUT);digitalWrite(LED, LOW);Serial.begin(115200);// 设置时区setenv("TZ", "CST-8", 1); // TZ 是时区环境变量,CST-8 是中国标准时间,1 表示覆盖旧值tzset(); // 作用时区变量Serial.print("[WiFi] 开始连接:");Serial.println(ssd);WiFi.begin(ssd, pasd);while (WiFi.status() != WL_CONNECTED){Serial.println("[WiFi] 正在尝试连接...");delay(1000);}Serial.println("[WiFi] 连接成功");// 同步时间configTime(gmt_offset, daylight_offset, ntp_server);Serial.println("完成时间同步");digitalWrite(LED, HIGH);
}void loop()
{time_t now = 0;struct tm time_info;char strftime_buf[64] = {'\0'};time(&now);localtime_r(&now, &time_info);strftime(strftime_buf, sizeof(strftime_buf), "%Y.%m.%d %A %T", &time_info);Serial.println(strftime_buf);delay(1000);
}
Wifi AP 模式:
ESP32会自建一个WIFI热点,其他设备可以加入这个热点进行数据交换,类似局域网,不可联网。
开启 AP 模式:
/*** 设置一个接入点 AP* @param ssid WiFi 名称 SSID(最多 63 字符)* @param passphrase WiFi 密码(WPA2 密码最少 8 位),不设置默认为开放性网络* @param channel WiFi 信道号(1 - 13),最好区分开环境中其他网络,避免信号干扰* @param ssid_hidden 隐藏信号 (0 = 开放网络, 1 = 隐藏网络,需要指定查找)* @param max_connection 最大连接数(1 - 4),默认 4
*/
bool WiFiAPClass::softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden, int max_connection, bool ftm_responder)
配置 IP(不是必须的):
/*** 配置接入点* @param local_ip WIFI IP* @param gateway 网关* @param subnet 子网掩码*/
bool WiFiAPClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dhcp_lease_start)
关闭 AP 模式:
/*** 断开网络连接 (关闭 AP)* @param wifioff disable mode?* @return one value of wl_status_t enum*/
bool WiFiAPClass::softAPdisconnect(bool wifioff)
#include <Arduino.h>
#include <WiFi.h>WiFiAPClass WiFiAP;const char* ssd = "ESP32_Wifi";
const char* pasd = "12345678";IPAddress local_IP(192, 168, 1, 1);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);void setup()
{Serial.begin(115200);WiFi.softAPConfig(local_IP, gateway, subnet); // 配置 本地IP 网关IP 子网掩码WiFi.softAP(ssd, pasd); // AP 模式,创建一个 ESP32_Wifi 热点
}void loop()
{delay(2000);Serial.print("本地 IP: ");Serial.println(WiFi.softAPIP());Serial.print("广播 IP: ");Serial.println(WiFi.softAPBroadcastIP());Serial.print("接入网络 ID: ");Serial.println(WiFi.softAPNetworkID());Serial.print("子网掩码: ");Serial.println(WiFi.softAPSubnetCIDR());Serial.print("主机名: ");Serial.println(WiFi.softAPgetHostname());Serial.print("热点 MAC: ");Serial.println(WiFi.softAPmacAddress());Serial.print("连接客户端: ");Serial.println(WiFi.softAPgetStationNum());
}
连接附近指定 WIFI:
#include <Arduino.h>
#include <WiFi.h>void setup()
{Serial.begin(115200);int num = WiFi.scanNetworks();Serial.print("可用WIFI数:");Serial.println(num);Serial.println("WIFI信息如下:");for(int a=0; a<=num; a++)Serial.println(WiFi.SSID(a));Serial.println("输入 WIFI 和密码:");
}void loop()
{while(Serial.available()>0){String SD = Serial.readStringUntil(','); // 读取","以前的字符串const char* ssd = SD.c_str(); // String 转换 char*delay(100);String PSD = Serial.readStringUntil('\0'); // 读取"\0"以前的字符串const char* pasd = PSD.c_str();delay(1000);Serial.print("WIFI:");Serial.println(SD);Serial.print("PSD:");Serial.println(PSD);WiFi.begin(ssd,pasd);while(WiFi.status() != WL_CONNECTED){delay(500);Serial.print(".");}Serial.println("connected success!");Serial.print("IP:");Serial.println(WiFi.localIP());}
}