XIAO ESP32-C3 iBeaconとBME680センサーを使用したESP-IDFによる開発
この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues
XIAO ESP32-C3 iBeaconとBME680センサーを使用したESP-IDFによる開発
このチュートリアルでは、Bluetooth Low Energy (BLE) のiBeacon形式を使用して環境データを送信する低消費電力の温度監視システムを構築します。使用するのはSeeed Studio XIAO ESP32-C3、XIAO拡張ボード、およびGrove BME680環境センサーです。このプロジェクトでは、Espressifの公式開発フレームワークであるESP-IDFを使用して堅牢な組み込みアプリケーションを構築する方法を示します。
概要
本システムは以下を実現します:
- BME680センサーから温度、湿度、気圧を読み取る
- このデータをBLE広告パケットにパッケージ化する
- 定期的に起動し、測定を行い、データを送信し、バッテリー消費を抑えるためにスリープ状態に戻る
システムフローチャート

このフローチャートは、システムの主な動作サイクルを示しています。起動から深いスリープ状態に戻るまでの流れを表しています。
ハードウェア要件
Seeed Studio XIAO ESP32C3 | Seeed Studio Grove Base for XIAO | Grove BME680環境センサー |
---|---|---|
![]() | ![]() | ![]() |
- USB Type-Cケーブル
- ESP-IDFがインストールされたコンピュータ
ソフトウェア要件
- ESP-IDF (v5.0以降)
- Git
- プロジェクト GitHub リポジトリ
ステップ 1: ハードウェアセットアップ

BME680センサーをXIAO拡張ボードに接続する:
- Grove BME680センサーをXIAO拡張ボードのI2Cポートの1つに接続します。
- センサーはI2Cを介して通信するため、I2C互換のGroveポートであればどれでも使用可能です。
XIAO ESP32-C3を拡張ボードに取り付ける:
- XIAO ESP32-C3モジュールを拡張ボードに慎重に配置し、挿入します。
- ピンが正しく揃っていることを確認し、モジュールがしっかりと固定されていることを確認してください。
コンピュータに接続する:
- USB Type-Cケーブルを使用して、XIAO拡張ボードをコンピュータに接続します。
ステップ 2: 開発環境のセットアップ
ESP-IDFをインストールする: お使いのオペレーティングシステムに応じた公式インストール手順に従ってください。
Linuxの場合、以下を使用できます:
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh
. ./export.shプロジェクトリポジトリをクローンする:
cd ~/Desktop
git clone --recurse-submodules https://github.com/Priyanshu0901/xiao_ibeacon.git
cd xiao_ibeaconcaution--recurse-submodules
フラグは重要です。このプロジェクトはGitサブモジュールとして含まれる外部ライブラリに依存しているため、これがないとコンパイルに失敗します。すでにサブモジュールなしでクローンしてしまった場合は、以下を実行してください:
git submodule update --init --recursive
ステップ 3: プロジェクト構造とコンポーネントの理解
このプロジェクトは、以下の3つの主要コンポーネントで構成されています:
BME680センサーコンポーネント (
sensor_t_a_h
):- BME680センサーとの通信を処理
- センサーの初期化、読み取り、データ処理を管理
- 温度、湿度、気圧データを提供
BLEビーコンコンポーネント (
ble_beacon
):- BLEスタックを設定
- センサーデータを含むBLE広告を作成してブロードキャスト
- BLEの初期化とクリーンアップを管理
電源管理コンポーネント (
power_manager
):- ディープスリープ機能を処理
- 省電力動作を管理
- ウェイクアップソースとスリープ時間を制御
コンポーネントの相互作用

