Seeed XIAO BLE nRF52840を使ってBLE IoT センサーを作る(製作編)

# はじめに

前回こちらの記事で実験したBLEセンサを、さらに具体的用途を決めて、製作を行いました。
https://qiita.com/DeviceManager/items/440d3f045429a8edef51

自宅の温度・湿度・気圧・CO2の測定とクラウドでの記録を目的としています、センサは室内・室外に設置する想定です。


# 室内センサ

室内センサで測定するのは、温度・湿度・気圧・CO2になります。CO2センサの電力消費が多いことから、電池駆動はあきらめ、USBで常時電源を供給して動作するようなものにします。

## 回路図

シンプルです、XIAO BLEとBME280、CO2センサーのみです。

https://github.com/keitanak/XIAO-BLE-IoT-Sensor/blob/aa0b50139732115090462319ed96713261f148c4/schematic/XIAO-BLE-Sensor-CO2.pdf


## ソースコード

こちらに公開しました。Platform IOでArduinoを利用したファイル一式です。ほかの環境でのテストは未確認ですが、platform IOで読み込ませることで、たぶんこのまま利用できると思います。
https://github.com/keitanak/XIAO-BLE-IoT-Sensor

ソースコードの以下のコメントを外すことで、CO2センサからもデータの取得をおこない、BLEデータとしてアドバタイズします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/f4fd16cb-2b25-7662-02e5-46096722336f.png)

データフォーマットはヘッダー部分を除いて、以下のようにしています。

```
  // 温度
  0x10,0x00,0x00,
  // 湿度
  0x11,0x00,0x00,
  // 気圧
  0x14,0x00,0x00,
  // Battery voltage
  0x40,0x00,
  // CO2
  0x17,0x00,0x00
```



## 外観

簡単なものですが、プリント基板にしてみました。JLCPCBさんにオーダーしました。

左側がCO2センサ、右上がBME280、右下にXIAO BLEです。ちょっと密着しすぎましたかね。

![IMG_20240406_185003780.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/7d13bfff-d263-23ae-ad78-f02367b500da.jpeg)




# 室外センサ

室内センサで測定するのは、温度・湿度・気圧になります。BME280のみで済むのでスリープも組み合わせて消費電力を抑えます、電池駆動で、必要な時にUSBで充電して動作するようなものにします。

## 回路図

シンプルです、XIAO BLEとBME280のみです。ここには表現されていませんが、LIPOバッテリーも必要です。

https://github.com/keitanak/XIAO-BLE-IoT-Sensor/blob/aa0b50139732115090462319ed96713261f148c4/schematic/XIAO-BLE-Sensor.pdf

## ソースコード

https://github.com/keitanak/XIAO-BLE-IoT-Sensor

ソースコードの以下のコメントを入れておくことで、BME280のみデータの取得をおこない、BLEデータとしてアドバタイズします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/85b25ed8-e686-bac7-f5ad-ba2b0b13d9b8.png)

バッテリー駆動にするために、消費電力を抑えるための仕組みを入れてみています。
XIAOでArudino利用時のスリープ動作に関して、なかなかまとまった情報がなかったのですが、
こちらのスレッドの内容が一番役に立ちました。

https://forum.seeedstudio.com/t/system-on-sleep-of-xiao-ble/270472

スリープに関わる要点だけ抜き出してみます

```
// このライブラリが必要のようです
#include <Adafruit_SPIFlash.h>  // Need to be deleted /Documents/Arduino/libraries/SdFat

// setup()の中では以下の部分を実施しておきます。
  // Enable DC-DC converter
  NRF_POWER->DCDCEN = 1;  // Enable DC/DC converter for REG1 stage

  // Sleep QSPI flash
  flashTransport.begin();
  flashTransport.runCommand(0xB9);  // enter deep power-down mode
  flashTransport.end();

// loop()の中ではスリープするのみでよさそうです。
  //待ち時間を入れます。
  delay(delayTime);

```
この状態で消費電流を計測してみると、スリープしている期間の消費は5μアンペアです。かなり抑えられていますので、これで良しとしました。

![IMG_20240511_110830749-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/7a28970f-4b6e-de3b-dfc5-737a549fb99a.jpeg)


データフォーマットはヘッダー部分を除いて、以下のようにしています。

```
  // 温度
  0x10,0x00,0x00,
  // 湿度
  0x11,0x00,0x00,
  // 気圧
  0x14,0x00,0x00,
  // Battery voltage
  0x40,0x00,
  // CO2
  0x17,0x00,0x00
```

## 外観

簡単なものですが、プリント基板にしてみました。PCBGOGOさんにオーダーしました。

左側がBME280、右側下にXIAO BLEです。真ん中にあるジャンパは消費電流を測定する場合に利用しますが、通常はショートします。

![IMG_20240511_141426851_MP-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/60a6302b-1657-ca3a-00a4-211cf00fad6b.jpeg)


# 動作確認

まだ長時間の評価はしていませんが、ひとまずはデータがアドバタイズされています。

## CO2センサー付き

![Screenshot_20240512-173549-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/6f675f29-c5d2-0b63-cd48-635cc5069ea2.jpeg)


10 0AC2 温度 27.54℃
11 1140 湿度 44.16%
14 276A 気圧 1009 hPa
40 29 バッテリー (なし)
17 022B CO2 555 ppm


## CO2センサー無

![Screenshot_20240512-171310-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015969/f7b2429b-aa2b-f78f-cdc4-bf6ffc162951.jpeg)

10 0A19 温度 26.37℃
11 119D 湿度 47.23%
14 2770 気圧 1009 hPa
40 27   バッテリー 3.9V


# 今後の計画

ようやくセンサー部分ができました。あとはこのセンサーからデータを受信して、クラウドに送信するゲートウエイを別に準備しようと思います。
バッテリーの持続時間も気になるところなので、評価してみたいと思います。