1
0
mirror of https://github.com/node-red/node-red-nodes.git synced 2023-10-10 13:36:58 +02:00

Add device choice support to map node

to close #394
This commit is contained in:
Dave Conway-Jones 2018-01-13 16:42:22 +00:00
parent 9f290f651e
commit ecb545cf7e
No known key found for this signature in database
GPG Key ID: 9E7F9C73F5168CD4
4 changed files with 43 additions and 23 deletions

View File

@ -2,7 +2,7 @@ node-red-node-pi-mcp3008
======================== ========================
A <a href="http://nodered.org" target="_new">Node-RED</a> node to read from A <a href="http://nodered.org" target="_new">Node-RED</a> node to read from
the MCP3008 Analogue to Digital Converter, the MCP3xxx Series of Analogue to Digital Converters,
such as the <a href="http://rasp.io/analogzero" target="_new">Rasp.io analogzero</a>, though it will work with breadboard versions also. such as the <a href="http://rasp.io/analogzero" target="_new">Rasp.io analogzero</a>, though it will work with breadboard versions also.
It will appear in the menu as ` A/D Converter `. It will appear in the menu as ` A/D Converter `.
@ -28,9 +28,9 @@ Run the following command in your Node-RED user directory - typically `~/.node-r
**Note**: It will appear in the menu as ` A/D Converter `. **Note**: It will appear in the menu as ` A/D Converter `.
### Usage ### Usage
Reads from an MCP3008 Analogue to Digital (ADC) chip on the Pi SPI connection. Reads from an MCP3xxx Analogue to Digital (ADC) chip on the Pi SPI connection.
You can either set a channel in the edit dialogue, or you can set the `msg.payload` to You can either set a channel in the edit dialogue, or you can set the `msg.payload` to
select the channel dynamically. If so then the payload must be a value from 0 to 7. select the channel dynamically. If so then the payload must be a value from 0 to 7.

View File

@ -1,16 +1,16 @@
{ {
"name" : "node-red-node-pi-mcp3008", "name" : "node-red-node-pi-mcp3008",
"version" : "0.0.8", "version" : "0.1.0",
"description" : "A Node-RED node to read from the MCP3008 Analogue to Digital Converter", "description" : "A Node-RED node to read from the MCP3008 Analogue to Digital Converter",
"dependencies" : { "dependencies" : {
"mcp-spi-adc": "^0.3.1" "mcp-spi-adc": "^1.0.0"
}, },
"repository" : { "repository" : {
"type":"git", "type":"git",
"url":"https://github.com/node-red/node-red-nodes/tree/master/hardware" "url":"https://github.com/node-red/node-red-nodes/tree/master/hardware"
}, },
"license": "Apache-2.0", "license": "Apache-2.0",
"keywords": [ "node-red", "pi", "adc", "mcp3008", "a/d converter" ], "keywords": [ "node-red", "pi", "adc", "mcp", "a/d converter" ],
"node-red" : { "node-red" : {
"nodes" : { "nodes" : {
"pimcp3008": "pimcp3008.js" "pimcp3008": "pimcp3008.js"

View File

@ -1,7 +1,19 @@
<!DOCTYPE html> <!DOCTYPE html>
<script type="text/x-red" data-template-name="pimcp3008"> <script type="text/x-red" data-template-name="pimcp3008">
<div class="form-row"> <div class="form-row">
<label for="node-input-mode"><i class="fa fa-map-pin"></i> Input pin</label> <label for="node-input-dev"><i class="fa fa-server"></i> Device</label>
<select type="text" id="node-input-dev" style="width:150px;">
<option value="3008">mcp3008</option>
<option value="3002">mcp3002</option>
<option value="3004">mcp3004</option>
<option value="3202">mcp3202</option>
<option value="3204">mcp3204</option>
<option value="3208">mcp3208</option>
<option value="3304">mcp3304</option>
</select>
</div>
<div class="form-row">
<label for="node-input-pin"><i class="fa fa-map-pin"></i> Input pin</label>
<select type="text" id="node-input-pin" style="width:150px;"> <select type="text" id="node-input-pin" style="width:150px;">
<option value=0>A0</option> <option value=0>A0</option>
<option value=1>A1</option> <option value=1>A1</option>
@ -15,7 +27,7 @@
</select> </select>
</div> </div>
<div class="form-row"> <div class="form-row">
<label for="node-input-mode"><i class="fa fa-toggle-on"></i> Device ID</label> <label for="node-input-dnum"><i class="fa fa-toggle-on"></i> Device ID</label>
<select type="text" id="node-input-dnum" style="width:150px;"> <select type="text" id="node-input-dnum" style="width:150px;">
<option value=0>CE0</option> <option value=0>CE0</option>
<option value=1>CE1</option> <option value=1>CE1</option>
@ -28,7 +40,7 @@
</script> </script>
<script type="text/x-red" data-help-name="pimcp3008"> <script type="text/x-red" data-help-name="pimcp3008">
<p>Reads from an MCP3008 Analogue to Digital Converter (ADC) chip on the Pi SPI CE0 or CE1 connection, <p>Reads from an MCP3xxx Series Analogue to Digital Converter (ADC) chip on the Pi SPI CE0 or CE1 connection,
such as the rasp.io/analogzero.</p> such as the rasp.io/analogzero.</p>
<p>You can either set a channel in the edit dialogue, or you can set the <code>msg.payload</code> <p>You can either set a channel in the edit dialogue, or you can set the <code>msg.payload</code>
to select the channel dynamically. If so then the expected payload must be a value from 0 to 7.</p> to select the channel dynamically. If so then the expected payload must be a value from 0 to 7.</p>
@ -47,6 +59,7 @@
color: "#c6dbef", color: "#c6dbef",
defaults: { defaults: {
name: {value:""}, name: {value:""},
dev: {value:"3008"},
pin: {value:0, required:true}, pin: {value:0, required:true},
dnum: {value:0} dnum: {value:0}
}, },
@ -54,7 +67,7 @@
outputs: 1, outputs: 1,
icon: "rpi.png", icon: "rpi.png",
label: function() { label: function() {
return this.name || "ADC "+((this.pin==="M")?"":this.pin); return this.name || "mcp"+this.dev+" "+((this.pin==="M")?"":this.pin);
}, },
labelStyle: function() { labelStyle: function() {
return this.name?"node_label_italic":""; return this.name?"node_label_italic":"";

View File

@ -12,52 +12,59 @@ module.exports = function(RED) {
} }
var mcpadc = require('mcp-spi-adc'); var mcpadc = require('mcp-spi-adc');
var mcp3008 = []; var mcp3xxx = [];
function PiMcpNode(n) { function PiMcpNode(n) {
RED.nodes.createNode(this,n); RED.nodes.createNode(this,n);
this.pin = n.pin || 0; this.pin = n.pin || 0;
this.interval = n.interval || 1000; this.interval = n.interval || 1000;
this.dnum = parseInt(n.dnum || 0); this.dnum = parseInt(n.dnum || 0);
this.dev = n.dev || "3008";
var node = this; var node = this;
var cb = function (err) { if (err) { node.error("Error: "+err); } };
var opt = { deviceNumber:node.dnum };
var chans = parseInt(this.dev.substr(3));
try { try {
fs.statSync("/dev/spidev0."+node.dnum); fs.statSync("/dev/spidev0."+node.dnum);
if (mcp3008.length === 0) { if (mcp3xxx.length === 0) {
for (var i=0; i<8; i++) { for (var i=0; i<chans; i++) {
mcp3008.push(mcpadc.openMcp3008(i, { deviceNumber:node.dnum }, function (err) { if (node.dev === "3002") { mcp3xxx.push(mcpadc.openmcp3002(i, opt, cb)); }
if (err) { node.error("Error: "+err); } if (node.dev === "3004") { mcp3xxx.push(mcpadc.openmcp3004(i, opt, cb)); }
})); if (node.dev === "3008") { mcp3xxx.push(mcpadc.openmcp3008(i, opt, cb)); }
if (node.dev === "3202") { mcp3xxx.push(mcpadc.openmcp3202(i, opt, cb)); }
if (node.dev === "3204") { mcp3xxx.push(mcpadc.openmcp3204(i, opt, cb)); }
if (node.dev === "3208") { mcp3xxx.push(mcpadc.openmcp3208(i, opt, cb)); }
if (node.dev === "3304") { mcp3xxx.push(mcpadc.openmcp3304(i, opt, cb)); }
} }
} }
node.on("input", function(msg) { node.on("input", function(msg) {
var pin = null; var pin = null;
if (node.pin === "M") { if (node.pin === "M") {
var pay = parseInt(msg.payload.toString()); var pay = parseInt(msg.payload.toString());
if ((pay >= 0) && (pay <= 7)) { pin = pay; } if ((pay >= 0) && (pay < chans)) { pin = pay; }
else { node.warn("Payload needs to select channel 0 to 7"); } else { node.warn("Payload needs to select channel 0 to "+(chans-1)); }
} }
else { pin = parseInt(node.pin); } else { pin = parseInt(node.pin); }
if (pin !== null) { if (pin !== null) {
mcp3008[pin].read(function (err, reading) { mcp3xxx[pin].read(function (err, reading) {
if (err) { node.warn("Read error: "+err); } if (err) { node.warn("Read error: "+err); }
else { node.send({payload:reading.rawValue, topic:"adc/"+pin}); } else { node.send({payload:reading.rawValue, topic:"adc/"+pin}); }
}); });
} }
}); });
} }
catch(err) { catch(err) {
node.error("Error : Can't find SPI device - is SPI enabled in raspi-config ?"); node.error("Error : Can't find SPI device - is SPI enabled in raspi-config ?");
} }
node.on("close", function(done) { node.on("close", function(done) {
if (mcp3008.length !== 0) { if (mcp3xxx.length !== 0) {
var j=0; var j=0;
for (var i=0; i<8; i++) { for (var i=0; i<8; i++) {
mcp3008[i].close(function() { j += 1; if (j === 8) {done()} }); mcp3xxx[i].close(function() { j += 1; if (j === 8) {done()} });
} }
mcp3008 = []; mcp3xxx = [];
} }
else { done(); } else { done(); }
}); });