Problems with more than one MCP3008

Hello together,
I got the Problem fixed.

Here are the modified code:

pimcp3008.html

<!DOCTYPE html>
<script type="text/x-red" data-template-name="pimcp3008">
    <div class="form-row">
        <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;">
          <option value=0>A0</option>
          <option value=1>A1</option>
          <option value=2>A2</option>
          <option value=3>A3</option>
          <option value=4>A4</option>
          <option value=5>A5</option>
          <option value=6>A6</option>
          <option value=7>A7</option>
          <option value="M">set by msg.payload</option>
        </select>
    </div>
    <div class="form-row">
        <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;">
          <option value=0>CE0</option>
          <option value=1>CE1</option>
	  <option value=2>CE2</option>	
        </select>
    </div>
    <div class="form-row">
        <label for="node-input-bus"><i class="fa fa-toggle-on"></i> SPI bus</label>
        <select type="text" id="node-input-bus" style="width:150px;">
          <option value=0>0</option>
          <option value=1>1</option>
        </select>
    </div>
    <div class="form-row">
        <label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
        <input type="text" id="node-input-name" placeholder="Name"/>
    </div>
</script>

<script type="text/x-red" data-help-name="pimcp3008">
   <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>
   <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>
   <p>Outputs a numeric <code>msg.payload</code> with a range of 0 to 1023, representing 0V to 3.3V.</p>
   <p><i>Hint</i>: use a <code>range</code> node to re-scale the values to ones you want.</p>
   <p>Also sets <code>msg.topic</code> to <i>adc/{the pin number}</i></p>
   <p><b>Warning</b>: Input voltages must not exceed 3.3V</p>
   <p>The SPI bus must be enabled for this node to work. This can be achieved by using the
   advanced menu (option 9 A5) of the <b>raspi-config</b> utility.</p>
</script>

<script type="text/javascript">
    RED.nodes.registerType('pimcp3008',{
        category: 'Raspberry Pi',
        paletteLabel: 'A/D converter',
        color: "#c6dbef",
        defaults: {
            name: {value:""},
            dev: {value:"3008"},
            pin: {value:0, required:true},
            dnum: {value:0},
            bus: {value:0}
        },
        inputs: 1,
        outputs: 1,
        icon: "rpi.png",
        label: function() {
            return this.name || "mcp:"+this.dev+" "+" bus:"+this.bus+" CS:"+this.dnum+" pin:"+((this.pin==="M")?"":this.pin);
        },
        labelStyle: function() {
            return this.name?"node_label_italic":"";
        }
    });
</script>

pimcp3008.js


