Nano 33 BLE Senseでマルチセンサ・ペリフェラルを作る (3) 搭載センサHTS221②

 前回、BatteryServiceのサンプルをベースに、温湿度センサHTS221の測定した温度と湿度を整数で送るペリフェラル・スケッチを作りました。あちこちにBatteryという名称が残っているので、Nano33BLEに即した名称に変えていきます。

 また、連載の第1回でも解説したようにGATTサーバは、複数のServiceとその中に複数のキャラを含んでいます。現在、デバイスはHTS221だけです。しかし、複数のセンサ・デバイスに対応していくとすれば、次のような構成が考えられます。

  • センサ・デバイスを一つのサービスとする
  • センサが測定できる各種データにそれぞれキャラを割り当てる
  • センサの値を読み取る関数
  • メイン

 現在、

  • メイン nano33sense_Peripheral
  • センサの値を読み取る関数 nano33sense

の二つを作りました。

 最初にサービスを記述したスケッチを作ります。最終的にできた四つのスケッチは、タブで並んだ状態です。本当は一つのスケッチでよいのですが、見通しが悪いので分割しました。通常分割したときは、別のプログラムを呼ぶときにinclude文が必要ですが、Arduino IDEではそれぞれがinoファイルであれば不要です。

 次回からセンサを追加していくときは、これら四つに分けたファイルにそれぞれ必要な記述を追加します。

nano33senseService

 新規タブでファイル名をnano33senseServiceにしました。Serviceを記述するスケッチです。中には、サービス名とサービスのUUIDを記述しました。

#include <ArduinoBLE.h>

#define HTS221_SERVICE_UUID  "F000AA20-0451-4000-B000-000000000000"

// BLE Service
BLEService Sensor_HTS221_Service(HTS221_SERVICE_UUID);

nano33senseCharacteristic

 新規タブでファイル名をnano33senseCharacteristicにしました。Characteristic(キャラ)を記述するファイルです。中には、キャラ名とキャラUUIDを記述しました。

#include <ArduinoBLE.h>

#define HTS221_Temp_Characteristic_UUID  "F000AA21-0451-4000-B000-000000000000"
#define HTS221_Humi_Characteristic_UUID  "F000AA22-0451-4000-B000-000000000000"

// BLE  Characteristic
BLEUnsignedCharCharacteristic HTS221_Temp(HTS221_Temp_Characteristic_UUID,
                                          BLERead | BLENotify);
BLEUnsignedCharCharacteristic HTS221_Humi(HTS221_Humi_Characteristic_UUID,
                                          BLERead | BLENotify);

メイン nano33sense_Peripheral

 Local NameをSensor_HTS221にしました。セントラルからscanして見える名前です。ベースとなったバッテリ・サービスで使われていた用語は取り除きました。

#include <ArduinoBLE.h>
#define localNAME "Sensor_HTS221"

int oldValue = 0;  // last value 
long previousMillis = 0;  // last time value was checked, in ms

void setup() {
  Serial.begin(9600);    // initialize serial communication
  while (!Serial);

  // begin initialization
  if (!BLE.begin()) {
    Serial.println("starting BLE failed!");
    while (1);
  }
  
  if (!HTS.begin()) {
    Serial.println("Failed to initialize humidity temperature sensor!");
    while (1);
  }

  BLE.setLocalName(localNAME);
  BLE.setAdvertisedService(Sensor_HTS221_Service); // add the service UUID
  Sensor_HTS221_Service.addCharacteristic(HTS221_Temp); // add characteristic
  Sensor_HTS221_Service.addCharacteristic(HTS221_Humi); // add characteristic
  BLE.addService(Sensor_HTS221_Service); // Add service
  HTS221_Temp.writeValue(oldValue); // set initial value for this characteristic
  HTS221_Humi.writeValue(oldValue); // set initial value for this characteristic

  // start advertising
  BLE.advertise();
  Serial.println("Bluetooth device active, waiting for connections...");
}

void loop() {
  // wait for a BLE central
  BLEDevice central = BLE.central();

  // if a central is connected to the peripheral:
  if (central) {
    Serial.print("Connected to central: ");
    // print the central's BT address:
    Serial.println(central.address());

    // check the battery level every 200ms
    // while the central is connected:
    while (central.connected()) {
      long currentMillis = millis();
      // if 200ms have passed, check value:
      if (currentMillis - previousMillis >= 200) {
        previousMillis = currentMillis;
        updateValue();
      }
    }
    // when the central disconnects
    Serial.print("Disconnected from central: ");
    Serial.println(central.address());
  }
}

void updateValue() {
  readHTS221();
  int valueof_HTS221_temperature = int(HTS221_temperature);
  int valueof_HTS221_humidity = int(HTS221_humidity);
  if (valueof_HTS221_temperature != oldValue) {      // if value has changed
    Serial.print("HTS221_temperature % is now: ");
    Serial.println(valueof_HTS221_temperature);
    Serial.print("HTS221_humidity % is now: ");
    Serial.println(valueof_HTS221_humidity);
    HTS221_Temp.writeValue(valueof_HTS221_temperature);  // update  characteristic
    HTS221_Humi.writeValue(valueof_HTS221_humidity);  // update  characteristic
    oldValue = valueof_HTS221_temperature;            // save the level for next comparison
  }
}

センサの値を読み取る関数 nano33sense

 前回から変更ありません。

#include <Arduino_HTS221.h>
float HTS221_temperature;
float HTS221_humidity;

void readHTS221() {
  HTS221_temperature = HTS.readTemperature();
  HTS221_humidity    = HTS.readHumidity();
}

 複数の#include <ArduinoBLE.h>がありますが、重複しているというようなエラーは出ません。

 実行中の様子です。

 RSL10 Bluetooth Low Enaergy Exploerの画面です。Notificationにチェックを入れるとエラーになっています。スケッチでは200msごとに温度をチェックし、値が変わっていたら、シリルモニタに最新値を表示します。しかし、セントラル側には通知が行っていません。

前へ

Nano 33 BLE Senseでマルチセンサ・ペリフェラルを作る (2) 搭載センサHTS221①

次へ

Nano 33 BLE Senseでマルチセンサ・ペリフェラルを作る (4) 気圧センサ LPS22HB