この図は、システムのハードウェア要素と異なるソフトウェアコンポーネントがどのように相互作用するかを示しています。
ステップ 4: 設定の理解
ビルドの前に、主要な設定を理解しましょう:
メインアプリケーション設定 (
main.c
内):ADV_TIME_MS
: BLE広告の継続時間 (500ms)POLL_INTERVAL_MS
: センサーをポーリングする頻度 (150ms)TIMEOUT_MS
: センサー読み取りの最大待機時間 (2000ms)SLEEP_TIME_MS
: 測定間のスリープ時間 (~29.3秒)
センサー設定 (
components/sensor_t_a_h/Kconfig
内):menu "BME68X Configuration"
config BME68X_I2C_ADDR
hex "BME68X I2C Address"
default 0x76
help
BME68XセンサーのI2Cアドレス。デフォルトは0x76です。
SDOピンが高電位の場合は0x77を使用してください。
choice BME68X_INTERFACE
prompt "BME68X Interface"
default BME68X_USE_I2C
help
BME68Xセンサーで使用するインターフェースを選択してください。
config BME68X_USE_I2C
bool "I2C Interface"
config BME68X_USE_SPI
bool "SPI Interface"
endchoice
if BME68X_USE_I2C
config BME68X_I2C_PORT
int "I2C Port Number"
range 0 1
default 0
help
BME68X用のI2Cポート番号。
config BME68X_I2C_SDA_PIN
int "I2C SDA GPIO"
range 0 48
default 12
help
I2C SDA用のGPIOピン。
config BME68X_I2C_SCL_PIN
int "I2C SCL GPIO"
range 0 48
default 13
help
I2C SCL用のGPIOピン。
config BME68X_I2C_CLOCK_SPEED
int "I2C Clock Frequency (Hz)"
range 100000 400000
default 100000
help
BME68X用のI2Cクロック周波数。標準モード (100 KHz) または高速モード (400 KHz)。
endif
endmenuBLE設定 (
components/ble_beacon/common.h
内): BLEデバイス名はcommon.h
ファイルで定義されています:#define DEVICE_NAME "Xiao_TempSensor"
設定パラメータの変更
ESP-IDFのmenuconfigツールを使用
ESP-IDFフレームワークは、プロジェクト設定を変更するための強力な構成ツールであるmenuconfigを提供します。このツールは、Linuxカーネルで使用されるKconfigと同じ構成システムに基づいています。
構成インターフェースを起動するには:
idf.py menuconfig
これにより、以下のような構成カテゴリを持つテキストベースのUIが表示されます:
Application Configuration --->
ESP-IDF Components --->
SDK tool configuration --->
Compiler options --->
Component config --->
Bootloader config --->
Serial flasher config --->
menuconfigでのナビゲーション:
↑
および↓
矢印キーで移動Enter
キーでサブメニューに入るEsc
キーで戻るSpace
キーでオプションを切り替える- ブールオプションでは
Y
で「はい」、N
で「いいえ」 - 現在選択されているオプションのヘルプを表示するには
?
キー Q
またはEsc
を複数回押して終了し、Y
で変更を保存
センサー設定の見つけ方:
Component config
に移動BME68X Configuration
を見つけるまでスクロールEnter
キーを押してセンサー設定を表示
BLE設定の確認:
Component config
に移動しますBluetooth
を見つけて選択しますNimBLE Options
を選択します- ここで、さまざまなBLEパラメータを設定できます
BME680用I2Cピンの設定
BME680センサーのI2Cピンを設定するには、以下の手順を実行します:
- menuconfigで、
Component config
→BME68X Configuration
に移動します I2C SDA GPIO
を選択してSDAピンを変更します- SDAのGPIO番号を入力します(デフォルトは12ですが、XIAO ESP32-C3と拡張ボードを使用する場合は6を使用します)
I2C SCL GPIO
を選択してSCLピンを変更します- SCLのGPIO番号を入力します(デフォルトは13ですが、XIAO ESP32-C3と拡張ボードを使用する場合は7を使用します)
- センサーが異なるI2Cアドレスを持つ場合は、
BME68X I2C Address
を選択して変更します
menuconfigを使用したBLEパラメータの設定
デバイス名はコード内で定義されていますが、その他のBLEパラメータはmenuconfigを通じて設定できます:
Component config
→Bluetooth
→NimBLE Options
に移動します- 以下を変更できます:
- 同時接続の最大数
- BLEの役割(Central/Peripheral/Observer/Broadcaster)
- セキュリティ設定
- GAPおよびGATTパラメータ
- BLEスタックのメモリ割り当て
高度な設定オプション
上級ユーザー向けに、追加の設定オプションが利用可能です:
電源管理:
Component config
→Power Management
に移動します- 自動ライトスリープの有効化/無効化
- DFS(動的周波数スケーリング)の設定
フラッシュ暗号化:
Security features
に移動します- セキュアなデプロイメントのためのフラッシュ暗号化オプションを設定
パーティションテーブル:
Partition Table
に移動します- 異なるアプリケーションニーズに合わせてフラッシュパーティションを変更
ログ出力:
Component config
→Log output
に移動します- デバッグログレベルと出力先を設定
変更を加えた後、Q
を押して終了し、Y
を押して変更を保存します。その後、以下のコマンドでプロジェクトを再ビルドします:
idf.py build
BLEデバイス名の変更
BLEデバイス名を変更するには、components/ble_beacon/common.h
内の DEVICE_NAME
マクロを変更する必要があります:
ファイルを開きます:
nano components/ble_beacon/common.h
DEVICE_NAME
の定義を見つけて、希望する名前に変更します:#define DEVICE_NAME "MyCustomSensor"
ファイルを保存してプロジェクトを再ビルドします。
ステップ5: プロジェクトのビルドとフラッシュ
プロジェクトディレクトリに移動:
cd ~/Desktop/xiao_ibeacon
プロジェクトを設定:
idf.py set-target esp32c3
idf.py menuconfigメニューをナビゲートして設定を確認または調整します:
- Component Config → BME680 Sensor Settings
- Component Config → BLE Beacon Settings
- Component Config → Power Management
プロジェクトをビルド:
idf.py build
XIAO ESP32-C3にプロジェクトをフラッシュ:
idf.py -p /dev/ttyUSB0 flash
注意: ポートは異なる場合があります(Windowsの場合: COM3, COM4など)
出力をモニタリング(オプション):
idf.py -p /dev/ttyUSB0 monitor
モニタを終了するには、Ctrl+] を押します。
ステップ 6: iBeacon のテスト
スマートフォンに BLE スキャナーアプリをダウンロード:
- iOS: "LightBlue" または "nRF Connect"
- Android: "nRF Connect" または "BLE Scanner"
アプリを開いて BLE デバイスをスキャン:
- "Xiao_TempSensor" という名前のデバイスを探します
- デバイスを選択して、そのアドバタイズデータを確認します
アドバタイズデータを理解する: BLE アドバタイズには以下のデータが含まれます:
- 温度(摂氏、100 倍スケール)
- 湿度(パーセント)
- 気圧(hPa、10 倍スケール)
期待される動作:
- デバイスは約 30 秒ごとに起動します
- BME680 センサーからデータを取得します
- このデータを 500ms 間ブロードキャストします
- その後、電力を節約するためにディープスリープに入ります
Python テストスクリプト
このプロジェクトには、BLE ビーコンの機能をテストおよび検証するための Python スクリプトが含まれています。以下に詳細を説明します。
Python 環境のセットアップ
テストスクリプトのディレクトリに移動します:
cd ~/Desktop/xiao_ibeacon/test_scripts
セットアップスクリプトを実行して仮想環境を作成および構成します:
# Linux/macOS の場合
chmod +x setup_venv.sh
./setup_venv.sh
# Windows の場合
setup_venv.bat仮想環境を有効化します:
# Linux/macOS の場合
source venv/bin/activate
# Windows の場合
venv\Scripts\activate
セットアップスクリプトは以下の必要なパッケージをインストールします:
bleak
: BLE 通信用colorama
: カラフルなターミナル出力用
BLE スキャナースクリプトの使用
BLE スキャナースクリプト (ble_beacon_scanner.py
) は、BLE アドバタイズをスキャンし、ビーコンからのセンサーデータを表示します。
スキャナーの主な機能:
- "Xiao_TempSensor" という名前のデバイスを探します
- メーカー固有のデータをデコードして、温度、湿度、気圧を抽出します
- フォーマットされたターミナル UI に値を表示します
- 新しいアドバタイズを受信するたびに継続的に更新します
スキャナーを実行するには:
python ble_beacon_scanner.py
スクリプトは最新のセンサー読み取り値をフォーマットされた出力で表示します:
╔═══════════════════════════════════════════════╗
║ Xiao Temperature Sensor Beacon Scanner ║
╠═══════════════════════════════════════════════╣
║ Last Update: 15:42:27 ║
║ Signal Strength: -63 dBm ║
╠═══════════════════════════════════════════════╣
║ Temperature: 23.45 °C ║
║ Humidity: 48 % ║
║ Pressure: 1013.2 hPa ║
╠═══════════════════════════════════════════════╣
║ Press Ctrl+C to exit ║
╚═══════════════════════════════════════════════╝
スクリプト内で DEBUG_MODE = True
に設定すると、BLE アドバタイズやデータ解析に関する追加情報が表示されます。
ビーコンデータフォーマット
ビーコンは、BLE アドバタイズの制限内に収まるように圧縮フォーマットでデータを送信します:
- 会社 ID: 0x02E5 (Espressif Systems)
- 温度: 16 ビット符号付き整数、100 倍スケール(100 で割ると摂氏温度)
- 湿度: 8 ビット符号なし整数(直接パーセント値)
- 気圧: 16 ビット符号なし整数、10 倍スケール(10 で割ると hPa)
Python スクリプトはこのフォーマットをデコードし、実際の値を表示します。
テストプロセスの流れ

