1
0
Fork 0

Add Bluetooth multimeter support

master
Gordon Williams 2022-04-25 11:45:06 +01:00
parent 6b5cc8b536
commit 39598a2d1f
7 changed files with 154 additions and 0 deletions

View File

@ -0,0 +1 @@
0.01: New App!

View File

@ -0,0 +1,32 @@
# Bluetooth Multimeter
Connect to compatible a Bluetooth Multimeters and display the result on your wrist!
## Compatible Bluetooth meters
Only the OWON is supported right now - feel free to add support for more!
### OWON OW18E
Available [on Amazon](https://www.amazon.co.uk/Bluetooth-Multimeter-Multimeters-Voltmeter-Resistance/dp/B08NJT38SF/ref=sr_1_1)
Turn the meter on, and long-press the Hz/Duty/Delta/Bluetooth button on the right hand side. Now run the app.
## Usage
The app currently only displays the current reading from the volt meter.
If the app fails to connect you'll need to reload it to reconnect.
To exit the app, long-press the button.
## Future functionality...
* Logging
* Graphs
* More than one meter
## Creator
Gordon Williams (please file issues via GitHub)

View File

@ -0,0 +1 @@
require("heatshrink").decompress(atob("mEw4kA///z3vy067fWlP7/t1r3f33vrU07tdxHKn1mnUEv92DgO75xUwmcziIAIiAWJgYXLiIuLC5dwC6xIJCwP/swAHsIXM5GZAA/HC4kCC42I7oAG3OXC4sgC4/e9v+939AQP7C40iC429C4Pu/wCC9YXHGAYXCzoXC3wCCC5AwDC4WZC4M+909AQM7C5AwCC4ef/tfn/dAQQXIDAQXDAA4XHJIYXBzNVAA9XC4K8CR4QwCC4Mzi93AA1xC4JBCC4QwCC4URABIXBCgaqDC5MWC4YRCI4hfC1VEmMX93u8MR/Pd6J3CCQJ3DR4YXF84XBR4ilDbAYXFagM3iP1R4YQBCwbXER4KHBRYaWBR4TWFYoQXCsKPKCIQuEC452BC6MxiPju8xiYZEI5gXBiLDHO5k+FgKSBCYM+C4inJAAMWmlEolDi8TC4jXJAAQWBAANBUoIXCCQQCBDgQXCn0z+gXDokRjwXCCIQXCDoQuHAAJlBC4ZBBC4kiC4ekC4lBI4ioDYQYXD1QXJXIR3DL4fjn4XBGIdBbQQXFYAYvE0gXEF5DXGC4IYBC4WhC5IFCC4dKC4QDB+KPDC4guCX4n6GAIXCmK/CuAXEAgQvEPAIXC14JDmAXDFwYXEeAKpCBAgXECwYXFeQVDC5AAFC400AwoXQAAwXJgYXWGBoWJAF4A==")

105
apps/btmultimeter/app.js Normal file
View File

@ -0,0 +1,105 @@
var decoded;
var gatt;
function decode(d) {
var value = d.getUint16(4,1);
if (value&32768)
value = -(value&32767);
var flags = d.getUint8(0);
var flags2 = d.getUint8(1);
// mv dc 27,240 "11xxx"
// mv ac 95,240 "1011xxx"
// v dc 36,240 "100xxx" 36(2dp) 35(20dp)
// v ac 100,240 "1100xxx" 100(2dp) 99(20dp) 97(2000dp)
// ohms 55,241 "110xxx"
// beep 231,242 "11100xxx"
// diode 167,242 "10100xxx"
// capac 76,241 "1001xxx"
// hz 162,241 "10100xxx"
// temp 33,242 "100xxx"
// ncv 96,243 "1100xxx"
// uA 146,240 "10010xxx"
// ma 155,240 "10011xxx"
// A 163,240 "10100xxx"
var dp = flags&7;
var range = (flags>>3)&7;
value *= Math.pow(10, -dp);
var isAC = !!(flags&64);
var mode = "?", units = "";
if (flags2==240) {
if (flags&128) {
mode = "current";
units = ["","nA","uA","mA","A","kA","MA",""][range];
} else {
mode = "voltage";
units = ["","nV","uV","mV","V","kV","MV",""][range] + " " + (isAC?"AC":"DC");
}
} else if (flags2==241) {
if (isAC) {
mode = "capacitance";
units = ["","nF","uF","mF","F","kF","MF",""][range];
} else if (flags&128) {
mode = "frequency";
units = "Hz";
} else {
mode = "resistance";
units = ["","nOhm","uOhm","mOhm","Ohm","kOhm","MOhm",""][range];
}
} else if (flags2==242) {
if (flags&128) mode = isAC ? "continuity" : "diode";
else {
mode = "temperature";
units = isAC ? "F" : "C";
}
} else if (flags2==243) mode = "ncv";
//console.log(mode+" "+value+" "+units,new Uint8Array(d.buffer).slice());
decoded = {
value : value,
mode : mode, // current/voltage/capacitance/frequency/resistance/temperature
units : units, // eg 'mA'
raw : new Uint8Array(d.buffer).slice(),
};
updateDisplay(decoded);
}
function updateDisplay(d) {
var mode = d.mode;
mode = mode.substr(0,1).toUpperCase()+mode.substr(1);
var s = d.value.toString();
var R = Bangle.appRect;
g.reset().clearRect(R);
g.setFont("12x20").setFontAlign(-1,-1).drawString(mode, R.x, R.y);
g.setFont("12x20").setFontAlign(1,1).drawString(d.units, R.x+R.w-1, R.y+R.h-1);
var fontSize = 80;
g.setFont("Vector",fontSize).setFontAlign(0,0);
while (g.stringWidth(s) > R.w-20) {
fontSize -= 2;
g.setFont("Vector", fontSize);
}
g.drawString(s, R.x+R.w/2, R.y+R.h/2);
}
Bangle.loadWidgets();
Bangle.drawWidgets();
E.showMessage(/*LANG*/"Connecting...");
NRF.requestDevice({ filters: [{ name: 'BDM' }] }).then(function(device) {
return device.gatt.connect();
}).then(function(g) {
gatt = g;
return gatt.getPrimaryService(0xFFF0);
}).then(function(service) {
return service.getCharacteristic(0xFFF4);
}).then(function(c) {
c.on('characteristicvaluechanged', function(event) {
d = event.target.value;
decode(d);
});
return c.startNotifications();
}).then(function() {
E.showMessage(/*LANG*/"Connected.");
}).catch(function(e) {
E.showMessage(e.toString());
});

BIN
apps/btmultimeter/app.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -0,0 +1,15 @@
{ "id": "btmultimeter",
"name": "Bluetooth Multimeter",
"shortName":"BT Meter",
"version":"0.01",
"description": "Connect to compatible a Bluetooth Multimeters and display the result on your wrist!",
"icon": "app.png",
"tags": "bluetooth,tool",
"screenshots" : [ { "url":"screenshot.png" } ],
"supports" : ["BANGLEJS","BANGLEJS2"],
"readme": "README.md",
"storage": [
{"name":"btmultimeter.app.js","url":"app.js"},
{"name":"btmultimeter.img","url":"app-icon.js","evaluate":true}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB