このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
Arduino の ESP32 によるワイヤレス ネットワークの信号強度
この例では、ESP32 のワイヤレス ネットワーク機能と、それを使用して ThingSpeak™ にデータをポストする方法を説明します。ESP32 は、接続先ネットワークのワイヤレス ネットワークの信号強度を記録し、ポストします。ボード上のボタンを押すと、ワイヤレス ネットワークの信号強度の測定が 3 回行われ、平均の結果が ThingSpeak チャネルにポストされます。また、測定値を追跡できるように、デバイスがカウンター値をポストします。
信号強度が、オフィス ビルにあるいくつかのオフィスについて測定されました。ThingSpeak (ヒートマップのオーバーレイ イメージの作成) で利用可能なツールを使用して、ワイヤレス ネットワークの強度がオフィス マップに重ね合わされています。中央のイメージは、ポータブル版の信号強度測定用のプロトタイプを示しています。右のイメージは The MathWorks® オフィスの ThingSpeak のデータを示しています。
|
|
|
前提条件
ESP32 Arduino コアと IDE の設定
Arduino Core for ESP32 のインストール手順を参照してください。ESP32 での Arduino® の設定は、[ファイル]、[スケッチ例]、[01.Basics] にある "Blink" の例のスケッチを使用してテストできます。ボード上の LED を使用するには、LED_BUILTIN ピンを必ずピン 5 として定義してください。
ThingSpeak の設定
ThingSpeak にはユーザー アカウントとチャネルが必要です。各チャネルには、最大で 8 つのデータ フィールド、位置フィールド、およびステータス フィールドがあります。無料アカウント所有者は、15 秒ごとにデータを ThingSpeak に送信できます。
新しいアカウントを新規登録します。
[Channels]、[My Channels]、[New Channel] を選択して、チャネルを作成します。
Field 1 と Field 2 を有効にします。
[Field 1] の名前に
RSSI
、[Field 2] にCounter
と入力します。チャネルに名前を付けます。たとえば、
ESP32 Signal Strength
とします。[Save] をクリックして、チャネルを保存します。
[API Keys] タブの [Write API Key] を書き留めます。
回路図と接続
この例で必要なのは、Sparkfun が提供する ESP32 開発キットに組み込まれているデバイスのみです。ポータブル microUSB 互換バッテリーを使用すると、デバイスを持ち運べるようになるため、測定が容易になります。
ESP32 のプログラミング
Arduino IDE を使用して、デバイス用のアプリケーションを作成します。
microUSB ケーブルを使用して ESP32 をコンピューターに接続し、正常に接続されるのを待ちます。
Arduino IDE で、[ESP32 Dev Module] ボードと適切な COM ポートを選択します。
アプリケーションを作成します。Arduino IDE で新しいウィンドウを開き、ファイルを保存します。ここに提供されたコードを追加します。ワイヤレス ネットワークの SSID、パスワード、およびチャネルの Write API キーを編集します。
ThingSpeak により、ワイヤレス ネットワークの強度を示すオフィス マップのオーバーレイ イメージを生成できます。この単純化されたハードウェアでは信号強度のみが記録されるため、各点の座標は手動で記録しなければなりません。イメージ上のピクセル座標の確認には、ほとんどのグラフィックス編集プログラムを使用できます。ヒートマップを生成するには、ヒートマップのオーバーレイ イメージの作成を参照してください。
ライブラリ、定義、およびグローバル変数から開始します。ワイヤレス ネットワークの SSID とパスワード、およびチャネルの Write 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;
setup において、シリアル出力を開始し、入力および出力ピンを初期化して、ワイヤレス ネットワークに接続します。
void setup(){ Serial.begin(115200); pinMode(buttonPin,INPUT); pinMode(LEDPin, OUTPUT); connectWiFi(); } }
メイン ループで、ワイヤレス接続があることをまず確認し、次にボタンが押されているかどうかをチェックします。ボタンが押されている場合は、データをポストするために十分な時間が経過したかどうかをチェックします。経過している場合は、ワイヤレス ネットワークの強度を測定し、HTTP のポスト関数を呼び出します。
void loop(){ const int numberPoints = 7; float wifiStrength; // In each loop, make sure there is always 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++; } } }
関数 connectWiFi を使用して、デバイスをワイヤレス ネットワークに接続します。接続が完了すると、デバイスが速い間隔で 5 回点滅します。
void connectWiFi(){ while (WiFi.status() != WL_CONNECTED){ WiFi.begin(ssid, password); delay(3000); } // Show the user a connection is successful. Serial.println("Connected"); blinkX(5,50); }
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(); } } client.stop(); }
複数の測定値を取得し、getStrength を使ってメイン ループに平均値を返します。
// Take a number of measurements of the WiFi 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; }
最後に、関数 blinkX を使用してデバイスの LED を点滅させます。ボードが USB 経由でコンピューターに接続されていない場合でも、この点滅によってボードと交信できます。
// Flash the LED 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); } }