如何使用Raspberry PI和Nodejs控制继电器?

时间:2015-07-14 00:44:09

标签: node.js raspberry-pi

我正在使用onoff模块的watch方法来监视输入的状态,回调函数将被调用输入的任何变化(从0到1或从1到0),这就是我想要的。

问题是当我第一次运行应用程序时,如果main打开(inputMain为1)或main关闭(inputMain为0),则不执行回调函数,因为输入值没有变化。 因此,如果主要打开,我不能调用main()函数,直到它关闭然后再打开,这个问题只在我第一次运行应用程序时发生。

我如何解决这个问题?是否有更好的方法来处理继电器?

var GPIO = require('onoff').Gpio,
 inputMain = new GPIO(17,'in','both'),
 inputGen1 = new GPIO(4,'in','both'),
 inputGen2 = new GPIO(27,'in','both'),
 inputGen3 = new GPIO(22,'in','both'),
 outMain = new GPIO(11,'high'),
 outGen1 = new GPIO(15,'high'),
 outGen2P = new GPIO(18,'high'), // Generator 2 power
 outGen2SM = new GPIO(23,'high'), //Generator 2 starting motor
 outGen2 = new GPIO(24,'high'), // Generator 2 contactor
 outGen3P = new GPIO(25,'high'),
 outGen3SM = new GPIO(8,'high'),
 outGen3 = new GPIO(7,'high'),
 objects =[outMain,outGen1,outGen2P,outGen2SM,outGen2,outGen3P,outGen3SM,outGen3];

//检查所有其他电源是否存在主电源

 inputMain.watch(function(err,state){
   if (state)
      main(1);
  });

//切换到主接触器

function main (arg) {
 console.log('test');
 if (arg == 1) {
 value = [0,1,1,1,1,1,1,1];}
 else {
 value = [0,0,0,0,0,0,0,0];
 }
 out(value);

}

//根据数组的值打开所有继电器......

function out(value) {

  for ( var i = 0; i< value.length; i++) {

    if (value[i] == 0 )  {
        var a = objects[i];
    } else {

         objects[i].writeSync(value[i]);
    }
 }
    setTimeout(function() {
    a.writeSync(0);
    },5000);
}

1 个答案:

答案 0 :(得分:0)

我担心你需要为此调用read或readSync。

...
outGen3SM = new GPIO(8,'high'),
outGen3 = new GPIO(7,'high'),
objects =[outMain,outGen1,outGen2P,outGen2SM,outGen2,outGen3P,outGen3SM,outGen3];
//Forces the first output update
main(inputMain.readSync());