Smart gadget SHT4x を使って電子百葉箱を作る ② Seeed Studio XIAO nRF52840

 マイコン・ボードSeeed Studio XIAO nRF52840を使ってセントラルにし、Smart gadget SHT4xに接続し、温度と湿度を読み出します。

Arduino IDEを使えるように

 Getting Started with Seeed Studio XIAO nRF52840 (Sense)

に手順が書いてありますが、すんなりその通りには動きません。Seeed StudioのWebは、ソフトなどがいろいろ更新されても、初期のままです。

 Arduino IDE1.8.19のファイルから環境設定を選択します。

 追加のボードマネージャのURLに、次の記述を追加します。別の記述があったときは、カンマで区切ります。

  https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json

 ツールから、ボード、ボードマネージャを開きます。

 検索欄にSeeed nRF52を入れます。

 最初に見つけたのをインストールしたら、ダウンロードエラーが出ました。下側のをインストールします。

 WiFiがどうこうというエラーが出ますが、無視しました。

 ツールからボードマネージャ、Seeed nRF52 mbed-enabled Boards-Seeed Studio BLE nRF52840 を選択します。

 商品名はSeeed Studio XIAO nRF52840ですが、ボード名はSeeed Studio BLE nRF52840です。

スケッチ

 温度と湿度のデータは実数で送ってきます。

 それぞれのデータは、IEEE-754のフォーマットで、単精度浮動小数点数の形式:binary32です。4バイトのバイト列でデータが送られます。

 リトル・エンディアンなので、4バイト目から取り出します。

uint32_t data = ((uint8_t)*(Temperature_Characteristic.value()+3) << 24) + ((uint8_t)*(Temperature_Characteristic.value()+2) << 16) + ((uint8_t)*(Temperature_Characteristic.value()+1) << 8) + ((uint8_t)*Temperature_Characteristic.value());

 符号を取り出します。

int32_t f = pow(-1, int(bitRead(data,31)));

 仮数を取り出します。

double k =1 + ((((data<<1)<<8)>>9))/pow(2,23);

 指数を取り出します。

int32_t s = pow(2,((((data<<1)>>24))-127));

 三つをかけると、実数に戻ります。

2022/09/10 T_Characteristic_UUIDとH_Characteristic_UUIDが逆になっていました。入れ替えてください)


#include <ArduinoBLE.h>
#define localNAME "SHT40 Gadget"
#define T_Characteristic_UUID    "00001235-b38d-4985-720e-0f993a68ee41"
#define H_Characteristic_UUID    "00002235-b38d-4985-720e-0f993a68ee41"

void setup() {
  Serial.begin(9600);
  while (!Serial);
  BLE.begin();
  Serial.println("\n start BLE Central - Temperature/Humidity");
  // start scanning for peripherals
  BLE.scanForName(localNAME);
}

void loop() {
  // check if a peripheral has been discovered
  BLEDevice peripheral = BLE.available();

  if (peripheral) {
    // discovered a peripheral, print out address, local name, and advertised service
    Serial.print("Found ");
    Serial.print(peripheral.address());
    Serial.print(" '");
    Serial.print(peripheral.localName());
    Serial.print("' ");
    Serial.print(peripheral.advertisedServiceUuid());
    Serial.println();

    if (peripheral.localName() != localNAME) {
      return;
    }
    // stop scanning
    BLE.stopScan();

    readData(peripheral);

    // peripheral disconnected, start scanning again
    BLE.scanForName(localNAME);
  }
}

void readData(BLEDevice peripheral) {
  // connect to the peripheral
  Serial.print("\nConnecting ...");

  if (peripheral.connect()) {
    Serial.println("Connected");
  } else {
    Serial.println("Failed to connect!");
    return;
  }

  // discover peripheral attributes
  Serial.print("Discovering attributes ...");
  if (peripheral.discoverAttributes()) {
    Serial.println("Attributes discovered\n");
  } else {
    Serial.println("Attribute discovery failed!");
    peripheral.disconnect();
    return;
  }
  // retrieve the SCD30characteristic
  BLECharacteristic Temperature_Characteristic = peripheral.characteristic(T_Characteristic_UUID);
  BLECharacteristic Humidity_Characteristic  = peripheral.characteristic(H_Characteristic_UUID);

  if (!Temperature_Characteristic) {
    Serial.println("Peripheral does not have Temp characteristic!");
    peripheral.disconnect();
    return;
  } 

  Serial.println("---Found CHARACTERISTIC_UUID");
  while (peripheral.connected()) {
  if (Temperature_Characteristic.canRead()) {
    // read the characteristic value
    Temperature_Characteristic.read();
    if (Temperature_Characteristic.valueLength() > 0) {
      uint32_t  data = ((uint8_t)*(Temperature_Characteristic.value()+3) << 24) + ((uint8_t)*(Temperature_Characteristic.value()+2) << 16) + ((uint8_t)*(Temperature_Characteristic.value()+1) << 8)  +  ((uint8_t)*Temperature_Characteristic.value());
      int32_t f = pow(-1, int(bitRead(data,31)));
      double k =1 + ((((data<<1)<<8)>>9))/pow(2,23); 
      int32_t s = pow(2,((((data<<1)>>24))-127));
      Serial.print("\ntemp =");
      Serial.println(f*k*s);

      Humidity_Characteristic.read();
      data = ((uint8_t)*(Humidity_Characteristic.value()+3) << 24) + ((uint8_t)*(Humidity_Characteristic.value()+2) << 16) + ((uint8_t)*(Humidity_Characteristic.value()+1) << 8)  +  ((uint8_t)*Humidity_Characteristic.value());
      f = pow(-1, int(bitRead(data,31)));
      k =1 + ((((data<<1)<<8)>>9))/pow(2,23); 
      s = pow(2,((((data<<1)>>24))-127));
      Serial.print("humi =");
      Serial.println(f*k*s);
      delay(30000);
    }
  }
}
 
  Serial.println("Peripheral disconnected");
}

 実行中の様子です。スケッチの実行時、Smart gadget SHT4xのボタンを1回押し、アドバタイジング・モードにします。この操作は、一度つながると、次からは不要です。

前へ

Smart gadget SHT4x を使って電子百葉箱を作る ① 準備

次へ

Smart gadget SHT4x を使って電子百葉箱を作る ③ Arduino MKR WiFi 1010