Seeed Studio XIAO nRF52840でBLEからサンプルデータを送る
概要
前回まででチュートリアルに沿ってBLEからLEDを点滅させることができた。
今後BME280の気温、気圧、湿度のデータを送るために、サンプルデータを送るプログラムを作成してみる。
ArduinoBLEとBME280を使ったサンプルプログラムを探す
ArduinoBLEのライブラリのサンプルは自分には難しかったので、ArduinoBLEを使いつつBME280を使っているサンプルを探したところsparkfunのものが良さそうだった。
sparkfunのBME280のライブラリがすごく使いやすそう。前回BLE NanoとBME280を使ったときはこのライブラリを使わずにやったので結構苦労した記憶がある。
Qwiicコネクタを使わずに接続しているので、そのままだとエラーが出てしまう。
Setup()関数内でtempSensor.begin()より前にI2Cのアドレスを指定したら動いた。デフォルトが0x77みたい。
tempSensor.setI2CAddress(0x76);
SparkFun BME280 Arduino Libraryの使い方は以下のサイトが分かりやすかった。
温度表記が華氏(°F)になっているので
int temperatureF = (int)tempSensor.readTempF();
を
int temperatureC = (int)tempSensor.readTempC();
にしたら摂氏(°C)で取得できた。
サンプルプログラムを元に気温以外の気圧、湿度の仮データを送るようにする
BME280の気圧や湿度のデータ取得方法はライブラリにあるサンプルを参考にする。
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