Main Content

本页采用了机器翻译。点击此处可查看最新英文版本。

带有 Arduino IDE 的 ESP32 无线网络信号强度

此示例展示了如何使用 ESP32 的无线网络功能将数据发布到 ThingSpeak™。ESP32 记录并发布其所连接的无线网络的信号强度。按下板上的按钮即可测量无线网络信号强度的三个测量值,并将平均结果发布到 ThingSpeak通道。该设备还会发布一个计数器值,以便您可以跟踪测量结果。

您可以生成热图叠加图像来表示无线信号强度。此图显示了在办公室平面图和用于生成热图的数据上叠加的无线信号强度。要生成热图叠加层,请参阅 Create Heatmap Overlay Image

先决条件

ESP32 Arduino 核心和 IDE 设置

首先,为 ESP32 设置 Arduino Core。有关说明,请参阅 Installation Instructions for Arduino Core for ESP32。您可以使用“文件”中的“Blink”示例代码在 ESP32 上测试您的 Arduino® 设置>“ 例子 ”> 01. 基础知识 .将 LED_BUILTIN 引脚定义为引脚 5 以使用板载 LED。

ThingSpeak 设置

要使用ThingSpeak,您必须拥有一个用户帐户和一个已创建的通道。每个通道最多有八个数据字段、三个位置字段和一个状态字段。如果您有免费帐户,则可以每 15 秒向 ThingSpeak 发送一次数据。

1) 注册新帐户,如Sign up for ThingSpeak所示。

2) 通过选择“通道”创建通道> 我的通道 > “新通道”。

3) 启用字段 1 和字段 2。

4) 输入 RSSI 作为字段 1 名称,输入 Counter 作为字段 2 名称。

5) 为通道命名。示例,ESP32 Signal Strength

6) 保存您的通道。

7) 请注意“API 密钥”选项卡上的写入 API 密钥。

原理图和连接

要完成此示例,您只需要 Sparkfun 提供的 ESP32 开发套件中内置的设备。然而,使用便携式微型 USB 兼容电池可以使您的设备便于携带,以便于测量。

对 ESP32 进行编程

使用 Arduino IDE 为您的设备创建应用。

1) 使用 micro-USB 线将 ESP32 连接到电脑,等待连接成功。

2) 在Arduino IDE中选择ESP32开发模块板和正确的COM端口。

3) 创建应用。在 Arduino IDE 中打开一个新窗口并保存文件。添加代码部分中提供的代码。编辑您的通道的无线网络 SSID、密码和写入 API 密钥。

为了可视化结果,您可以利用 ThingSpeak 的无线网络优势来生成办公室地图的叠加图像。由于简化的硬件仅记录信号强度,因此您必须手动记录每个点的坐标。您可以使用大多数图形编辑程序来查找图像上的像素坐标。有关生成热图的详细信息,请参阅 Create Heatmap Overlay Image

代码

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);
        
    }
}

另请参阅

|