SHT31(温度 / 湿度センサ) スマートガジェット開発キット (2017/05/31)

メーカーリンクは、こちらです。(画像は、RSコンポーネンツより)

開発モジュールキットという難しそうな名前ですが、
・コイン電池付で、そのまま使える
・単体で湿度/露点温度、温度のLCD表示
・Bluetooth LE 搭載で、iPhone、Android のアプリでの表示、ロギングも可能。
・スペック上の精度は、±0.3 ℃, ±2 %RH。


これだけ出来て、¥3,678.(RSコンポーネンツ

相対湿度、温度のデータを、Delphi の Bluetooth LE コンポーネントで通信(受信)してみました。
露点温度は、温度 - 相対湿度から計算する必要があります。



// Delphi 10.2 Tokyo

unit Sht31Unit;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  System.Bluetooth, FMX.ScrollBox, FMX.Memo, FMX.Controls.Presentation,
  FMX.StdCtrls, System.Bluetooth.Components;

type
  TForm2 = class(TForm)
    BluetoothLE1: TBluetoothLE;
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure BluetoothLE1EndDiscoverDevices(const Sender: TObject;
      const ADeviceList: TBluetoothLEDeviceList);
    procedure BluetoothLE1EndDiscoverServices(const Sender: TObject;
      const AServiceList: TBluetoothGattServiceList);
    procedure BluetoothLE1CharacteristicRead(const Sender: TObject;
      const ACharacteristic: TBluetoothGattCharacteristic;
      AGattStatus: TBluetoothGattStatus);
  private
    { private 宣言 }
    fSHTDevice   : TBluetoothLEDevice;
    fHumiService : TBluetoothGattService;
    fTempService : TBluetoothGattService;
  public
    { public 宣言 }
  end;

var
  Form2: TForm2;

const
  DevName     : string = 'Smart Humigadget';
  HumiService : TBluetoothUUID = '{00001234-B38D-4985-720E-0F993A68EE41}';
  // Read Notify
  HumiNotify  : TBluetoothUUID = '{00001235-B38D-4985-720E-0F993A68EE41}';
  TempService : TBluetoothUUID = '{00002234-B38D-4985-720E-0F993A68EE41}';
  // Read Notify
  TempNotify  : TBluetoothUUID = '{00002235-B38D-4985-720E-0F993A68EE41}';

implementation

{$R *.fmx}

// 受信
procedure TForm2.BluetoothLE1CharacteristicRead(const Sender: TObject;
  const ACharacteristic: TBluetoothGattCharacteristic;
  AGattStatus: TBluetoothGattStatus);
var
  f : single;
begin
  f := ACharacteristic.GetValueAsSingle();
  // 湿度
  if ACharacteristic.UUID = HumiNotify then
    Label1.Text := Format('%.1f', [f]) + ' [%RH]';
  // 温度
  if ACharacteristic.UUID = TempNotify then
    Label2.Text := Format('%.1f', [f]) + ' [℃]';
end;

// デバイス検索終了
procedure TForm2.BluetoothLE1EndDiscoverDevices(const Sender: TObject;
  const ADeviceList: TBluetoothLEDeviceList);
var
  i : integer;
begin
  if ADeviceList.Count > 0 then begin
    for i := 0 to ADeviceList.Count - 1 do begin
      Memo1.Lines.Add(ADeviceList[i].DeviceName);
      if ADeviceList[i].DeviceName = DevName then begin
        fSHTDevice := ADeviceList[i];
        if not ADeviceList[i].DiscoverServices then
          ShowMessage('サービスは使用できません.');
      end;
    end;
  end;
end;

// サービス検索終了
procedure TForm2.BluetoothLE1EndDiscoverServices(const Sender: TObject;
  const AServiceList: TBluetoothGattServiceList);
var
  i : integer;
  NotifyCharact : TBluetoothGattCharacteristic;
begin
  fHumiService := nil;
  fTempService := nil;

  if AServiceList.Count > 0 then begin
    for i := 0 to AServiceList.Count -1 do begin
      Memo1.Lines.Add(AServiceList[i].UUID.ToString);
      if AServiceList[i].UUID = HumiService then
        fHumiService := AServiceList[i];
      if AServiceList[i].UUID = TempService then
        fTempService := AServiceList[i];
    end;
  end;
  // 湿度
  if fHumiService <> nil then begin
    for i := 0 to fHumiService.Characteristics.Count -1 do begin
      if fHumiService.Characteristics[i].UUID = HumiNotify then begin
        // 通知を設定
        NotifyCharact := fHumiService.Characteristics[i];
        fSHTDevice.SetCharacteristicNotification(NotifyCharact, true);
        break;
      end;
    end;
  end;
  // 温度
  if fTempService <> nil then begin
    for i := 0 to fTempService.Characteristics.Count -1 do begin
      if fTempService.Characteristics[i].UUID = TempNotify then begin
        // 通知を設定
        NotifyCharact := fTempService.Characteristics[i];
        fSHTDevice.SetCharacteristicNotification(NotifyCharact, true);
        break;
      end;
    end;
  end;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  BluetoothLE1.Enabled := True;
  // BLE デバイスの検索を開始
  BluetoothLE1.DiscoverDevices(5000);
end;

end.