このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
ESP32とArduino IDEを使ったワイヤレスネットワーク信号強度
この例では、ESP32 のワイヤレス ネットワーク機能を使用して ThingSpeak ™ にデータを投稿する方法を示します。ESP32 は、接続されているワイヤレス ネットワークの信号強度を記録して送信します。ボード上のボタンを押すと、ワイヤレス ネットワークの信号強度を 3 回測定し、平均結果を ThingSpeakチャネルに投稿します。デバイスはカウンター値も送信するので、測定値を追跡できます。
ワイヤレス信号強度を表すヒートマップ オーバーレイ イメージを生成できます。この画像は、オフィスのフロアプランに重ね合わせた無線信号強度と、ヒートマップを生成するために使用されたデータを示しています。ヒートマップ オーバーレイを生成するには、「ヒートマップ オーバーレイ イメージの作成」を参照してください。
前提条件
ESP32 Arduino コアと IDE のセットアップ
まず、Arduino Core を ESP32 用にセットアップします。手順については、Arduino Core for ESP32 のインストール手順を参照してください。File > Examples > 01.Basics にある「Blink」サンプルスケッチを使用して、ESP32 上で Arduino® セットアップをテストできます。オンボード LED を使用するには、LED_BUILTIN
ピンをピン 5 として定義します。
ThingSpeak セットアップ
ThingSpeak を使用するには、ユーザー アカウントと作成されたチャネルが必要です。各チャネルには、最大 8 つのデータ フィールド、3 つの場所フィールド、および 1 つのステータス フィールドがあります。無料アカウントをお持ちの場合は、15秒ごとにThingSpeakにデータを送信できます。
1) ThingSpeak にサインアップ に示されているように、新しいアカウントにサインアップします。
2) [Channels] > [My Channels] > [New Channel] を選択してチャネルを作成します。
3) フィールド 1 とフィールド 2 を有効にします。
4) フィールド 1 の名前として RSSI
を入力し、フィールド 2 の名前として Counter
を入力します。
5)チャネルに名前を付けます。たとえば、ESP32 Signal Strength
のようにします。
6)チャネルを保存します。
7) API キー タブの書き込み API キーをメモします。
回路図と接続
この例を完了するには、Sparkfun が提供する ESP32 開発キットに組み込まれているデバイスのみが必要です。ただし、ポータブルなマイクロ USB 対応バッテリーを使用すると、デバイスを持ち運びやすくなり、測定が容易になります。
ESP32をプログラムする
Arduino IDE を使用して、デバイス用のアプリケーションを作成します。
1) マイクロ USB ケーブルを使用して ESP32 をコンピューターに接続し、正常に接続されるまで待ちます。
2) Arduino IDE で、ESP32 開発モジュール ボードと正しい 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
機能を使用してデバイスをワイヤレス ネットワークに接続します。ネットワークに正常に接続すると、デバイスが素早く 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); } }