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.