nodejs中的异步覆盆子pi gpio事件

时间:2013-01-21 13:56:33

标签: node.js raspberry-pi

我将一个按钮连接到Raspberry Pi GPIO端口:

http://adafruit.com/products/801

pi-gpio节点js模块仅允许拉出当前状态但不等待 为了改变状态:

gpio.read(16, function(err, value) {
    if(err) throw err;
    console.log(value);    // The current state of the pin
});

是否存在异步绑定事件的任何解决方案?

在这个例子中,每当按下按钮时都会这样。

4 个答案:

答案 0 :(得分:11)

我建议使用名为onoff的模块。

它能够观察一个值文件,同时不会间隔轮询对cpu征税。

我用node.js创建了一个小型测试应用程序,用它来试用LED和按钮,你可以查看它here

答案 1 :(得分:10)

遗憾的是,使用硬件GPIO时没有生成任何事件。您可以使用发射器创建一个事件,setInterval创建一个定时器,每隔一段时间检查一次状态,然后向您的应用程序发出一个事件。

var ee = new process.EventEmitter(),
    buttonState;

ee.on('stateChange', function(previousValue, value){
  console.log('button state changed from', previousValue, 'to', value);
});

setInterval(function(){
  gpio.read(16, function(err, value) {
    if(err){
      ee.emit('error', err);
    } else{
      if(buttonState !== value){
        var previousState = buttonState;
        buttonState = value;
        ee.emit('stateChange', previousState, value);
      }
    }        
  });
}, 50); //check button state every 50ms

您可以根据需要调整计时器。我认为50ms是一个很好的数字,因为如果它更快,人眼就不可能发现差异。

答案 2 :(得分:3)

我刚刚遇到了这个模块

https://github.com/EnotionZ/GpiO

我没有深入研究它,但似乎它在后台使用了setInterval方法。

答案 3 :(得分:0)

顺便说一句,有一个项目非常类似于node.js(无论如何更多),称为Espruino

这可以在Raspberry Pi(以及许多低功耗ARM微控制器)上运行,支持HTTP,并且具有一个名为setWatch的功能,其功能完全符合您的要求。