UNPKG

6.21 kBJavaScriptView Raw
1var Emitter = require("events").EventEmitter;
2var util = require("util");
3
4var Board = require("./board");
5var Fn = require("./fn");
6
7var toFixed = Fn.toFixed;
8
9
10var Controllers = {
11 MPL115A2: {
12 initialize: {
13 value: function(opts, dataHandler) {
14 var Multi = require("./imu");
15 var driver = Multi.Drivers.get(this.board, "MPL115A2", opts);
16 driver.on("data", function(data) {
17 dataHandler.call(this, data.pressure);
18 }.bind(this));
19 }
20 },
21 // kPa (Kilopascals)
22 toPressure: {
23 value: function(raw) {
24 // Datasheet available at http://cache.freescale.com/files/sensors/doc/data_sheet/MPL115A2.pdf
25 // Pressure output in kPa explained at P. 6, Eqn. 2
26 var output = ((65 / 1023) * raw) + 50;
27 // Typical resolution 0.15kPa from paragraph 2.2 page 3
28 return toFixed(output, 2);
29 }
30 }
31 },
32 MPL3115A2: {
33 initialize: {
34 value: function(opts, dataHandler) {
35 var Multi = require("./imu");
36 var driver = Multi.Drivers.get(this.board, "MPL3115A2", opts);
37 driver.on("data", function(data) {
38 dataHandler.call(this, data.pressure);
39 }.bind(this));
40 }
41 },
42 // kPa (Kilopascals)
43 toPressure: {
44 value: function(raw) {
45 // formulas extracted from code example:
46 // https://github.com/adafruit/Adafruit_MPL3115A2_Library
47 var inches = (raw / 4) / 3377;
48 var output = inches * 3.39;
49 // Datasheet available at https://www.nxp.com/docs/en/data-sheet/MPL3115A2.pdf
50 // From Table 5, page 8
51 // Typical resolution 1.5Pa = 0.0015kPa
52 return toFixed(output, 4);
53 }
54 }
55 },
56 BMP180: {
57 initialize: {
58 value: function(opts, dataHandler) {
59 var Multi = require("./imu");
60 var driver = Multi.Drivers.get(this.board, "BMP180", opts);
61 driver.on("data", function(data) {
62 dataHandler.call(this, data.pressure);
63 }.bind(this));
64 }
65 },
66 // kPa (Kilopascals)
67 toPressure: {
68 value: function(raw) {
69 // Datasheet available at https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BMP180-DS000-121.pdf
70 // From Table 1, page 6
71 // Typical resolution 0.01hPa = 0.001kPa
72 return toFixed(raw / 1000, 3);
73 }
74 }
75 },
76 BMP280: {
77 initialize: {
78 value: function(opts, dataHandler) {
79 var Multi = require("./imu");
80 var driver = Multi.Drivers.get(this.board, "BMP280", opts);
81 driver.on("data", function(data) {
82 dataHandler.call(this, data.pressure);
83 }.bind(this));
84 }
85 },
86 // kPa (Kilopascals)
87 toPressure: {
88 value: function(raw) {
89 // Datasheet available at https://cdn-shop.adafruit.com/datasheets/BST-BMP280-DS001-11.pdf
90 // From Table 2, page 8
91 // Resolution in ultra high resolution mode 0.0016hPa = 0.00016kPa
92 return toFixed(raw / 1000, 5);
93 }
94 }
95 },
96 BME280: {
97 initialize: {
98 value: function(opts, dataHandler) {
99 var Multi = require("./imu");
100 var driver = Multi.Drivers.get(this.board, "BME280", opts);
101 driver.on("data", function(data) {
102 dataHandler.call(this, data.pressure);
103 }.bind(this));
104 }
105 },
106 // kPa (Kilopascals)
107 toPressure: {
108 value: function(raw) {
109 // Datasheet available at https://cdn.sparkfun.com/assets/learn_tutorials/4/1/9/BST-BME280_DS001-10.pdf
110 // From Table 3, page 10
111 // Typical resolution 0.18Pa = 0.00018kPa
112 return toFixed(raw / 1000, 5);
113 }
114 }
115 },
116 MS5611: {
117 initialize: {
118 value: function(opts, dataHandler) {
119 var Multi = require("./imu");
120 var driver = Multi.Drivers.get(this.board, "MS5611", opts);
121 driver.on("data", function(data) {
122 dataHandler.call(this, data.pressure);
123 }.bind(this));
124 }
125 },
126 // kPa (Kilopascals)
127 toPressure: {
128 value: function(raw) {
129 // Datasheet available at http://www.te.com/commerce/DocumentDelivery/DDEController?Action=srchrtrv&DocNm=MS5611-01BA03&DocType=Data+Sheet&DocLang=English
130 // From table in page 2
131 // Resolution Over sampling ratio
132 // 0.065mbar 256
133 // 0.042mbar 512
134 // 0.027mbar 1024
135 // 0.018mbar 2048
136 // 0.012mbar 4096
137 //
138 // 0.012mbar = 1,2Pa = 0.0012kPa
139 return toFixed(raw / 1000, 4);
140 }
141 }
142 },
143};
144
145Controllers.BMP085 = Controllers.BMP180;
146
147/**
148 * Barometer
149 * @constructor
150 *
151 * five.Barometer(opts);
152 *
153 * five.Barometer({
154 * controller: "CONTROLLER"
155 * address: 0x00
156 * });
157 *
158 *
159 * @param {Object} opts [description]
160 *
161 */
162
163function Barometer(opts) {
164 if (!(this instanceof Barometer)) {
165 return new Barometer(opts);
166 }
167
168 var controller = null;
169 var last = null;
170 var raw = null;
171
172 Board.Component.call(
173 this, opts = Board.Options(opts)
174 );
175
176 var freq = opts.freq || 25;
177
178 if (opts.controller && typeof opts.controller === "string") {
179 controller = Controllers[opts.controller.toUpperCase()];
180 } else {
181 controller = opts.controller;
182 }
183
184 if (controller == null) {
185 // controller = Controllers["ANALOG"];
186 throw new Error("Missing Barometer controller");
187 }
188
189 Board.Controller.call(this, controller, opts);
190
191 if (!this.toPressure) {
192 this.toPressure = opts.toPressure || function(raw) {
193 return raw;
194 };
195 }
196
197 if (typeof this.initialize === "function") {
198 this.initialize(opts, function(data) {
199 raw = data;
200 });
201 }
202
203 Object.defineProperties(this, {
204 pressure: {
205 get: function() {
206 return this.toPressure(raw);
207 }
208 }
209 });
210
211 setInterval(function() {
212 if (raw === null) {
213 return;
214 }
215
216 var data = {
217 pressure: this.pressure
218 };
219
220 this.emit("data", data);
221
222 if (this.pressure !== last) {
223 last = this.pressure;
224 this.emit("change", data);
225 }
226 }.bind(this), freq);
227}
228
229util.inherits(Barometer, Emitter);
230
231/* istanbul ignore else */
232if (!!process.env.IS_TEST_MODE) {
233 Barometer.Controllers = Controllers;
234 Barometer.purge = function() {};
235}
236
237module.exports = Barometer;