デジタルマルチメータ OWON B35T (+) のデータを BLE で読んでみました (2017/05/24)
Bluetooth LE なので、Android / iOS から使えます。
■スクリーンショット(Android)

// for OWON BT35T
// Delphi 10.2 Tokyo
unit BDMUnit;
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.Controls.Presentation, FMX.StdCtrls,
System.Bluetooth.Components, FMX.ScrollBox, FMX.Memo, FMX.Edit,
Math, FMX.Objects;
type
TForm2 = class(TForm)
BluetoothLE1: TBluetoothLE;
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Rectangle1: TRectangle;
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 宣言 }
fBDMDevice : TBluetoothLEDevice;
fBDMService : TBluetoothGattService;
public
{ public 宣言 }
end;
var
Form2: TForm2;
const
BDMName : String = 'BDM';
BDMService : TBluetoothUUID = '{0000FFF0-0000-1000-8000-00805F9B34FB}';
BDMNotify : TBluetoothUUID = '{0000FFF4-0000-1000-8000-00805F9B34FB}';
implementation
{$R *.fmx}
// 受信
procedure TForm2.BluetoothLE1CharacteristicRead(const Sender: TObject;
const ACharacteristic: TBluetoothGattCharacteristic;
AGattStatus: TBluetoothGattStatus);
var
s : string;
B : TBytes;
i : integer;
v : integer;
dp : integer;
f : double;
u : string;
begin
B := ACharacteristic.GetValue;
s := '';
// 値は6バイト
for i := 0 to Length(B) -1 do
s := s + IntToHex(B[i], 2);
// 16進文字列として表示
Edit2.Text := s;
// 数値(LH反転)
v := Integer(B[5] shl 8 + B[4]);
if v and $8000 > 0 then v := - (v and $7FFF);
// 小数点位置
dp := B[0] and 3;
// 測定値
f := v / Power(10, dp);
Edit1.Text := Format('%.' + dp.ToString + 'f', [f]);
Label1.Text := Format('%.' + dp.ToString + 'f', [f]);
// オーバーフロー
if B[0] and 4 > 0 then Edit1.Text := 'OL';
// AC/DC
case B[0] shr 4 of
1,9: u := 'DC';
5: if B[1] and 1 = 0 then u := 'AC';
6,13: u := 'AC';
10: if B[1] and 3 = 0 then u := 'DC';
14: if B[1] and 3 = 0 then u := 'AC';
end;
Edit1.Text := u + ' '+ Edit1.Text;
// 単位
case B[0] shr 4 of
1: u := 'mV'; // DC
2: if B[1] and 3 = 3 then u := 'hFE'
else if B[1] and 2 > 0 then u := '℃'
else if B[1] and 1 > 0 then begin
if B[0] and 8 > 0 then u := 'KΩ'
else u := 'Ω';
end;
3: if B[1] and 1 > 0 then u := 'MΩ';
4: if B[1] and 1 > 0 then u := 'nF';
5: if B[1] and 1 > 0 then u := 'μF'
else u := 'mV'; // AC
6: u := 'V'; // AC
9: if B[0] and 8 = 8 then u := 'mA' // DC
else u := 'μA'; // DC
10: if B[1] and 2 > 0 then u := 'Diode'
else if B[1] and 1 > 0 then u := 'Hz'
else u := 'A'; // DC
13: if B[0] and 8 = 8 then u := 'mA' // AC
else u := 'μA'; // AC
14: if B[1] and 2 > 0 then u := 'Beep'
else if B[1] and 1 > 0 then u := '%'
else u := 'A'; // AC
end;
Edit1.Text := Edit1.Text + ' ' + u;
if B[2] and 1 > 0 then
Edit1.Text := Edit1.Text + ' HOLD';
if B[2] and 4 > 0 then
Edit1.Text := Edit1.Text + ' AUTO';
if B[2] and 32 = 32 then
Edit1.Text := Edit1.Text + ' MAX';
if B[2] and 16 = 16 then
Edit1.Text := Edit1.Text + ' MIN';
if B[2] and 2 = 2 then
Edit1.Text := Edit1.Text + ' Δ';
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 = BDMName then begin
// デバイスを保持
fBDMDevice := ADeviceList[i];
// サービスの検索を開始
if not ADeviceList[i].DiscoverServices then begin
ShowMessage('サービスは使用できません.');
end;
end;
end;
end;
end;
// サービス検索終了
procedure TForm2.BluetoothLE1EndDiscoverServices(const Sender: TObject;
const AServiceList: TBluetoothGattServiceList);
var
i : integer;
NotifyCharact : TBluetoothGattCharacteristic;
begin
fBDMService := 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 = BDMService then begin
// サービスを保持
fBDMService := AServiceList[i];
Break;
end;
end;
end;
if fBDMService <> nil then begin
for i := 0 to fBDMService.Characteristics.Count -1 do begin
if fBDMService.Characteristics[i].UUID = BDMNotify then begin
// 通知を設定
NotifyCharact := fBDMService.Characteristics[i];
fBDMDevice.SetCharacteristicNotification(NotifyCharact, true);
break;
end;
end;
end;
end;
// BLE 検索、接続
procedure TForm2.Button1Click(Sender: TObject);
begin
BluetoothLE1.Enabled := True;
// BLE デバイスの検索を開始
BluetoothLE1.DiscoverDevices(500);
end;
end.