在物联网开发中,ESP8266是一款非常受欢迎的微控制器,因其低功耗、高性能和内置Wi-Fi功能而备受青睐。通过ESP8266实现Wi-Fi信号扫描并显示附近热点列表是一项基础但实用的功能。本文将详细介绍如何使用ESP8266进行Wi-Fi信号扫描,并通过串口或显示屏展示扫描到的热点信息。
ESP8266通过其Wi-Fi模块可以主动搜索周围的Wi-Fi热点。扫描过程分为两种模式:
ESP8266的Arduino库提供了简单的API来执行Wi-Fi扫描任务,开发者无需深入了解底层协议细节。
确保已安装最新版本的Arduino IDE,并添加ESP8266支持:
文件 -> 首选项
。https://arduino.esp8266.com/stable/package_esp8266com_index.json
工具 -> 开发板 -> 开发板管理器
,搜索并安装esp8266
。选择正确的开发板型号(如NodeMCU 1.0)、端口和上传速度。
以下代码展示了如何使用ESP8266扫描附近的Wi-Fi热点,并通过串口输出结果。
#include <ESP8266WiFi.h>
void setup() {
Serial.begin(115200); // 初始化串口通信
WiFi.mode(WIFI_STA); // 设置为Station模式
delay(100);
Serial.println("Starting Wi-Fi scan...");
int numberOfNetworks = WiFi.scanNetworks(); // 执行Wi-Fi扫描
if (numberOfNetworks == 0) {
Serial.println("No networks found.");
} else {
Serial.print("Found "); Serial.print(numberOfNetworks); Serial.println(" networks:");
for (int i = 0; i < numberOfNetworks; ++i) {
// 输出SSID、信号强度和加密类型
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i)); // SSID
Serial.print(" (");
Serial.print(WiFi.RSSI(i)); // 信号强度
Serial.print(" dBm)");
Serial.print(" [");
Serial.print((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? "Open" : "Encrypted");
Serial.println("]");
}
}
Serial.println("Scan complete.");
}
void loop() {
// 扫描完成后无需重复操作
}
WiFi.mode(WIFI_STA)
确保ESP8266处于Station模式。WiFi.scanNetworks()
方法获取周围热点数量。运行上述代码后,打开串口监视器,可以看到类似以下输出:
Starting Wi-Fi scan...
Found 5 networks:
1: MyHomeNetwork ( -52 dBm) [Encrypted]
2: GuestNetwork ( -60 dBm) [Encrypted]
3: NeighborSSID ( -70 dBm) [Encrypted]
4: FreePublicWiFi ( -65 dBm) [Open]
5: TestNetwork ( -75 dBm) [Encrypted]
Scan complete.
如果希望将热点信息显示在OLED屏幕上,可以引入Adafruit_SSD1306
库。以下是扩展代码示例:
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
delay(100);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("Display initialization failed!");
while (true) {}
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Scanning...");
display.display();
int numberOfNetworks = WiFi.scanNetworks();
if (numberOfNetworks == 0) {
display.clearDisplay();
display.println("No networks found.");
display.display();
} else {
display.clearDisplay();
display.println("Found Networks:");
for (int i = 0; i < numberOfNetworks && i < 5; ++i) { // 显示前5个网络
display.print(i + 1);
display.print(": ");
display.println(WiFi.SSID(i));
}
display.display();
}
}
void loop() {}
0x3C
或0x3D
,需根据实际硬件调整。以下为Wi-Fi扫描流程图:
flowchart TD A[开始] --> B[初始化串口和Wi-Fi模块] B --> C{是否找到热点} C --是--> D[获取热点信息(SSID、RSSI、加密类型)] C --否--> E[显示"未找到网络"] D --> F[显示热点信息] F --> G[结束]