module.exports = function(RED) {
    "use strict";
    var fs2 = require('fs');
    var allOK = false;
    var mcpadc;
    // unlikely if not on a Pi
    try {
        var cpuinfo = fs2.readFileSync("/proc/cpuinfo").toString();
        if (cpuinfo.indexOf(": BCM") === -1) {
            RED.log.warn("Info : mcp3xxx : Not running on a Pi - Ignoring node");
        }
        else {
            mcpadc = require('mcp-spi-adc');
            allOK = true;
        }
    }
    catch(err) {
        RED.log.warn("Info : mcp3xxx : Not running on a Pi - Ignoring node");
    }

    //var mcp3xxx = [];

    function PiMcpNode(n) {
        RED.nodes.createNode(this,n);
        this.pin = n.pin || 0;
        this.interval = n.interval || 1000;
        this.dnum = parseInt(n.dnum || 0);
        this.bus = parseInt(n.bus || 0);
        this.dev = n.dev || "3008";
	this.fs = require('fs');
        this.mcp3xxx = [];
        var node = this;
        this.cb = function (err) { if (err) { node.error("Error: "+err); } };
        this.opt = { speedHz:20000, deviceNumber:node.dnum, busNumber:node.bus };
        var chans = parseInt(this.dev.substr(3));
	var node = this;

        if (allOK === true) {
            try {
                node.fs.statSync("/dev/spidev"+node.bus+"."+node.dnum);
                if (node.mcp3xxx.length === 0) {
                    for (var i=0; i<chans; i++) {
                        if (node.dev === "3002") { node.mcp3xxx.push(mcpadc.openMcp3002(i, node.opt, node.cb)); }
                        if (node.dev === "3004") { node.mcp3xxx.push(mcpadc.openMcp3004(i, node.opt, node.cb)); }
                        if (node.dev === "3008") { node.mcp3xxx.push(mcpadc.openMcp3008(i, node.opt, node.cb)); }
                        if (node.dev === "3202") { node.mcp3xxx.push(mcpadc.openMcp3202(i, node.opt, node.cb)); }
                        if (node.dev === "3204") { node.mcp3xxx.push(mcpadc.openMcp3204(i, node.opt, node.cb)); }
                        if (node.dev === "3208") { node.mcp3xxx.push(mcpadc.openMcp3208(i, node.opt, node.cb)); }
                        if (node.dev === "3304") { node.mcp3xxx.push(mcpadc.openMcp3304(i, node.opt, node.cb)); }
                    }
                }
                node.on("input", function(msg) {
                    var pin = null;
                    if (node.pin === "M") {
                        var pay = parseInt(msg.payload.toString());
                        if ((pay >= 0) && (pay < chans)) { pin = pay; }
                        else { node.warn("Payload needs to select channel 0 to "+(chans-1)); }
                    }
                    else { pin = parseInt(node.pin); }
                    if (pin !== null) {
                        node.mcp3xxx[pin].read(function (err, reading) {
                            if (err) { node.warn("Read error: "+err); }
                            else { node.send({payload:reading.rawValue, topic:"adc/"+pin}); }
                        });
                    }
                });
            }
            catch(err) {
                node.error("Error : Can't find SPI device - is SPI enabled in raspi-config ?"+ err);
            }

            node.on("close", function(done) {
                if (node.mcp3xxx.length !== 0) {
                    var j=0;
                    for (var i=0; i<chans; i++) {
                        node.mcp3xxx[i].close(function() { j += 1; if (j === chans) {done()} });
                    }
                    mcp3xxx = [];
                }
                else { done(); }
            });
        }
        else {
            node.status({text:"node inactive."})
        }
    }

    RED.nodes.registerType("pimcp3008",PiMcpNode);
}

Now all devises are showing up:

pi@testberrypi2:~/.node-red/node_modules/mcp-spi-adc $ lsof /dev/spidev*
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node-red 1886   pi   20u   CHR  153,2      0t0  387 /dev/spidev1.0
node-red 1886   pi   21u   CHR  153,2      0t0  387 /dev/spidev1.0
node-red 1886   pi   22u   CHR  153,2      0t0  387 /dev/spidev1.0
node-red 1886   pi   23u   CHR  153,2      0t0  387 /dev/spidev1.0
node-red 1886   pi   24u   CHR  153,2      0t0  387 /dev/spidev1.0
node-red 1886   pi   25u   CHR  153,2      0t0  387 /dev/spidev1.0
node-red 1886   pi   28u   CHR  153,2      0t0  387 /dev/spidev1.0
node-red 1886   pi   29u   CHR  153,2      0t0  387 /dev/spidev1.0
node-red 1886   pi   30u   CHR  153,0      0t0  385 /dev/spidev1.2
node-red 1886   pi   31u   CHR  153,0      0t0  385 /dev/spidev1.2
node-red 1886   pi   32u   CHR  153,0      0t0  385 /dev/spidev1.2
node-red 1886   pi   33u   CHR  153,0      0t0  385 /dev/spidev1.2
node-red 1886   pi   34u   CHR  153,0      0t0  385 /dev/spidev1.2
node-red 1886   pi   35u   CHR  153,0      0t0  385 /dev/spidev1.2
node-red 1886   pi   36u   CHR  153,0      0t0  385 /dev/spidev1.2
node-red 1886   pi   37u   CHR  153,0      0t0  385 /dev/spidev1.2
node-red 1886   pi   38u   CHR  153,1      0t0  386 /dev/spidev1.1
node-red 1886   pi   39u   CHR  153,1      0t0  386 /dev/spidev1.1
node-red 1886   pi   40u   CHR  153,1      0t0  386 /dev/spidev1.1
node-red 1886   pi   41u   CHR  153,1      0t0  386 /dev/spidev1.1
node-red 1886   pi   42u   CHR  153,1      0t0  386 /dev/spidev1.1
node-red 1886   pi   43u   CHR  153,1      0t0  386 /dev/spidev1.1
node-red 1886   pi   44u   CHR  153,1      0t0  386 /dev/spidev1.1
node-red 1886   pi   45u   CHR  153,1      0t0  386 /dev/spidev1.1
pi@testberrypi2:~/.node-red/node_modules/mcp-spi-adc $
1 Like