From 0a78ad7fe6b3b61fb91d6da4a34e63d5bb06b01e Mon Sep 17 00:00:00 2001 From: Felix Schmidt Date: Fri, 28 Mar 2014 20:22:58 -0700 Subject: [PATCH 1/3] Add basic support for reed sensor --- lib/reed.js | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 lib/reed.js diff --git a/lib/reed.js b/lib/reed.js new file mode 100644 index 0000000..c2afb2d --- /dev/null +++ b/lib/reed.js @@ -0,0 +1,66 @@ +var events = require('events'), + util = require('util'); + +/* + * Main Reed constructor + * Process options + * Tell the board to set it up + */ +var Reed = function (options) { + if (!options || !options.board) { + throw new Error('Must supply required options to PIR'); + } + this.board = options.board; + this.pin = this.board.normalizePin(options.pin || 7); + this.state = null; + this.calibrated = false; + + setInterval(function () { + this.board.digitalRead(this.pin); + }.bind(this), 200); + + this.board.on('data', function (message) { + var m = message.slice(0, -1).split('::'), + timestamp = new Date(), + err = null, + pin, data; + + if (!m.length) { + return; + } + + pin = m[0]; + data = m[1]; + + if (pin === this.pin) { + // If this is not a calibration event + if (this.state != null && this.state != +data) { + + // Update current state of reed instance + this.state = +data; + + // 'reedclose' event fired when reed is closed + if (data === '01') { + this.emit('reedclose', err, timestamp); + } + + // 'reedopen' event fired when reed is open + if (data === '00') { + this.emit('reedopen', err, timestamp); + } + } + + // 'calibrated' event fired when reed sensor is + // ready to detect movement/motion in observable range + if (!this.calibrated) { + this.calibrated = true; + this.state = +data; + this.emit('calibrated', err, timestamp); + } + } + }.bind(this)); +}; + +util.inherits(Reed, events.EventEmitter); + +exports.Reed = Reed; From ccc5fab8e19245547eda24c6a9abe3cfb7dd7fad Mon Sep 17 00:00:00 2001 From: Felix Schmidt Date: Fri, 28 Mar 2014 20:29:30 -0700 Subject: [PATCH 2/3] add reed sensor to index.js --- index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 3c55f8c..09f0816 100644 --- a/index.js +++ b/index.js @@ -8,5 +8,6 @@ module.exports = { Sensor: require('./lib/sensor'), Ping: require('./lib/ping'), PIR: require('./lib/pir'), - LCD: require('./lib/lcd') + LCD: require('./lib/lcd'), + Reed: require('./lib/reed') }; From 5ea5b8a54b5001a7dc4db5438cbb7d63bb3cd9ba Mon Sep 17 00:00:00 2001 From: Felix Schmidt Date: Fri, 28 Mar 2014 23:00:48 -0700 Subject: [PATCH 3/3] Fixes + add emitInitState + test case --- examples/reed.js | 23 +++++++++++++++++++++++ lib/reed.js | 14 +++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 examples/reed.js diff --git a/examples/reed.js b/examples/reed.js new file mode 100644 index 0000000..a63d70e --- /dev/null +++ b/examples/reed.js @@ -0,0 +1,23 @@ +var arduino = require('../'); + +var board = new arduino.Board({ + debug: false +}); + +var reed = new arduino.Reed({ + board : board, + pin : 7, + emitInitState: true +}); + +reed.on('calibrated', function(err, date) { + console.log('calibrated'); + + this.on('reedopen', function(err, date) { + console.log('reedopen', this.state); + }); + + this.on('reedclose', function(err, date) { + console.log('reedclose'); + }); +}); diff --git a/lib/reed.js b/lib/reed.js index c2afb2d..7cc3923 100644 --- a/lib/reed.js +++ b/lib/reed.js @@ -14,6 +14,7 @@ var Reed = function (options) { this.pin = this.board.normalizePin(options.pin || 7); this.state = null; this.calibrated = false; + this.emitInitState = options.emitInitState; setInterval(function () { this.board.digitalRead(this.pin); @@ -50,12 +51,19 @@ var Reed = function (options) { } } - // 'calibrated' event fired when reed sensor is - // ready to detect movement/motion in observable range + // 'calibrated' event if (!this.calibrated) { this.calibrated = true; this.state = +data; this.emit('calibrated', err, timestamp); + + if(this.emitInitState) { + if(data === '01') { + this.emit('reedclose', err, timestamp); + } else if(data === '00') { + this.emit('reedopen', err, timestamp); + } + } } } }.bind(this)); @@ -63,4 +71,4 @@ var Reed = function (options) { util.inherits(Reed, events.EventEmitter); -exports.Reed = Reed; +module.exports = Reed;