ステップ 7: 動作の仕組み - 詳細解説
センサーの初期化と読み取り
BME680センサーは以下の手順で初期化されます:
- I2C設定: 適切なピンでI2C通信を設定します(XIAO ESP32-C3拡張ボードの場合、GPIO6/GPIO7がSDA/SCLに対応)
- センサー初期化: 温度、湿度、気圧、ガス測定の設定を使用してBME680センサーを構成
- 読み取りプロセス: 測定を開始し、データが準備されるのを待機
- データ処理: 生のセンサー値を人間が読み取れる測定値に変換

BLEアドバタイズ
BLE機能は以下のように動作します:
- BLEスタック初期化: ESP32のBLEスタックを設定
- アドバタイズ設定: アドバタイズのパラメータ(間隔、データ形式)を構成
- データパッケージ化: センサーの読み取り値を取得し、メーカー固有のデータとしてパッケージ化
- アドバタイズの開始/停止: アドバタイズのタイミングを制御

電源管理
電源管理システムはESP32-C3の内蔵スリープ機能を使用します:
- ディープスリープ設定: ESP-IDFのスリープAPI(
esp_sleep_enable_timer_wakeup()
)を使用してウェイクアップタイマーを設定 - ウェイクアップソース: タイマーを唯一のウェイクアップソースとして設定(指定された期間後にシステムがウェイクアップ)
- スリープエントリ: アクティブな周辺機器を安全にシャットダウンし、
esp_deep_sleep_start()
でディープスリープに入る - ウェイクアッププロセス: タイマーが期限切れになると、システムがリセットされ、アプリケーションが最初から再起動

