こんにちは、ENGかぴです。
ESP32-WROOM-32EはWiFi通信とBluetooth通信ができるのが特徴です。親機と子機に分けたESP-WROOM-32EにBluetoothSerialライブラリを実装し子機のセンサー情報を親機に通信して動作確認を行いました。
BluetoothSerialライブラリを使ってBluetooth通信を行う方法は下記記事にまとめています。スマホをESP-WROOM-32Eの親機に置き換えて動作確認を行います。
ESP32-WROOM-32EでBluetoothSerialを実装する
親機と子機はESP32-WROOM-32E開発ボード(秋月電子)を使用しArduino IDEで開発を行います。センサーにはAE-BME280(秋月電子)を使用しています。
ESP32-WROOM-32Eを使って動作確認したことをまとめています。
ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方
PR:わからないを放置せず、あなたにあったスキルを身に着けるコツを教える テックジム 「書けるが先で、理解が後」を体験しよう!
BluetoothSerialライブラリを実装する

親機はマスターとして動作し子機に対して1秒毎に接続要求を行います。子機はスレーブとして動作し5秒毎にセンサーの情報を取得して親機にBluetooth通信を行います。接続が確立していると親機は子機から受信したデータをシリアルモニターに表示します。
ライブラリの初期化
#include "BluetoothSerial.h"
String BT_PARENT = "ESP32-BME280-PARENT";
String BT_CHILD = "ESP32-BME280-CHILD";
BluetoothSerial SerialBT; //インスタンス化
void setup() {
SerialBT.enableSSP(); //ペアリングの際のセキュリティ
if( digitalRead(PIN_DI_1) == 0){ //子機
SerialBT.begin(BT_CHILD);
bme280.begin();
}
else{ //親機
SerialBT.begin(BT_PARENT,true);
ParentFlg = true;
connectchk = SerialBT.connect(BT_CHILD);
}
}
BluetoothSerialライブラリを使用するためにBluetoothSerial.hをインクルードします。BluetoothSerialクラスの型の変数を宣言します。例ではSerialBTという変数名でインスタンス化しています。
enableSSP()関数はペアリング時のセキュリティで接続時に認証・暗号化を行う設定です。
begin()関数を使ってBlutoothSerialの初期化を行います。第1引数にBluetoothデバイスの名称を指定します。第2引数にマスターとして使用する場合はtrueを指定します。スレーブの場合は特に指定する必要はありません。
親機は子機に接続要求(ペアリング)するマスターとして動作させるためtrueを指定しています。子機のデバイス名に「ESP32-BME280-CHILD」、親機のデバイス名に「ESP32-BME280-PARENT」を指定しています。
親機はconnect()関数で接続要求(ペアリング)を行います。引数に接続するデバイス名を指定します。子機と接続するため子機のデバイス名を指定しています。
PR:
わからないを放置せず、あなたにあったスキルを身に着けるコツを教える テックジムPython入門講座の申込
接続の確認
if( timBLEConchk == TIME_UP ){
timBLEConchk = CON_CHK_MAX;
connectchk = SerialBT.connect(); //接続:true 切断:false
}
親機と子機の接続が切断した場合は再接続しない限り通信ができません。connect()関数を使用すると最初にconnect()関数で指定した引数の条件で再接続することができます。connect()関数は接続が確立しているとtrueをセットし、切断しているとfalseをセットします。
定期的にconnect()関数をコールすることで接続状態を管理し再接続させることができます。例ではタイマーを使って1秒毎に接続状態を確認しています。
データの読み込み(受信)
if( SerialBT.available()){
Serial.write(SerialBT.read());
}
BluetoothSerialクラスの型の変数においてクラスのメンバー関数を使ってデータを受信します。available()関数でBluetooth通信でデータが受信していることを確認します。データがあればread()関数で受信したデータを取得します。例ではBluetooth通信で取得したデータをシリアルモニターに表示しています。
データの書き込み(送信)
SerialBT.print("Temperature = ");
SerialBT.print(bme280data[0]);
SerialBT.println(" °C");
Bluetooth通信でデータを送信する場合はprint()関数やwrite()関数を使用します。引数に文字列を指定しますが、print()関数を使用するとテキストデータを送信しwrite()関数はバイナリデータを送信する使い分けがあります。println()を使用すると文字列を送信した後に改行コードを付加します。
動作確認
親機と子機の接続を確立(ペアリング)し、子機が送信したBME280モジュールのデータを親機のシリアルモニターに表示します。

子機のESP32-WROOM-32EとBME280モジュールの配線例を示しています。回路図の番号はESP32-WROOM-32Eの左上を1ピンとした時反時計回りにピンを数えた場合の番号としています。ピン番号横の()内の番号はシルク印刷されているピンの名称です。
AE-BME280モジュールをI2C(Wire)で使用します。AE-BME280モジュールにはプルアップ抵抗が付属されているのでWire用のプルアップ抵抗は不要です。
マイコン内蔵のプルアップ抵抗を使用しても問題ありませんが抵抗分が大きいほど通信波形が鈍り通信ができなくなることがあるためAE-BME280モジュールのプルアップ抵抗を使用することをお勧めします。
25ピンをGNDにすると子機として動作します。オープンにすると親機として動作します。親機はESP32-WROOM-32EモジュールをUSBに接続してシリアルモニターに表示するのみなので配線例はありません。
データを比較のために親機をシリアルモニターで表示し、子機をTera Termでモニターします。
電源をONすると子機は5秒毎に温湿度と気圧のデータを取得して表示していることが確認できました。親機は子機と接続が確立すると無線受信したデータをシリアルモニターに表示していることが確認できました。
子機のデータが親機のシリアルモニターに同一のデータが表示されているためBlutoothSerialによる通信がうまくいっていることが分かります。
頻度がそれほど多くなかったため通信環境によってデータを取りこぼす可能性があると割り切ったシステム構成が必要だと言えます。
ソースコード全体
ソースコードは記事作成時点において動作確認できていますが、使用しているライブラリの更新により動作が保証できなくなる可能性があります。また、ソースコードを使用したことによって生じた不利益などの一切の責任を負いかねます。参考資料としてお使いください。
リンクからZIPファイル形式のファイルをダウンロードし、任意の場所に展開していただくとテキストファイルが生成されます。
関連リンク
Arduinoのライブラリを使って動作確認を行ったことを下記リンクにまとめています。
Arduinoで学べるマイコンのソフト開発と標準ライブラリの使い方
Seeeduino XIAOで学べるソフト開発と標準ライブラリの使い方
ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方
PR:スキマ時間で自己啓発!スマホで学べる人気のオンライン資格講座【スタディング】まずは気になる講座を無料で体験しよう!
最後まで、読んでいただきありがとうございました。