2026.4.17 2023.9.28 Coskx Lab
注意
ボードライブラリ「ESP32 by Espressif Systems Ver3.3.6」ではBLE関連のライブラリが動作不調になりましたが,「ESP32 by Espressif Systems Ver3.3.7」で解消されました。
これによって,標準ライブラリのBLEが舞台裏でNimBLEに変更されています。
20260218
1 はじめに
温度センサBMP280を載せたWi-FiマイコンXIAO ESP32S3からAndroidスマホに向けてBLE(Bluetooth Low Energy)を使って温度情報を送ります。
Wi-FiマイコンとAndroidスマホ間の通信は無線LAN環境の下ではHTTPでの通信ができますが,無線LAN環境がない場合では,Bluetooth通信が便利です。
XIAO ESP32S3はBLE UART Profileを使って通信します。(Bluetooth Classicではありません。)

BLEコネクション通信では,Central(or Master or Observer)とPeripheral(or Slave or Broadcaster)の間で通信が行われます。
ここでは,AndroidをCentral,XIAO-ESP32S3をPeripheralとして使うことにします。
(PeripheralはServer,CentralはClientと説明されることもあります。)
なお,ここで使用するAndroidの2つのアプリSerial Bluetooth Terminal","Bluefruit Connect"はアプリ起動の度に,通信相手を探して接続するようになっているため,ペアリングを必要としていません。
(Peripheral側がペアリング・ボンディングを要求する設定になっている場合は,Central側の通信アプリが接続動作の際にCentral側の設定機構がペアリング・ボンディングを行ないます。)
2 使用環境
3 準備
3.1 ArduinoIDE
(1)Arduino IDEのメニューバーから[ファイルFile] -> [環境設定(Preferences)]
Additional board manager URLsに
https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
および
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
を設定してOK
(2)ツール[Tools] > ボード[Board] > Boards Manager
検索boxに「ESP」を入力すると複数のボード候補が出てくるので
esp32 by Espressif Systems
をinstall
(3)ツール[Tools] > ボード[Board]でESP32を探すとXIAO ESP32S3が見つかるので,これを選ぶ。
3.2 XIAO ESP32S3
XIAO ESP32S3の説明書を読んでプログラムの転送方法を確認します。
(USBケーブルでつないで書き込むだけでした。)
4 XIAO ESP32S3と温度センサBMP280の配線
温度センサBMP280は温度をデジタル値に変換しているので,そのデータをXIAO ESP32S3が読み出します。
XIAO ESP32S3と温度センサBMP280はI2C接続ですので,電源線,GND線の他はSCLとSDAの2本のみで通信できます。
CSBをVCCにつなぐとBMP280はI2C接続になります。(データシートによれば確実にVCCにつなぐべきとなっています)
SDO(シルク印刷は間違えていてSDDとなっている)をVCCにつなぐとBMP280のI2Cアドレスは77になります。GNDにつなぐとBMP280のI2Cアドレスは76になります。Groveライブラリのデフォルトは77なのでVCCにつないでいます。
なおBMP280ではSDA,SCLをpullupせずに動作しています。

XIAO ESP32S3と温度センサBMP280の配線

ブレッドボードには載せないので,XIAO ESP32S3のピンを上向きに付けています。
XIAO ESP32S3と温度センサBMP280
5 XIAO ESP32S3のスケッチコード(Peripheralプログラム)
XIAO ESP32S3のスケッチコードは,centralがiOSデバイスであってもWindowsPCであっても同じものを使っています。
iOSデバイス版の解説
WindowsPC版の解説
プログラムの概要
central(Androidスマホなど)からのリクエストで,PeripheralであるXIAO ESP32S3は,温度センサBMP280の値を取得し,centralに返します。
具体的には,XIAO ESP32S3はcentral(Androidスマホなど)から文字列"start"を受け取ったら1秒間隔で温度などのデータをcentralに送信し,文字列"stop"を受け取ったら送信をやめるようにします。
説明
BLE UART通信ですが,やりたいことは,BMP280の値を取得し送信することですので,BLEの煩雑な部分は,クラスHandy_BLE_Uartに任せて舞台裏に隠れてもらいます。
このプログラムでは受信時にやるべきことを記述した関数は,void StringReceptionReport(String str)としました。送られてくるstrが受信した文字列です。
(受信時にやるべきことを記述した関数の名前は別のものでもOKです)
やるべきこととは,「start」「stop」によりブール変数「requested」のtrue falseを切り替えることです。
ESP32S3側が送信するときは,関数transferString()を使います。
#define DEVICENAME "UART-B0"
は自分の名前です。通信相手のAndroidスマホなどから見つけてもらう名前です。初期化の時点で決定します。
このプログラムではBLE通信の面倒なところをクラスHandy_BLE_Uartにして別ファイルに書いています。
クラスHandy_BLE_Uartの定義は「Handy_BLE_Uart.h」と「Handy_BLE_Uart.cpp」に書かれています。
ダウンロード,解凍して次のプログラムコードBLE_uart_BMP280.inoと同じフォルダに入れてください。
Handy_BLE_Uartのダウンロード
フォルダBLE_uart_BMP280にプログラムBLE_uart_BMP280.ino,Handy_BLE_Uart.h,Handy_BLE_Uart.cppを入れたところを示します。 そうすると,ArduinoIDEの画面の上部にそれぞれのファイル名が表示されるようになり,クリックするとArduinoIDEでファイルの中を見ることができます。

