- 前提条件
- 必要な材料
- ハードウェア
- サーバーのBluetoothアドレス(フィットネスバンドのアドレス)を取得します
- サーバーのサービスと特性UUIDの取得
- 近接スイッチアプリケーションのクライアントとして機能するようにESP32をプログラミングする
- 作業とテスト
家に入るとすぐに自動的にライトをオンにし、家を出るときに再びオフにするのは、なんてクールなことでしょう。はい、簡単なアプリケーションでこれを行うことができます。このプロジェクトでは、ESP32をBLEクライアントとして使用し、フィットネスバンドをBLEサーバーとして使用するため、フィットネスバンドを装着している人がESP32 Bluetoothの範囲に入ると、ESP32がそれを検出してライトをオンにします。BLEサーバー機能を備えたBluetoothデバイスは、ESP32を使用して家電製品を制御するためのトリガーデバイスとして使用できます。
ESP32モジュールのBLE(Bluetooth Low Energy)機能についてはすでに説明しましたが、非常に興奮しています。要約すると、このモジュールにはクラシックBluetoothとBluetooth Low Energy(BLE)の両方があり、クラシックBluetoothを使用して曲やファイルを転送でき、BLEオプションは、Bluetoothビーコン、フィットネスバンド、近接などのバッテリー最適化アプリケーションに使用できます。 、など。単純なマイクロシステムプロジェクトのHC-05またはHC-06モジュールのようなシリアルBluetoothとして使用することもできます。
ご存知のように、ESP32BLEは2つの異なるモードで動作できます。 1つは、GATTサービスを利用してバッテリーレベルインジケーターサービスを模倣することですでに説明したサーバーモードです。その演習では、ESP32がサーバーとして機能し、携帯電話がクライアントとして機能しました。それでは、ESP32をクライアントとして操作し、フィットネスバンドなどの他のBLEサーバーに接続してみましょう。
私のフィットネスバンドを含むすべてのBLEサーバーは、常に広告モードになっています。つまり、クライアントがスキャンしたときにいつでも検出できます。この機能を活用することで、これらのフィットネスバンドを近接スイッチとして使用できます。つまり、これらのフィットネスバンドは常にユーザーの手に関連付けられており、バンドをスキャンすることで、人が範囲内にいるかどうかを検出できます。これはまさにこの記事でやろうとしていることです。ESP32をBLEクライアントとして機能するようにプログラムし、 BLEデバイスを常にスキャンし続けます。範囲内にフィットネスバンドが見つかった場合は、それに接続してみます。接続が成功した場合は、ESP32のGPIOピンの1つを切り替えることで電球をトリガーできます。各BLEサーバーが信頼できる方法です。(フィットネスバンド)には一意のハードウェアIDがあるため、2つのBLEサーバーデバイスが同一になることはありません。面白いですね!さあ、構築しましょう
前提条件
この記事では、ESP32チュートリアルの開始にフォールバックしない場合でも、ArduinoIDEでESP32ボードを使用する方法に既に精通していることを前提としています。
理解しやすいように、完全なESP32Bluetoothを3つのセグメントに分割しました 。したがって、このチュートリアルを開始する前に、最初の2つのチュートリアルを実行することをお勧めします。
- 携帯電話からLEDを切り替えるESP32のシリアルBluetooth
- GATTサービスを使用してバッテリーレベルデータを携帯電話に送信するBLEサーバー
- BLEデバイスをスキャンしてビーコンとして機能するBLEクライアント。
最初の2つのチュートリアルについてはすでに説明しましたが、ここでは、BLEクライアントとしてのESP32について説明する最後のチュートリアルに進みます。
必要な材料
- ESP32開発ボード
- AC負荷(ランプ)
- リレーモジュール
ハードウェア
このESP32BLEクライアントプロジェクトのハードウェアは、ほとんどの魔法がコード内で発生するため、非常に単純です。ESP32は、Bluetooth信号が検出または失われたときに、ACランプ(ロード)を切り替える必要があります。この負荷を切り替えるには、リレーを使用します。ESP32のGPIOピンは3.3Vとしか互換性がないため、3.3Vで駆動できるリレーモジュールが必要です。BC548の場合は、リレーモジュールで使用されているトランジスタを確認してください。それ以外の場合は、以下の回路図に従って独自の回路を構築してください。
警告:回路は直接220VAC主電源電圧を扱います。活線に注意し、短絡を起こさないように注意してください。あなたは警告されました。
BC547または2N2222ではなくBC548を使用する理由は、ベース-エミッタ間電圧が低く、わずか3.3Vでトリガーできるためです。ここで使用するリレーは5Vのリレーである私たちは、5V電源ケーブルを形成し得るVINピンとそれに電力を供給して、。グランドピンは回路のグランドに接続されています。抵抗R1 1Kは、ベース電流制限抵抗器として使用されます。相線はリレーのNOピンに接続され、リレーの共通ピンは負荷に接続され、負荷のもう一方の端はニュートラルに接続されます。フェーズとニュートラルの位置を入れ替えることはできますが、直接ショートさせないように注意してください。電流は常に負荷(電球)を通過する必要があります。私は物事を単純にするためにリレーモジュールを使用しました、そしてここの負荷はフォーカスLEDランプです。私のセットアップは以下のようになります
今のところハードウェアをスキップしたい場合は、GPIO13ピンの代わりにGPIO2ピンを使用して、ESP32のオンボードLEDを切り替えることができます。この方法は初心者におすすめです。
サーバーのBluetoothアドレス(フィットネスバンドのアドレス)を取得します
前に述べたように、クライアントとして機能するようにESP32をプログラムし(電話と同様)、私のフィットネスバンドであるサーバー(Lenovo HW-01)に接続します。クライアントがサーバーに接続するには、サーバーのBluetoothアドレスを知っている必要があります。ここにある私のフィットネスバンドのようなすべてのBluetoothサーバーには、永続的な独自のBluetoothアドレスがあります。これをラップトップまたは携帯電話のMACアドレスに関連付けることができます。
サーバーからこのアドレスを取得するには、前のチュートリアルですでに使用した北欧の半導体からnRF接続と呼ばれるアプリケーションを使用します。iOSとAndroidの両方のユーザーが無料で利用できます。アプリケーションをダウンロードして起動し、近くのBluetoothデバイスをスキャンするだけです。アプリケーションは、検出したすべてのBLEデバイスを一覧表示します。鉱山の名前はHW-01で、その名前の下を見ると、サーバーのハードウェアアドレスが次のように表示されます。
したがって、私のフィットネスバンドのESP32 BLEハードウェアアドレスはC7:F0:69:F0:68:81であり、同じ形式の異なる番号のセットがあります。ESP32をプログラムするときに必要になるので、メモしておいてください。
サーバーのサービスと特性UUIDの取得
さて、BLEアドレスを使用してサーバーを識別しましたが、サーバーと通信するには、サービスの言語と特性を話す必要があります。これは、前のチュートリアルを読んだ場合に理解できます。このチュートリアルでは、サーバーの書き込み特性(フィットネスバンド)を使用してペアリングしています。したがって、デバイスとペアリングするには、同じアプリケーションで再度取得できるサービス広告特性UUIDが必要です。
アプリケーションの接続ボタンをクリックして、いくつかの書き込み特性を検索するだけです。アプリケーションには、サービスUUIDと特性UUIDが表示されます。鉱山は以下に示されています
ここで、私のサービスUUIDと特性UUIDは同じですが、同じである必要はありません。サーバーのUUIDを書き留めます。鉱山はとして書き留められました
サービスUUID: 0000fee7-0000-1000-8000-00805f9b34fb 特性UUID:0000fee7-0000-1000-8000-00805f9b34fb
書き込み特性の使用は必須ではありません。アプリケーションに表示されているサーバーの有効なサービスと特性UUIDを使用できます。
近接スイッチアプリケーションのクライアントとして機能するようにESP32をプログラミングする
このプログラムのアイデアは、ESP32をクライアントとして機能させ、サーバー(フィットネスバンド)が見つかるとBluetoothデバイスをスキャンし続け、ハードウェアIDを確認し、GPIOピン13を介してライトを切り替えることです。 !ですが、それには1つの問題があります。すべてのBLEサーバーの範囲は10メートルで、少し大きすぎます。したがって、ドアを開けるライトをオンにする近接スイッチを作成しようとしている場合、この範囲は非常に高くなります。
BLEサーバーの範囲を縮小するために、ペアリングオプションを使用できます。 BLEサーバーとクライアントは、両方が3〜4メートルの距離内にある場合にのみペアリングされたままになります。それは私たちのアプリケーションに最適です。そのため、ESP32を作成して、BLEサーバーを検出するだけでなく、それに接続して、ペアリングされたままかどうかを確認します。 ペアリングされている限り、ACランプは点灯したままになり、範囲を超えるとペアリングが失われ、ランプがオフになります。同じことを行うための完全なESP32BLEサンプルプログラムは、このページの最後にあります。以下では、コードを小さなスニペットに分割して説明してみます。
ヘッダーファイルをインクルードした後、上記の見出しで説明したように、nRF接続アプリケーションを介して取得したBLEアドレス、サービス、および特性UUIDについてESP32に通知します。コードは次のようになります
静的BLEUUID serviceUUID ( "0000fee7-0000-1000-8000-00805f9b34fb"); // nRF接続アプリケーションを介して取得したフィットネスバンドのサービスUUIDstatic BLEUUID charUUID( "0000fee7-0000-1000-8000-00805f9b34fb"); // nRF接続アプリケーションを介して取得されたフィットネスバンドの特性UUIDString My_BLE_Address = "c7:f0:69:f0:68:81"; //フィットネスバンドのハードウェアBluetoothMACは、nRF接続アプリケーションを介して取得したバンドごとに異なります
プログラムに続いて、 connectToserver と MyAdvertisedDeviceCallbackが あります。これらは後で戻ります。次に、 セットアップ 機能内で、シリアルモニターを初期化し、ESP上のBLEを作成してデバイスをスキャンします。検出されたすべてのBLEデバイスのスキャンが完了すると、 MyAdvertisedDeviceCallbacks 関数が呼び出されます。
また、主電源でESP32に電力を供給しているため、アクティブスキャンを有効にします。バッテリーアプリケーションの場合は、消費電流を削減するためにオフになります。リレートリガーピンはハードウェアのGPIO13に接続されているため、GPIOピン13を出力として宣言します。
void setup(){ Serial.begin(115200); //シリアルモニターを開始し ますSerial.println( "ESP32 BLEサーバープログラム"); //紹介メッセージ BLEDevice:: init( ""); pBLEScan = BLEDevice:: getScan(); //新しいスキャンを作成します pBLEScan-> setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); //上記で定義されたクラスを呼び出します pBLEScan-> setActiveScan(true); //アクティブスキャンはより多くの電力を使用しますが、結果をより速く取得します pinMode(13、OUTPUT); //内蔵LEDピンを出力として宣言します }
MyAdvertisedDeviceCallbacks 関数内に、 検出 されたBLEデバイスの名前とその他の情報を一覧表示する行を出力します。検出されたBLEデバイスのハードウェアIDが必要です。これにより、目的のデバイスと比較できます。そのため、変数 Server_BLE_Address を使用してデバイスのアドレスを取得し、それをBLEAddressタイプから文字列に変換します。
class MyAdvertisedDeviceCallbacks:public BLEAdvertisedDeviceCallbacks { void onResult(BLEAdvertisedDevice advertisedDevice){ Serial.printf( "スキャン結果:%s \ n"、advertisedDevice.toString()。c_str()); Server_BLE_Address = new BLEAddress(advertisedDevice.getAddress()); Scaned_BLE_Address = Server_BLE_Address-> toString()。c_str(); } };
ループ 関数内で、3秒間スキャンし、BLEScanResultsのオブジェクトであるfoundDevices内に結果を配置します。スキャンして1つまたは複数のデバイスが見つかった場合、検出されたBLEアドレスがプログラムに入力したものと一致するかどうかの確認を開始します。一致が正で、デバイスが以前にペアリングされていない場合は、connectToserver関数を使用してペアリングを試みます。また、目的を理解するためにいくつかのシリアルステートメントを使用しました。
while(foundDevices.getCount()> = 1) { if(Scaned_BLE_Address == My_BLE_Address && paired == false) { Serial.println( "Found Device:-)…クライアントとしてサーバーに接続しています"); if(connectToserver(* Server_BLE_Address)) {
connectToserver 関数内では、UUIDを使用してBLEサーバー(フィットネスバンド)とペアリングします。サーバーに接続するには、ESP32がクライアントとして機能する必要があるため、 createClient() 関数を使用してクライアントを作成し、BLEサーバーのアドレスに接続します。次に、UUID値を使用してサービスと特性を検索し、それに接続してみます。接続が成功すると、関数はtrueを返し、そうでない場合はfalseを返します。サーバーとペアリングするためにサービスと特性UUIDを用意することは必須ではなく、理解のためにのみ行われることに注意してください。
bool connectToserver(BLEAddress pAddress){ BLEClient * pClient = BLEDevice:: createClient(); Serial.println( "-作成されたクライアント"); // BLEサーバーに接続します。 pClient-> connect(pAddress); Serial.println( "-フィットネスバンドに接続"); //リモートBLEサーバーで必要なサービスへの参照を取得します。 BLERemoteService * pRemoteService = pClient-> getService(serviceUUID); if(pRemoteService!= nullptr) { Serial.println( "-サービスが見つかりました"); trueを返します。 } それ以外の リターンはfalse; //リモートBLEサーバーのサービスで特性への参照を取得します。 pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID); if(pRemoteCharacteristic!= nullptr) Serial.println( "-私たちの特性が見つかりました"); trueを返します。 }
接続が成功すると、GPIOピン13がハイになり、breakステートメントを使用して制御がループの外側に送信されます。ペアになっているブール変数もtrueに設定されます。
if(connectToserver(* Server_BLE_Address)) { paired = true; Serial.println( "******************** LEDがオンになりました********************** ** "); digitalWrite(13、HIGH); ブレーク; }
ペアリングが成功し、GPIOピンがオンになったら、デバイスがまだ範囲内にあるかどうかを確認する必要があります。デバイスがペアリングされたため、BLEスキャンサービスはデバイスを認識できなくなります。ユーザーがそのエリアを離れたときにのみ、再び見つかります。したがって、BLEサーバーをスキャンするだけで、以下に示すようにGPIOピンをローに設定する必要があります。
if(Scaned_BLE_Address == My_BLE_Address && paired == true) { シリアル。println ( "デバイスが範囲外になりました"); ペア= false; シリアル。println ( "******************** LED OOOFFFFF ************************" ); digitalWrite(13、LOW); ESP.restart(); ブレーク; }
作業とテスト
プログラムとハードウェアのセットアップの準備ができたら、コードをESP32にアップロードし、セットアップ全体を以下に示すように配置します。
フィットネスバンド(サーバー)がESP32とペアリングされるとすぐに、ランプがオンになることに気付くはずです。フィットネスバンドの接続Bluetooth記号に注目して、これを確認することもできます。ペアリングしたら、ESP32から離れてみてください。3〜4メートルを超えると、時計のBluetooth記号が消え、接続が失われます。さて、あなたがランプを見ると、それは消えます。戻って歩くと、デバイスは再びペアリングされ、ライトが点灯します。プロジェクトの完全な動作は、以下のビデオで見つけることができます。
プロジェクトを楽しんで、途中で何か新しいことを学んだことを願っています。それを機能させる上で問題に直面した場合は、フォーラムまたは以下のコメントセクションに問題を投稿してください。