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.