Main Content

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

ESP32とArduino IDEを使用したワイヤレスネットワーク信号強度

この例では、ESP32 のワイヤレス ネットワーク機能を使用してデータをThingSpeak™に投稿する方法を示します。ESP32 は、接続されているワイヤレス ネットワークの信号強度を記録して通知します。ボード上のボタンを押して、ワイヤレス ネットワーク信号強度を 3 回測定し、平均結果をThingSpeakチャネルに送信します。また、測定値を追跡できるように、デバイスがカウンター値をポストします。

ワイヤレス信号強度を表すヒートマップ オーバーレイ イメージを生成できます。この画像は、オフィスのフロアプランとヒートマップの生成に使用されたデータに重ねられたワイヤレス信号強度を示しています。ヒートマップ オーバーレイを生成するには、 Create Heatmap Overlay Imageを参照してください。

≪前提条件≫

«ESP32 Arduino コアと IDE のセットアップ»

まず、Arduino Core を ESP32 用にセットアップします。手順については、 「Installation Instructions for Arduino Core for ESP32」を参照してください。«File» > «Examples» > «01.Basics» にある「Blink」サンプル スケッチを使用して、ESP32 で Arduino® セットアップをテストできます。オンボード LED を使用するには、LED_BUILTINピンをピン 5 として定義します。

«ThingSpeakのセットアップ»

ThingSpeakを使用するには、ユーザー アカウントと作成されたチャネルが必要です。各チャネルには、最大 8 つのデータ フィールド、3 つの位置フィールド、およびステータス フィールドがあります。無料アカウントをお持ちの場合は、15 秒ごとにデータをThingSpeakに送信できます。

1) Sign up for ThingSpeakに示すように、新しいアカウントにサインアップします。

2) [チャネル] > [マイチャネル] > [新しいチャネル] を選択してチャネルを作成します。

3) フィールド 1 とフィールド 2 を有効にします。

4) フィールド 1 の名前としてRSSIを入力し、フィールド 2 の名前としてCounterを入力します。

5)チャネルに名前を付けます。たとえば、 ESP32 Signal Strengthなどです。

6)チャネルを保存します。

7) 「API キー」タブの書き込み API キーをメモします。

«回路図と接続»

この例を完了するには、Sparkfun が提供する ESP32 開発キットに組み込まれているデバイスのみが必要です。ただし、ポータブル micro-USB 互換バッテリーを使用すると、デバイスを持ち運びできるようになり、測定が容易になります。

「ESP32をプログラムする」

Arduino IDE を使用して、デバイス用のアプリケーションを作成します。

1) マイクロ 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関数を使用してデバイスをワイヤレス ネットワークに接続します。ネットワークに正常に接続すると、デバイスがすばやく 5 回点滅します。

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

参考

|