電源管理コンポーネント(power_manager.c
)は、スリープモードを処理するためのシンプルなインターフェースを提供します:
// 電源管理を初期化
power_manager_init();
// 後でスリープするタイミングで:
power_manager_enter_deep_sleep(30000); // 30秒間スリープ
デバイスがディープスリープに入ると、消費電力は劇的に低下し(約10-20μA)、長いバッテリー寿命を実現します。デバイスは完全にシャットダウンし、タイマーが期限切れになると再起動するため、保持する必要がある状態はRTCメモリまたは不揮発性ストレージに保存する必要があります。
消費電力プロファイル
電力プロファイリングのセットアップ

電力プロファイル
システムには以下のような消費電力フェーズがあります:

消費電力フェーズ:
- スリープフェーズ: ディープスリープモードで約150μA(ESP32-C3 RTCコントローラーアクティブ + BME680スリープ)
- ウェイクアップと初期化: 起動およびセンサー初期化中に約40mA
- アクティブBLEアドバタイズ: BLE送信中にピークで約16mA
- クリーンアップとスリープエントリ: スリープエントリ前のリソースクリーンアップ中に約5mA

バッテリー寿命の計算:
- ディープスリープ中の平均電流(28秒間): 150μA
- アクティブフェーズ中の平均電流(2秒間): 約40mA
- 実効平均電流: 3.92 mA(1分間で測定)
- 一般的な1500 mAhのリチウムイオンバッテリーの場合:
- 1500 mAh ÷ 3.92 mA ≈ 382時間 ≈ 15.9日
電力最適化のヒント:
- 高電流期間を最小限に抑えるためにアドバタイズ時間を短縮
- 使用可能な最低のアドバタイズ電力を使用
- 未使用の周辺機器を無効化
- センサー読み取りプロセスを最適化
- スリープ期間を延長することを検討
ステップ 8: プロジェクトのカスタマイズ
プロジェクトのさまざまな側面をカスタマイズできます:
スリープ時間の変更:
main.c
内のSLEEP_TIME_MS
を編集して、読み取り間隔を調整します
センサー設定の変更:
idf.py menuconfig
を使用して、センサーのサンプリングレートやフィルターなどを変更します
BLEパラメータの調整:
- BLEビーコンコンポーネント内でデバイス名やアドバタイズ間隔を変更します
追加センサーの追加:
- センサーコンポーネントを拡張して、他のGroveセンサーを含めます
独自センサーの追加
別のセンサーをこのプロジェクトに統合するには、以下の手順に従います:
新しいセンサーコンポーネントを作成:
# コンポーネントディレクトリ構造を作成
mkdir -p components/my_new_sensor/include
touch components/my_new_sensor/CMakeLists.txt
touch components/my_new_sensor/Kconfig
touch components/my_new_sensor/my_new_sensor.c
touch components/my_new_sensor/include/my_new_sensor.hコンポーネントインターフェースを実装:
- 初期化関数を定義
- データ読み取り関数を作成
- 必要な設定をセットアップ
ヘッダーファイルの例 (
my_new_sensor.h
):#pragma once
#include <stdbool.h>
#include "esp_err.h"
typedef struct {
float value1;
float value2;
// 追加のセンサー値
} my_sensor_data_t;
/**
* @brief センサーを初期化
* @return 成功時はESP_OK
*/
esp_err_t my_sensor_init(void);
/**
* @brief センサーからデータを読み取る
* @param data 読み取り結果を格納する構造体へのポインタ
* @return 成功時はESP_OK
*/
esp_err_t my_sensor_read(my_sensor_data_t *data);ビルドシステムを設定:
CMakeLists.txt
の例:idf_component_register(
SRCS "my_new_sensor.c"
INCLUDE_DIRS "include"
REQUIRES driver
)メインアプリケーションを更新:
- メインアプリケーションの依存関係にコンポーネントを追加
- メインアプリケーションフローでセンサーを初期化
- BLEアドバタイズデータにセンサーの読み取り値を含める
main.c
での統合例:#include "my_new_sensor.h"
void app_main(void) {
// 他のコンポーネントを初期化
// ...
// 新しいセンサーを初期化
ESP_ERROR_CHECK(my_new_sensor_init());
// センサーからデータを読み取る
my_sensor_data_t sensor_data;
ESP_ERROR_CHECK(my_sensor_read(&sensor_data));
// BLEデータを修正してセンサーの読み取り値を含める
// ...
}BLEアドバタイズデータを拡張:
- BLEビーコンコンポーネントを更新して、センサーのデータをアドバタイズに含める
- 新しい測定値に適切なデータタイプIDを割り当てる
設定を更新:
components/my_new_sensor/Kconfig
にセンサー用のKconfigオプションを追加- これにより、
menuconfig
を通じてセンサーを設定可能にする
この構造化されたアプローチに従うことで、プロジェクトのモジュール構造を維持しながら、追加センサーをシームレスに統合できます。
トラブルシューティング
重要なヒント
通常動作中にシリアル出力がない
最適な電力効率を実現するため、通常動作中はシリアルポートを介したデバッグ情報は出力されません。デバイスがディープスリープモードにある場合、LEDも点滅しません。これは電力消費を最小限に抑えるための意図的な設計です。
デバイスの再フラッシュ
デバイスを再フラッシュするには:
- フラッシュプロセスを開始するときにXIAOボードのリセットボタンを押します
- フラッシュコマンドを、デバイスがディープスリープ状態でない短いアクティブ期間に合わせて実行します
- または、リセットボタンを押し続け、フラッシュコマンドを開始し、フラッシュが始まったらリセットボタンを離します
開発用のデバッグ出力を再有効化
独自モジュールの開発やデバッグ時には、シリアル出力を再有効化できます:
idf.py menuconfig
を実行Component config
→Log output
に移動- デフォルトのログレベルを
INFO
またはDEBUG
に設定 - ログ出力先を
UART0
に設定 - バッテリー寿命を維持するため、本番環境にデプロイする前に詳細なログを再度無効化することを忘れないでください
センサーが検出されない場合
センサー検出に問題がある場合:
接続を確認:
- Groveケーブルがセンサーと拡張ボードの両方に正しく接続されていることを確認
- I2C Groveポートを使用していることを確認
I2Cアドレスの問題:
- BME680のデフォルトI2Cアドレスは0x76です。一部のモジュールでは0x77を使用する場合があります。
- 必要に応じて設定でI2Cアドレスを編集
電源の問題:
- XIAOが十分な電力を得ていることを確認
- 別のUSBケーブルやポートを試す
BLEがアドバタイズされない場合
BLEアドバタイズが検出されない場合:
BLEスキャナーアプリを確認:
- 別のBLEスキャナーアプリを試す
- スマートフォンでBluetoothが有効になっていることを確認
デバッグ出力を監視:
idf.py monitor
を使用してエラーメッセージを確認
アドバタイズ時間:
- デフォルト設定では500msのみアドバタイズします。見逃した場合は、
main.c
内のADV_TIME_MS
を増やします
- デフォルト設定では500msのみアドバタイズします。見逃した場合は、
ビルドまたはフラッシュの失敗
ビルドまたはフラッシュの問題が発生した場合:
ESP-IDFのバージョン:
- ESP-IDF v5.0以降を使用していることを確認
- コマンド実行前に
. $IDF_PATH/export.sh
(Linux/macOS)または%IDF_PATH%\export.bat
(Windows)を実行
USB接続:
- USB接続が安定していることを確認
- フラッシュ前にXIAO拡張ボードのリセットボタンを押してみる
ポートの問題:
ls /dev/tty*
(Linux/macOS)またはデバイスマネージャー (Windows)を使用して正しいポートを特定- 正しいポートを指定して
-p
フラグを使用
結論
これで、温度、湿度、気圧、空気品質データをBLEを使用してブロードキャストする、省電力の環境モニタリングシステムを構築しました。このプロジェクトでは、以下の重要な概念を実証しています:
- センサー統合: ESP-IDFでのI2Cセンサーの操作
- BLE通信: BLEアドバタイズメントの作成と管理
- 電力管理: バッテリー効率を高めるためのディープスリープの実装
- ESP-IDF開発: ESP32開発のためのEspressif公式フレームワークの使用
全体的なシステムアーキテクチャ

この基盤を拡張することで、より複雑なIoTセンサーノード、環境モニタリングシステム、または資産追跡ソリューションを作成することができます。
リソース
✨ コントリビュータープロジェクト
- このプロジェクトは Seeed Studio の コントリビュータープロジェクト によってサポートされています。
- 特に Priyanshu Roy 氏の献身的な努力に感謝します。あなたの作業は 展示 されます。
技術サポート & 製品ディスカッション
弊社製品をお選びいただきありがとうございます!製品のご利用がスムーズに進むよう、さまざまなサポートを提供しています。お客様の好みやニーズに応じた複数のコミュニケーションチャネルをご用意しています。