Skip to main content

MCP による Grove の拡張

概要

この文書では、ESP32-S3 ベースの SenseCAP Watcher 開発ボード上の Grove インターフェースを介して DHT20 温湿度センサーを使用する方法について説明します。

Grove インターフェース定義(J5)

ハードウェア回路図によると、Grove インターフェースは以下のピンを使用します:

Grove ピン機能ESP32-S3 接続
Pin 1VCCGROVE_3.3V(3.3V 電源)
Pin 2SDAGPIO47(I2C0_SDA)
Pin 3SCLGPIO48(I2C0_SCL)
Pin 4GNDGND

DHT20 センサー

  • I2C アドレス:0x38(固定、変更不可)
  • 供給電圧:2.0V - 5.5V(3.3V を使用)
  • 通信プロトコル:I2C(最大 400kHz)
  • 測定範囲:
    • 温度:-40°C ~ +80°C(精度:±0.5°C)
    • 湿度:0% ~ 100% RH(精度:±3% RH)

ファイル構造

元のコード:

新しいファイル:

  • dht20.h

  • dht20.cc

  • 上記の 2 つのファイルを以下の場所に配置してください:

    • ファイルの場所
      main/boards/sensecap-watcher/
      ├── dht20.h # DHT20 driver header
      └── dht20.cc # DHT20 driver implementation

変更されたファイル

  • sensecap_watcher.cc

  • 上記のファイルを以下の場所で置き換えてください:

    • ファイルの場所
      main/boards/sensecap-watcher/
      └── sensecap_watcher.cc # Integrates DHT20 sensor and MCP tool
注意

上記のサンプルコードは参考用です。特定のセンサーモデル、開発環境、ファームウェアバージョンに応じて変更し、適切な統合と正常なコンパイルを確保してください。

コア機能(DHT20 センサー)

1. センサー初期化

DHT20 ドライバーは完全な初期化プロセスを実装します:

  • ステップ1. センサーリセット:0xBA リセットコマンドを送信
  • ステップ2. システム設定:レジスタ 0xE1 に [0x08, 0x00] を書き込み
  • ステップ3. キャリブレーション確認:ステータスレジスタのビット[3]をチェックしてセンサーがキャリブレーションされていることを確認
  • ステップ4. 再試行メカニズム:キャリブレーションが失敗した場合、最大 5 回まで再試行
esp_err_t ret = dht20_sensor_->Initialize();
if (ret == ESP_OK) {
ESP_LOGI(TAG, "DHT20 initialized successfully");
}

2. 温度・湿度読み取り

読み取りプロセス:

  • ステップ1. 測定トリガー:コマンド [0xAC, 0x33, 0x00] を送信
  • ステップ2. 測定待機:80ms 遅延
  • ステップ3. 8 バイト読み取り:[ステータス、湿度 High、Middle、Low | 温度 High、Middle、Low、CRC]
  • ステップ4. データ解析:
    • 湿度 = (20 ビット生値)× 100 / 2^20
    • 温度 = (20 ビット生値)× 200 / 2^20 - 50
float temperature, humidity;
esp_err_t ret = dht20_sensor_->ReadTempAndHumidity(temperature, humidity);
if (ret == ESP_OK) {
printf("Temperature: %.2f°C, Humidity: %.2f%%\n", temperature, humidity);
}

コア機能(内部 MCP ツールインターフェース)

1. 機能説明

  • ツール名:self.grove.get_temperature_humidity
  • ツール用途:Grove 接続された DHT20 センサーから現在の温度と湿度を読み取り

2. 呼び出し例

AI は以下のように呼び出すことができます:

result = call_tool("self.grove.get_temperature_humidity", {})

3. 戻り値形式

  • 成功:

    {
    "temperature": 25.32,
    "humidity": 65.47,
    "status": "ok"
    }
  • 失敗:

    {
    "error": "DHT20 sensor not initialized"
    }

    または

    {
    "error": "Failed to read DHT20: ESP_ERR_TIMEOUT"
    }

4. I2C 通信プロトコル

機能コマンド/レジスタデータ
センサーリセット0xBA-
設定レジスタ0xE1[0x08, 0x00]
測定トリガー-[0xAC, 0x33, 0x00]
ステータス読み取り-1 バイト
データ読み取り-7 バイト

5. ステータスバイト定義

ビット機能
bit[7]測定ステータス1=測定中、0=アイドル
bit[6:4]予約済み-
bit[3]キャリブレーションステータス1=キャリブレーション済み、0=未キャリブレーション
bit[2:0]予約済み-

6. データ解析アルゴリズム

// Humidity data (20 bits)
uint32_t humidity_raw = (data[1] << 12) | (data[2] << 4) | (data[3] >> 4);
float humidity = humidity_raw * 100.0f / 1048576.0f;

// Temperature data (20 bits)
uint32_t temperature_raw = ((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5];
float temperature = temperature_raw * 200.0f / 1048576.0f - 50.0f;

トラブルシューティング

よくある問題

  1. センサー初期化失敗
  • 考えられる原因:
    • Grove インターフェースが正しく電源供給されていない
    • I2C 接続の問題
    • センサーが接続されていないか損傷している
  • 解決策
    uint32_t grove_power = esp_io_expander_get_level(io_exp_handle, BSP_PWR_GROVE);
    ESP_LOGI(TAG, "Grove power status: %d", grove_power);
  1. 読み取りタイムアウト
  • 考えられる原因:
    • センサーがビジー状態
    • I2C バスの競合
  • 解決策
    • 読み取り間隔を ≥1s に確保
    • I2C 上の他のデバイスを確認
  1. 無効なデータ
  • 考えられる原因:
    • センサーがキャリブレーションされていない
    • CRC チェック失敗(現在のバージョンでは未実装)
  • 解決策:
    • センサーを再初期化
    • CRC チェックの実装を検討(data[6])

参考資料

メンテナンス

コードは main/boards/sensecap-watcher/ に存在し、他のボードには影響しません。

技術サポート

Loading Comments...