🍣

Seeed Studio XIAO nRF52840でBLEからサンプルデータを送る

2022/10/13に公開

概要

前回まででチュートリアルに沿ってBLEからLEDを点滅させることができた。
https://zenn.dev/yuji_miyano/articles/cb2165b79c31f6

今後BME280の気温、気圧、湿度のデータを送るために、サンプルデータを送るプログラムを作成してみる。

ArduinoBLEとBME280を使ったサンプルプログラムを探す

ArduinoBLEのライブラリのサンプルは自分には難しかったので、ArduinoBLEを使いつつBME280を使っているサンプルを探したところsparkfunのものが良さそうだった。
https://learn.sparkfun.com/tutorials/micromod-nrf52840-processor-hookup-guide/arduino-example-bluetooth-low-energy

sparkfunのBME280のライブラリがすごく使いやすそう。前回BLE NanoとBME280を使ったときはこのライブラリを使わずにやったので結構苦労した記憶がある。
https://github.com/sparkfun/SparkFun_BME280_Arduino_Library

Qwiicコネクタを使わずに接続しているので、そのままだとエラーが出てしまう。
Setup()関数内でtempSensor.begin()より前にI2Cのアドレスを指定したら動いた。デフォルトが0x77みたい。

tempSensor.setI2CAddress(0x76);

SparkFun BME280 Arduino Libraryの使い方は以下のサイトが分かりやすかった。
https://qiita.com/nanase/items/f34e03c29410add9c4d0

温度表記が華氏(°F)になっているので

  int temperatureF = (int)tempSensor.readTempF();

  int temperatureC = (int)tempSensor.readTempC();

にしたら摂氏(°C)で取得できた。

サンプルプログラムを元に気温以外の気圧、湿度の仮データを送るようにする

BME280の気圧や湿度のデータ取得方法はライブラリにあるサンプルを参考にする。
https://github.com/sparkfun/SparkFun_BME280_Arduino_Library/blob/master/examples/Example1_BasicReadings/Example1_BasicReadings.ino

Characteristicで少数を使いたく、BLEIntCharacteristicではなくBLEFloatCharacteristicを使用した。これも便利。

BLEFloatCharacteristic pressureReadingChar("2A6D", BLERead | BLENotify);
BLEFloatCharacteristic temperatureReadingChar("2A6E", BLERead | BLENotify);
BLEIntCharacteristic humidityReadingChar("2A6F", BLERead | BLENotify);

以下のようにbme280Serviceに温度、気圧、湿度の3つのCharacteristicをAddしようとするとビルドは通るが、LightBlueから接続しようとするとTimeoutしてしまう。

  BLE.setAdvertisedService(bme280Service); // add the service UUID
  bme280Service.addCharacteristic(temperatureReadingChar); // add the temperature reading characteristic
  bme280Service.addCharacteristic(humidityReadingChar); // add the humidity reading characteristic
  bme280Service.addCharacteristic(pressureReadingChar); // add the pressure reading characteristic
  BLE.addService(bme280Service); // Add the temperature service

Charactericticが2つだとどの組み合わせでも接続できるが3つだとダメな様子。
試しにloop()内のdelayを1000から500に変えたところTimeoutにならなくなった。ちゃんとした理由は分かっていない。

    while (central.connected()) {
        updateTemperature();
        updateHumidity();
        updatePressure();
        delay(500);
    }

気温(Float)

湿度(Int)

気圧(Float)

とりあえずはBLEで気温、湿度、気圧を送ることができた。
Arduino側はBME280の取得タイミングの制御とDeepSleepの設定を行いたい。

Discussion