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

 ここでは、気圧センサ LPS22HBを追加します。

● LPS22HBのおもなスペック

  • 動作電圧 1.7~3.6V
  • 測定範囲 260~1260hPa 
  • 気圧分解能 24ビット
  • 温度分解能 16ビット
  • インターフェース I2CとSPI

ライブラリを導入

 ライブラリ管理からLPS22HBを検索して見つかったArduino_LPS22HBをインストールします。

 サンプル・スケッチReadPressureを読み込み、コンパイル、書き込み、実行します。温度は気圧の補正に使われ、気圧のみの出力です。

 前回の温湿度センサHTS221で四つのファイルを作りました。それぞれ内容を更新します。Arduino IDEのタブの様子です。

 inoファイルは同じディレクトリに入っています。

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

 BARO.readPressure()の値はkPaの単位だったので10倍して、hPaにします。何度が実験しましたが、読み出した1回目の値はおかしいです。2度目からの読み取りは正常になります。

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

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

void readLPS22HB() {
  LPS22HB_pressure = BARO.readPressure() * 10; // hpa
}

nano33senseServiceに追加

 サービス名とサービスのUUIDを記述を追加しました。

#include <ArduinoBLE.h>

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

// BLE Service
BLEService Sensor_HTS221_Service(HTS221_SERVICE_UUID);
BLEService Sensor_LPS22HB_Service(LPS22HB_SERVICE_UUID);

nano33senseCharacteristicに追加

 キャラ名とキャラのUUIDを記述を追加しました。前回、温度のコンストラクタをBLEUnsignedCharCharacteristicで宣言していましたが、零下が扱えないので、BLECharCharacteristicに変更しました。また、気圧は256を超える数値なので、16ビットのBLEUnsignedIntCharacteristicにしました。

#include <ArduinoBLE.h>

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

// BLE  Characteristic
BLECharCharacteristic HTS221_Temp(HTS221_Temp_Characteristic_UUID,
                                          BLERead | BLENotify);
BLEUnsignedCharCharacteristic HTS221_Humi(HTS221_Humi_Characteristic_UUID,
                                          BLERead | BLENotify);
BLEUnsignedIntCharacteristic  LPS22HB_Press(LPS22HB_Press_Characteristic_UUID,
                                          BLERead | BLENotify);

メインnano33sense_Peripheral

 localNAMEをHTS221_LPS22HBに変更しました。気圧センサ LPS22HBの最初のデータはおかしいので、初期化のあと1回、空読みをしています。

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

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);
  }

if (!BARO.begin()) {
Serial.println("Failed to initialize pressure sensor!");
while (1);
}
readLPS22HB(); // karayomi BLE.setLocalName(localNAME); BLE.setAdvertisedService(Sensor_HTS221_Service); // add the service UUID BLE.setAdvertisedService(Sensor_LPS22HB_Service); // add the service UUID Sensor_HTS221_Service.addCharacteristic(HTS221_Temp); // add characteristic Sensor_HTS221_Service.addCharacteristic(HTS221_Humi); // add characteristic Sensor_LPS22HB_Service.addCharacteristic(LPS22HB_Press); // add characteristic BLE.addService(Sensor_HTS221_Service); // Add service BLE.addService(Sensor_LPS22HB_Service); // Add service HTS221_Temp.writeValue(oldValue); // set initial value for this characteristic HTS221_Humi.writeValue(oldValue); // set initial value for this characteristic LPS22HB_Press.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(); readLPS22HB(); int valueof_HTS221_temperature = int(HTS221_temperature); int valueof_HTS221_humidity = int(HTS221_humidity); int valueof_LPS22HB_Pressure = int(LPS22HB_pressure); 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); Serial.print("LPS22HB_Pressure % is now: "); Serial.println(valueof_LPS22HB_Pressure); HTS221_Temp.writeValue(valueof_HTS221_temperature); // update characteristic HTS221_Humi.writeValue(valueof_HTS221_humidity); // update characteristic LPS22HB_Press.writeValue(valueof_LPS22HB_Pressure); // update characteristic oldValue = valueof_HTS221_temperature; // save the level for next comparison } }

 実行結果です。

 正しく送れていることがわかります。

前へ

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

次へ

Nano 33 BLE Senseでマルチセンサ・ペリフェラルを作る (5) 近接センサ APDS9960