Skip to content

Commit

Permalink
Adding altimeter support
Browse files Browse the repository at this point in the history
  • Loading branch information
BrianGenisio committed Oct 7, 2015
1 parent c23c1a6 commit 5237658
Show file tree
Hide file tree
Showing 5 changed files with 200 additions and 9 deletions.
19 changes: 19 additions & 0 deletions eg/altimeter-mpl3115a2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
var five = require("../lib/johnny-five.js");
var board = new five.Board();

board.on("ready", function() {
var barometer = new five.Altimeter({
controller: "MPL3115A2"
});

barometer.on("data", function() {
console.log("Altitude");
console.log(" feet : ", this.feet);
console.log(" meters : ", this.meters);
console.log("--------------------------------------");
});
});

// @markdown
// - [MPLe115A2 - I2C Barometric Pressure/Altimiter/Temperature Sensor](https://www.adafruit.com/products/1893)
// @markdown
25 changes: 25 additions & 0 deletions eg/multi-mpl3115a2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
var five = require("../");
var board = new five.Board();

board.on("ready", function() {
var multi = new five.Multi({
controller: "MPL3115A2"
});

multi.on("change", function() {
console.log("temperature");
console.log(" celsius : ", this.temperature.celsius);
console.log(" fahrenheit : ", this.temperature.fahrenheit);
console.log(" kelvin : ", this.temperature.kelvin);
console.log("--------------------------------------");

console.log("barometer");
console.log(" pressure : ", this.barometer.pressure);
console.log("--------------------------------------");

console.log("altimeter");
console.log(" feet : ", this.altimeter.feet);
console.log(" meters : ", this.altimeter.meters);
console.log("--------------------------------------");
});
});
98 changes: 98 additions & 0 deletions lib/altimeter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
var Board = require("../lib/board.js"),
Emitter = require("events").EventEmitter,
util = require("util");

var Controllers = {
MPL3115A2: {
initialize: {
value: function(opts, dataHandler) {
var Multi = require("../lib/imu");
var driver = Multi.Drivers.get(this.board, "MPL3115A2", opts);
driver.on("data", function(data) {
dataHandler(data.altitude);
});
}
},
toMeters: {
value: function(raw) {
return raw / 16;
}
}
}
};

var priv = new Map();

function Altimeter(opts) {
var controller, freq, last = 0, raw;

if (!(this instanceof Altimeter)) {
return new Altimeter(opts);
}

Board.Component.call(
this, opts = Board.Options(opts)
);

freq = opts.freq || 25;


if (opts.controller && typeof opts.controller === "string") {
controller = Controllers[opts.controller.toUpperCase()];
} else {
controller = opts.controller;
}

priv.set(this, {});

Object.defineProperties(this, controller);

if (!this.toMeters) {
this.toMeters = opts.toMeters || function(x) { return x; };
}

var propDescriptors = {
meters: {
get: function() {
return this.toMeters(raw);
}
},
feet: {
get: function() {
return this.meters * 3.28084;
}
}
};
// Convenience aliases
propDescriptors.m = propDescriptors.meters;
propDescriptors.ft = propDescriptors.feet;

Object.defineProperties(this, propDescriptors);

if (typeof this.initialize === "function") {
this.initialize(opts, function(data) {
raw = data;
});
}

setInterval(function() {
if (raw === undefined) {
return;
}

var data = {};
data.m = data.meters = this.meters;
data.ft = data.feet = this.feet;

this.emit("data", null, data);

if (this.meters !== last) {
last = this.meters;
this.emit("change", null, data);
}
}.bind(this), freq);
}

util.inherits(Altimeter, Emitter);

module.exports = Altimeter;
66 changes: 57 additions & 9 deletions lib/imu.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ var Emitter = require("events").EventEmitter;
var util = require("util");
var __ = require("../lib/fn.js");
var Accelerometer = require("../lib/accelerometer.js");
var Altimeter = require("../lib/altimeter.js");
var Barometer = require("../lib/barometer.js");
var Hygrometer = require("../lib/hygrometer.js");
var Temperature = require("../lib/temperature.js");
Expand Down Expand Up @@ -219,7 +220,7 @@ var Drivers = {
CONTROL: {
SBYB: 0x01,
OS128: 0x38,
ALTIMITER: 0x80,
ALTIMETER: 0x80,
PRESSURE: 0x00
},
DATA_CONFIG: {
Expand All @@ -239,11 +240,11 @@ var Drivers = {
pressure: 0,
altitude: 0,
temperature: 0
}
};

var waitForReady = function(next) {
io.i2cReadOnce(address, this.REGISTER.STATUS, 1, function(data) {
if(data[0] & this.MASK.STATUS.PRESSURE_DATA_READ) {
if (data[0] & this.MASK.STATUS.PRESSURE_DATA_READ) {
next();
} else {
setTimeout(function() {
Expand All @@ -254,29 +255,27 @@ var Drivers = {
}.bind(this);

var readValues = function(isPressure) {
var modeMask = isPressure ? this.MASK.CONTROL.PRESSURE : this.MASK.CONTROL.ALTIMITER;
var modeMask = isPressure ? this.MASK.CONTROL.PRESSURE : this.MASK.CONTROL.ALTIMETER;

io.i2cWrite(address, this.REGISTER.CONTROL,
this.MASK.CONTROL.SBYB |
this.MASK.CONTROL.OS128 |
modeMask);

waitForReady(function() {
io.i2cReadOnce(address, this.REGISTER.PRESSURE_MSB, 6, function(data) {
io.i2cReadOnce(address, this.REGISTER.PRESSURE_MSB, READLENGTH, function(data) {
var value = uint24(data[1], data[2], data[3]) >> 4;
var temperature = uint16(data[4], data[5]) >> 4;

computed.temperature = temperature;

if(isPressure) {
if (isPressure) {
computed.pressure = value;
this.emit('data', computed);
this.emit("data", computed);
} else {
if (value & 0x800000) {
value |= 0xFF000000;
}
//value /= 16;

computed.altitude = value;
}

Expand Down Expand Up @@ -683,6 +682,55 @@ var Controllers = {
hygrometer: {
get: function() {
return priv.get(this).hygrometer;
}
},
temperature: {
get: function() {
return priv.get(this).temperature;
}
}
},
MPL3115A2: {
initialize: {
value: function(opts) {
var state = priv.get(this);

state.barometer = new Barometer(
Object.assign({
controller: "MPL3115A2",
freq: opts.freq,
board: this.board,
}, opts)
);

state.altimeter = new Altimeter(
Object.assign({
controller: "MPL3115A2",
freq: opts.freq,
board: this.board,
}, opts)
);

state.temperature = new Temperature(
Object.assign({
controller: "MP3L115A2",
freq: opts.freq,
board: this.board,
}, opts)
);
}
},
components: {
value: ["barometer", "altimeter", "temperature"]
},
barometer: {
get: function() {
return priv.get(this).barometer;
}
},
altimeter: {
get: function() {
return priv.get(this).altimeter;
}
},
temperature: {
Expand Down
1 change: 1 addition & 0 deletions lib/johnny-five.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module.exports = {
// extract-start:apinames
Accelerometer: require("./accelerometer"),
Animation: require("./animation"),
Altimeter: require("./altimeter"),
Barometer: require("./barometer"),
Board: require("./board"),
Button: require("./button"),
Expand Down

0 comments on commit 5237658

Please sign in to comment.