From 39598a2d1f178a6ba08bcb4f768ea7336465b309 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 25 Apr 2022 11:45:06 +0100 Subject: [PATCH] Add Bluetooth multimeter support --- apps/btmultimeter/ChangeLog | 1 + apps/btmultimeter/README.md | 32 ++++++++++ apps/btmultimeter/app-icon.js | 1 + apps/btmultimeter/app.js | 105 +++++++++++++++++++++++++++++++ apps/btmultimeter/app.png | Bin 0 -> 13454 bytes apps/btmultimeter/metadata.json | 15 +++++ apps/btmultimeter/screenshot.png | Bin 0 -> 2696 bytes 7 files changed, 154 insertions(+) create mode 100644 apps/btmultimeter/ChangeLog create mode 100644 apps/btmultimeter/README.md create mode 100644 apps/btmultimeter/app-icon.js create mode 100644 apps/btmultimeter/app.js create mode 100644 apps/btmultimeter/app.png create mode 100644 apps/btmultimeter/metadata.json create mode 100644 apps/btmultimeter/screenshot.png diff --git a/apps/btmultimeter/ChangeLog b/apps/btmultimeter/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/btmultimeter/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/btmultimeter/README.md b/apps/btmultimeter/README.md new file mode 100644 index 000000000..80fcdcf50 --- /dev/null +++ b/apps/btmultimeter/README.md @@ -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) diff --git a/apps/btmultimeter/app-icon.js b/apps/btmultimeter/app-icon.js new file mode 100644 index 000000000..d1e10b1ce --- /dev/null +++ b/apps/btmultimeter/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4kA///z3vy067fWlP7/t1r3f33vrU07tdxHKn1mnUEv92DgO75xUwmcziIAIiAWJgYXLiIuLC5dwC6xIJCwP/swAHsIXM5GZAA/HC4kCC42I7oAG3OXC4sgC4/e9v+939AQP7C40iC429C4Pu/wCC9YXHGAYXCzoXC3wCCC5AwDC4WZC4M+909AQM7C5AwCC4ef/tfn/dAQQXIDAQXDAA4XHJIYXBzNVAA9XC4K8CR4QwCC4Mzi93AA1xC4JBCC4QwCC4URABIXBCgaqDC5MWC4YRCI4hfC1VEmMX93u8MR/Pd6J3CCQJ3DR4YXF84XBR4ilDbAYXFagM3iP1R4YQBCwbXER4KHBRYaWBR4TWFYoQXCsKPKCIQuEC452BC6MxiPju8xiYZEI5gXBiLDHO5k+FgKSBCYM+C4inJAAMWmlEolDi8TC4jXJAAQWBAANBUoIXCCQQCBDgQXCn0z+gXDokRjwXCCIQXCDoQuHAAJlBC4ZBBC4kiC4ekC4lBI4ioDYQYXD1QXJXIR3DL4fjn4XBGIdBbQQXFYAYvE0gXEF5DXGC4IYBC4WhC5IFCC4dKC4QDB+KPDC4guCX4n6GAIXCmK/CuAXEAgQvEPAIXC14JDmAXDFwYXEeAKpCBAgXECwYXFeQVDC5AAFC400AwoXQAAwXJgYXWGBoWJAF4A==") diff --git a/apps/btmultimeter/app.js b/apps/btmultimeter/app.js new file mode 100644 index 000000000..11bcca9fb --- /dev/null +++ b/apps/btmultimeter/app.js @@ -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()); +}); diff --git a/apps/btmultimeter/app.png b/apps/btmultimeter/app.png new file mode 100644 index 0000000000000000000000000000000000000000..e9e75c76e04b58368611ba309134a776eec81fd4 GIT binary patch literal 13454 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 literal 0 HcmV?d00001 diff --git a/apps/btmultimeter/metadata.json b/apps/btmultimeter/metadata.json new file mode 100644 index 000000000..3a9a72063 --- /dev/null +++ b/apps/btmultimeter/metadata.json @@ -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} + ] +} diff --git a/apps/btmultimeter/screenshot.png b/apps/btmultimeter/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd64eabf95a4730ab1d00f6c4f522671b6ddc64 GIT binary patch literal 2696 zcmdT`_g9k%7EL~bkOZWJG6NA|DI+F`NI<&6fFV>tAVC<&fD(vQ5lE!O4+}zcGE`9n zDIyL86FM0wkveom1R;nS+K3b>N<{nV^WM4V-S^WyH|3l&UJ9X%fIuKp z1UnnIedPY9Bo6L(PW_DUK0u?~@Yay$1L%1O1Yu3Ev2v&RF69Ygicd&Fa=(B7xJVF$ z=+ss)FM;HZNc}3DGWtO9HqG+!p!A+q!BJ2gP+CF>gD_wO(_}anZI!$v7(%~ITnj&vAW(Sde!}A zyMnKgBATAG2+wP|-@pSzo+KC9Sfz-%y<lmK6P2v=_0H zy?uyy?(ZY>7QpY#fBUStUOP1WN`)!(?cEa4=f+uu)kNKVSEz(g`50TPu&~ zBwU)tEjdkW@IDW2xQjPnRz@dh7Ybv;S$!%dhi4wRQc$$v_1$W6Z$QmtuVl($z~Sa0 zOJ7^z&wdx}Fzl;4LRG(O-}ZlhSdf4cB~sNB0xD|lrHSNj$vPRi!mVivJ>he=hCi~h zMSZb3rP>mCc9L#lC~H0yG(&T0j?Ct4uX|TeX^O z1#_m~&W^{R0nTzn#12LRyA(?KeO1HO;ES;+0+5KOA??VwA;93P>4`RYW1{8kdbIZ! zmtPk}VXs%Ef5HQ$YFtO*WBd`n(`~o-r5{DJ>1Tw!wO@S2)K{9mCGe<>Ci~@tlwa0o zHzth=zaGS2tK;Q`lM9#vlZHZAN`O(YL2FWe4omc}N?4F@TC zEyLALIA>}{AVIGL2QyR0JvV^0(XtrK(OE5lH3u@EQEedLYB3H9JO17>9ZyCdb%KBn z^{g4$AH?lZXM{sb8gy7EI0TbvxVmkp3Pu+E@2Oi_fZyMuFP?v>A9I-xXWIB3b8X?6 zxRa4Lp8-WLJU3Le3ry6C?6^4 z7PPvf276*~lj#CEkf?z6$T=7@tBm7$lc-a{In*xFm7j%&Ko2J-)tM7H-l$6t3ZRN* zb$VSvD$$}VT|1I5pQPYQEE|@*XM=&&_2qiq zz!90Y?z-8=llinkg9^UuT60F$!z#e1Ls`?gY0i7oHfj|SY%!?GHEalsH)>E=uecLD zwx-7Itg#L7JjHmtk-FvCJ{)h~03%*) zg&;Qa7lshVqt#%zF+L;q@z3~pK1u(dH2vba>?u2?OwsCl_Qzy67Fx+xRg`cm##YvB zyI*#6_$|A#*!)Q%=`!t}-`h4nK|Q4t`{I)p33EP`x>;ty&2nI z=>zX5jk1JRwYQa1ona675B+P%fiTl6gQcPG`i_}KJ>NJxTy>55EsV!~GN~s^I^UkQ zc7b>pKGlaX#|Rg(5dzEvcd4m{kv}*rm$egRvD3>8S2v*2lyfKU$y>LVOX^ptAAw{n~WLXPV zhf`N6@I1ND-?#U)Q*ab%=Aw&de4_J6)aY<^_6p{&%h1xSd|jJdYNoUffY(}32>D8% z%p2H=&+0p6KOGy$J+F9Q0N(-7Z`o{Z`r`m^z5G-kN5DZUBR_6{L2kGC z{nIO)Z)#e{zwAxtTSrDR`n7z7KXfz~(T-Tz!i~=}wUZxgK4ei{4k<$^Ya27T9avRk ziuW%QmaedDj}#x!u$=qoH4O$Z)>DEe%8)1jBzVP<`^zjfRuISQ-&?bNLOpRk>+Ql0ZfImmdVRIn>1x0B-2S}h(Gst86=W>nLZ|x_FbB|!X z+SmDG?GN-aAwcq!Ch7k`vhiK~=N9SF?cAuLRU&WbL(b)n<-F=6On%4B9%rJQyJ@om zP4m+RNiT5WyR5O`j{iC#$-YYq6m^x*wx=b09G@*-t+1|Lt8VAs-Oc>|r-aj@nlpceX{A#HcgYk51H@aNdLbw+0x%OPOwKyfjX z|G10D>Y||g4Il)2SWNBB3@l9Moi($vRFlhSD)&mDr$zR7P8#UInkgUjJZftm*EatZ zl-N>O-7@z==Dyo}j(;F*`BGo~>)+