UNPKG

6.41 kBJavaScriptView Raw
1var Board = require("./board");
2var Fn = require("./fn");
3var Emitter = require("events").EventEmitter;
4var util = require("util");
5
6var toFixed = Fn.toFixed;
7var priv = new Map();
8
9var Controllers = {
10
11 SHT31D: {
12 initialize: {
13 value: function(opts, dataHandler) {
14 var Multi = require("./imu");
15 var driver = Multi.Drivers.get(this.board, "SHT31D", opts);
16 driver.on("data", function(data) {
17 dataHandler(data.humidity);
18 });
19 }
20 },
21 toRelativeHumidity: {
22 value: function(raw) {
23 // Page 2, Table 1
24 // Based on the "Relative Humidity Conversion" formula
25 // 1.1 Humidity Sensor Performance
26 // Typical resoultion 0.01%RH
27 //
28 // Page 14
29 // 4.13 Conversion of Signal Output
30 // RH = 100 * (Srh / ((2 ** 26) - 1))
31 // Srh = Sensor raw humidity
32 return toFixed((100 * raw / 65535), 2);
33 }
34 }
35 },
36
37
38 HTU21D: {
39 initialize: {
40 value: function(opts, dataHandler) {
41 var Multi = require("./imu");
42 var driver = Multi.Drivers.get(this.board, "HTU21D", opts);
43 driver.on("data", function(data) {
44 dataHandler(data.humidity);
45 });
46 }
47 },
48 toRelativeHumidity: {
49 value: function(raw) {
50 // Page 15
51 // CONVERSION OF SIGNAL OUTPUTS
52 // RH = -6 + 125 * (Srh / (2 ** 26))
53 // Srh = Sensor raw humidity
54 //
55 // Page 3, Table `SENSOR PERFORMANCE`
56 //
57 // Typical resolution 0.04 %RH
58 return toFixed((125 * raw / 65536) - 6, 2);
59 }
60 }
61 },
62
63 HIH6130: {
64 initialize: {
65 value: function(opts, dataHandler) {
66 var Multi = require("./imu");
67 var driver = Multi.Drivers.get(this.board, "HIH6130", opts);
68 driver.on("data", function(data) {
69 dataHandler(data.humidity);
70 });
71 }
72 },
73 toRelativeHumidity: {
74 // Page 7, Table 2
75 // Typical resoultion 0.04%RH
76 value: function(raw) {
77 // Page 3
78 // Equation 1: Humidity Conversion Function
79 return toFixed(raw * 100 / (Fn.POW_2_14 - 1), 2);
80 }
81 }
82 },
83
84 DHT_I2C_NANO_BACKPACK: {
85 initialize: {
86 value: function(opts, dataHandler) {
87 var Multi = require("./imu");
88 var driver = Multi.Drivers.get(this.board, "DHT_I2C_NANO_BACKPACK", opts);
89 driver.on("data", function(data) {
90 dataHandler(data.humidity);
91 });
92 }
93 },
94 toRelativeHumidity: {
95 // DHT11
96
97 // Page 4, Table
98 // Typical resolution 1%RH
99 //
100 // DHT21
101
102 // Page 2, Paragraph 5
103 // Resolution 0.1%RH
104 //
105 // DHT22
106
107 // Page 2, Paragraph 3
108 // Resolution 0.1%RH
109 value: function(raw) {
110 return toFixed(raw / 100, 1);
111 }
112 }
113 },
114
115 TH02: {
116 initialize: {
117 value: function(opts, dataHandler) {
118 var Multi = require("./imu");
119 var driver = Multi.Drivers.get(this.board, "TH02", opts);
120 driver.on("data", function(data) {
121 dataHandler(data.humidity);
122 });
123 }
124 },
125 toRelativeHumidity: {
126 // Table 4
127 // Resolution 12bit (16 codes per %RH) -> ~ 2 fractional digits
128 value: function(raw) {
129 if (raw > 100) {
130 raw = 0;
131 }
132 return toFixed(raw || 0, 2);
133 }
134 }
135 },
136
137 SI7020: {
138 initialize: {
139 value: function(opts, dataHandler) {
140 var Multi = require("./imu");
141 var driver = Multi.Drivers.get(this.board, "SI7020", opts);
142 driver.on("data", function(data) {
143 dataHandler(data.humidity);
144 });
145 }
146 },
147 toRelativeHumidity: {
148 value: function(raw) {
149 // Page 7, Table 4
150 // The device can have 12-bit resolution ~ 2 fractional digits (100 / 2^12)
151 //
152 // Humidity formula
153 // P. 22
154 return toFixed((125 * raw / 65536) - 6, 2);
155 }
156 }
157 },
158
159 BME280: {
160 initialize: {
161 value: function(opts, dataHandler) {
162 var Multi = require("./imu");
163 var driver = Multi.Drivers.get(this.board, "BME280", opts);
164 driver.on("data", function(data) {
165 dataHandler(data.humidity);
166 });
167 }
168 },
169 toRelativeHumidity: {
170 value: function(raw) {
171 // Page 23
172 // 47445 / 1024 = 46.333 %RH
173 return toFixed(raw / 1024, 3);
174 }
175 }
176 }
177};
178
179Controllers.DHT11_I2C_NANO_BACKPACK = Controllers.DHT_I2C_NANO_BACKPACK;
180Controllers.DHT21_I2C_NANO_BACKPACK = Controllers.DHT_I2C_NANO_BACKPACK;
181Controllers.DHT22_I2C_NANO_BACKPACK = Controllers.DHT_I2C_NANO_BACKPACK;
182Controllers.SI7021 = Controllers.SI7020;
183
184
185function Hygrometer(opts) {
186 if (!(this instanceof Hygrometer)) {
187 return new Hygrometer(opts);
188 }
189
190 var controller = null;
191 var last = null;
192 var raw = null;
193
194 Board.Component.call(
195 this, opts = Board.Options(opts)
196 );
197
198 var freq = opts.freq || 25;
199
200 if (opts.controller && typeof opts.controller === "string") {
201 controller = Controllers[opts.controller.toUpperCase()];
202 } else {
203 controller = opts.controller;
204 }
205
206 if (controller == null) {
207 throw new Error("Missing Hygrometer controller");
208 }
209
210 priv.set(this, {});
211
212 Board.Controller.call(this, controller, opts);
213
214 if (!this.toRelativeHumidity) {
215 this.toRelativeHumidity = opts.toRelativeHumidity || function(x) {
216 return x;
217 };
218 }
219
220 var propDescriptors = {
221 relativeHumidity: {
222 get: function() {
223 return this.toRelativeHumidity(raw);
224 }
225 }
226 };
227 // Convenience aliases
228 propDescriptors.RH = propDescriptors.relativeHumidity;
229
230 Object.defineProperties(this, propDescriptors);
231
232 if (typeof this.initialize === "function") {
233 this.initialize(opts, function(data) {
234 raw = data;
235 });
236 }
237
238 setInterval(function() {
239 if (raw == null) {
240 return;
241 }
242
243 if (Number.isNaN(this.relativeHumidity)) {
244 return;
245 }
246
247 var data = {};
248 data.RH = data.relativeHumidity = this.relativeHumidity;
249
250 this.emit("data", data);
251
252 if (this.relativeHumidity !== last) {
253 last = this.relativeHumidity;
254 this.emit("change", data);
255 }
256 }.bind(this), freq);
257}
258
259util.inherits(Hygrometer, Emitter);
260
261/* istanbul ignore else */
262if (!!process.env.IS_TEST_MODE) {
263 Hygrometer.Controllers = Controllers;
264 Hygrometer.purge = function() {
265 priv.clear();
266 };
267}
268
269module.exports = Hygrometer;