なお,ペアリング・ボンディングを要求したい場合は,プログラムBLE_uart_BMP280.inoの初期化のときに
bleuart.begin(DEVICENAME, true);
ではなく
bleuart.begin(DEVICENAME, true, 123456);
のように6桁のパスキーを追加します。(パスキーは必ず6桁の数です。)
Arduino IDEでコンパイルするときは,ライブラリ"Grove_-_Barometer_Sensor_BMP280"を予めIDEに追加しておいてください。
BLE_uart_BMP280.inoのプログラムコード
6 AndroidスマホアプリとXIAO ESP32S3のペアリング
◎このプログラムコードではペアリング作業は不要です。
7 Androidスマホアプリ"Serial Bluetooth Terminal"の準備
Android playから,Androidデバイスに"Serial Bluetooth Terminal"をダウンロードしてインストールします。

"Serial Bluetooth Terminal"のアイコン
最初の起動で,メニュー等の探検をします。
〇左上三本線メニューでは
settings→terminal→Show timestampをONにしておくとよいでしょう。
settings→terminal→Buffer sizeは表示内容を保存する作業メモリのサイズです。できるだけ大きくとるのが良いと思います。(200kBでは100文字のデータ約2000行分です。場合によっては無制限もあり)
settings→ReceiveはCR+NLが標準ですが,後で受信行での改行が変だったら,適当に変えてください。
settings→Send→Local echoはONが標準です。自分が送信した文字列も表示されます。
settings→Misc.→Save....は表示内容(LOG)保存先フォルダの設定です。
〇右上3点メニューには
Data→Saveがあって,表示内容を保存の時使います。
8 XiaoESP32S3と"Serial Bluetooth Terminal"の通信
先にXiaoESP32S3に電源を与え,立ち上げておきます。

"BMP280が接続されたXIAO ESP32S3(紙のアンテナがついています。)
その後,androidデバイスの"Serial Bluetooth Terminal"で
左上三本線メニューでDevices→BluetoothLE→SCAN で付近のBLEデバイスを見つけて表示してくれます。
ここでは,XiaoESP32S3のプログラムの
#define DEVICENAME "UART-B0"
でつけた名前"UART-B0"が見つかるのでこれをタップします。

Serial Bluetooth Terminalデバイス選択画面
"Serial Bluetooth Terminal"から"start"を送信すると,1秒ごとにデータが送信されてきます。
受信した3つの数値は温度[℃],気圧[hPa],標高[m]を表しています。
"Serial Bluetooth Terminal"から"stop"を送信すると,データ送信が止まります。
画面上の受信データは,右上3点メニューからData→Saveでファイル保存することができます。
"Serial Bluetooth Terminal"から"start"や"stop"を送信するときは,画面下部のテキストボックスに入力して送信ボタンをタップするか,予めマクロボタンに"start"や"stop"の文字列を登録(マクロボタンのタップ&ホールドで登録出来る)しておいて,それらのボタンをタップます。
次の通信画面では,予めマクロボタンに"start"や"stop"の文字列が登録されています。

Serial Bluetooth Terminal通信画面
9 まとめ
マイコンXIAO ESP32S3とAndroidスマホでBLEuart通信し,Androidスマホからの指令によって温度などのデータをXIAO ESP32S3が送るプログラムを示しました。
XIAO ESP32S3側のプログラムでは,BLE通信の面倒なところは,クラスHandy_BLE_Uartに封入して,データ送信部分に専念したプログラムコードに集中できるようにしました。
この記事ではAndroidスマホのアプリ"Serial Bluetooth Terminal"を使いました。
他にも"Bluefruit Connect"というがあり,同じような使い方が出来ます。 → 付録
iPhoneにもアプリ"Bluefruit Connect"がありAndroid版"Bluefruit Connect"と同じ使い方ができます。
WindowsPCにも同様なアプリ"BLE_serial_terminal"があり,同様の使い方ができます。
iOSデバイス版の解説
WindowsPC版の解説
付録 "Bluefruit Connect"
アプリ"Bluefruit Connect"にはAndroid版とiOS版があり,同じ操作で使うことができて便利です。
A1 Androidデバイスアプリ"Bluefruit Connect"の準備
Android playから,"Bluefruit Connect"をダウンロードしてインストールします。

"Bluefruit Connect"のアイコン
A2 XiaoESP32S3と"Bluefruit Connect"の通信
先にXiaoESP32S3に電源を与え,立ち上げておきます。
その後,"Bluefruit Connect"を立ち上げると最初にSelect Deviceの画面になります。
ここでは,XiaoESP32S3のプログラムの
#define DEVICENAME "UART-B0"
でつけた名前"UART-B0"が見つかるのでconnectボタンをタップします。

Bluefruit Connectデバイス選択画面
次にModulesと書かれたモジュール選択画面になりますので,UARTを選択します。

Bluefruit Connectモジュール選択画面
UARTの白い画面になったら,"Bluefruit Connect"から"start"を送信すると,1秒ごとにデータが送信されてきます。
受信した3つの数値は温度[℃],気圧[hPa],標高[m]を表しています。
"Bluefruit Connect"から"stop"を送信すると,データ送信が止まります。
"Bluefruit Connect"から"start"や"stop"を送信するときは,画面下部のテキストボックスに入力してSENDボタンをタップします。

Bluefruit Connect通信画面
画面上の送受信データの表示形式は,右上メニューからDisplay Modeで切り替えられます。
(time stamp付きの表示もできます。)
画面上の送受信データのファイルへの保存は,右上メニューからExportで出来ます。
保存形式をcsvにするとtime stamp付きでの保存になります。