使用 Arduino IDE 测量 ESP32 的无线网络信号强度
此示例展示如何使用 ESP32 的无线网络函数功能将数据发布到 ThingSpeak™。ESP32 记录并发布其所连接的无线网络的信号强度。按下板上的按钮,对无线网络信号强度进行三次测量,并将平均结果发布到 ThingSpeak 通道。该设备还会发布计数器值,以便您可以跟踪测量值。
您可以生成热图叠加图像来表示无线信号强度。该图显示了办公室平面图上叠加的无线信号强度和用于生成热图的数据。要生成热图叠加层,请参阅创建热图叠加层图像。


前提条件
ESP32 Arduino 核心和 IDE 设置
首先,为 ESP32 设置您的 Arduino Core。有关说明,请参阅 ESP32 的 Arduino Core 安装说明。您可以使用 File > Examples > 01.Basics 中的 "Blink" 示例草图在 ESP32 上测试您的 Arduino® 设置。将 LED_BUILTIN 引脚定义为引脚 5 以使用板载 LED。
ThingSpeak 设置
要使用 ThingSpeak,您必须拥有一个用户帐户和一个创建的通道。每个通道最多有八个数据字段、三个位置字段和一个状态字段。如果您有一个免费帐户,您可以每 15 秒向 ThingSpeak 发送一次数据。
1) 按照注册 ThingSpeak 所示注册新账户。
2) 通过选择 Channels > My Channels > New Channel 来创建通道。
3) 启用字段 1 和字段 2。
4)输入 RSSI 作为字段 1 名称,输入 Counter 作为字段 2 名称。
5) 命名通道。例如,ESP32 Signal Strength。
6) 保存您的通道。
7)注意在 API Keys 选项卡上写入 API 密钥。
原理图和连接
要完成此示例,您只需要 Sparkfun 提供的 ESP32 开发套件内置的设备。但是,使用便携式微型 USB 兼容电池可以让您的设备更加便携,从而更轻松地进行测量。

对 ESP32 进行编程
使用 Arduino IDE 为您的设备创建应用程序。
1) 使用 micro-USB 线将 ESP32 连接到计算机,并等待连接成功。
2) 在 Arduino IDE 中选择 ESP32 Dev Module 板和正确的 COM 端口。
3) 创建应用程序。在 Arduino IDE 中打开一个新窗口并保存文件。添加代码部分提供的代码。编辑您的通道的无线网络 SSID、密码和写入 API 密钥。
为了使结果可视化,您可以使用 ThingSpeak 的无线网络强度来生成办公室地图的叠加图像。由于简化的硬件仅记录信号强度,因此您必须手动记录每个点的坐标。您可以使用大多数图形编辑程序来查找图像上的像素坐标。有关生成热图的详细信息,请参阅创建热图覆盖图像。
代码
1) 首先定义库、定义和全局变量。输入您的无线网络 SSID 和密码以及您的通道的写入 API 密钥。
#include <WiFi.h> #define buttonPin 0 #define LEDPin 5 // Network information char* ssid = "WIFINAME"; const char* password = "PPPPPPPPP"; // ThingSpeak settings char server[] = "api.thingspeak.com"; String writeAPIKey = "XXXXXXXXXXXXXXXX"; // Constants const unsigned long postingInterval = 15L * 1000L; // Global variables unsigned long lastConnectionTime = 0; int measurementNumber = 0;
2) 在设置中,启动串行输出,初始化输入和输出引脚,并连接到无线网络。
void setup(){
Serial.begin(115200);
pinMode(buttonPin,INPUT);
pinMode(LEDPin, OUTPUT);
connectWiFi();
}
3) 在主循环中,首先确保存在无线连接,然后检查是否按下按钮。如果按下按钮,请检查是否已经过足够的时间来发布数据。检测到按钮按下后测量无线网络强度,然后调用 HTTP 发布函数。
void loop(){
const int numberPoints = 7;
float wifiStrength;
// In each loop, make sure there is an Internet connection.
if (WiFi.status() != WL_CONNECTED) {
connectWiFi();
}
// If a button press is detected, write the data to ThingSpeak.
if (digitalRead(buttonPin) == LOW){
if (millis() - lastConnectionTime > postingInterval) {
blinkX(2,250); // Verify the button press.
wifiStrength = getStrength(numberPoints);
httpRequest(wifiStrength, measurementNumber);
blinkX(measurementNumber,200); // Verify that the httpRequest is complete.
measurementNumber++;
}
}
}
4) 使用 connectWiFi 函数将您的设备连接到无线网络。成功连接网络后,设备快速闪烁五次。
void connectWiFi(){
while (WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, password);
delay(3000);
}
// Display a notification that the connection is successful.
Serial.println("Connected");
blinkX(5,50);
}
5) 连接到 ThingSpeak 服务器并使用 httpRequest 函数构建 HTTP POST 命令的数据字符串。
void httpRequest(float field1Data, int field2Data) {
WiFiClient client;
if (!client.connect(server, 80)){
Serial.println("Connection failed");
lastConnectionTime = millis();
client.stop();
return;
}
else{
// Create data string to send to ThingSpeak.
String data = "field1=" + String(field1Data) + "&field2=" + String(field2Data); //shows how to include additional field data in http post
// POST data to ThingSpeak.
if (client.connect(server, 80)) {
client.println("POST /update HTTP/1.1");
client.println("Host: api.thingspeak.com");
client.println("Connection: close");
client.println("User-Agent: ESP32WiFi/1.1");
client.println("X-THINGSPEAKAPIKEY: "+writeAPIKey);
client.println("Content-Type: application/x-www-form-urlencoded");
client.print("Content-Length: ");
client.print(data.length());
client.print("\n\n");
client.print(data);
Serial.println("RSSI = " + String(field1Data));
lastConnectionTime = millis();
delay(250);
}
}
client.stop();
}
6) 进行几次测量并使用 getStrength 将平均值返回到主循环。
// Take measurements of the Wi-Fi strength and return the average result.
int getStrength(int points){
long rssi = 0;
long averageRSSI = 0;
for (int i=0;i < points;i++){
rssi += WiFi.RSSI();
delay(20);
}
averageRSSI = rssi/points;
return averageRSSI;
}
7)最后,使用 blinkX 函数使设备 LED 闪烁。当电路板未通过 USB 连接到计算机时,闪烁可允许电路板与您通信。
// Make the LED blink a variable number of times with a variable delay.
void blinkX(int numTimes, int delayTime){
for (int g=0;g < numTimes;g++){
// Turn the LED on and wait.
digitalWrite(LEDPin, HIGH);
delay(delayTime);
// Turn the LED off and wait.
digitalWrite(LEDPin, LOW);
delay(delayTime);
}
}