24

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

http://adafruit.com/products/801

pi-gpio node js 模块只允许拉取当前状态,而不是等待状态改变:

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

有没有异步绑定事件的解决方案?

在此示例中,这将是每当按下按钮时。

4

4 回答 4

11

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

它能够在不通过间隔轮询对 cpu 征税的情况下观察值文件。

我用 node.js 制作了一个小型测试应用程序来试用它的 LED 和按钮,你可以在这里查看

于 2013-05-24T06:32:54.237 回答
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

您可以根据需要调整计时器。我认为 50 毫秒是一个很好的数字,因为如果它更快,人眼就无法检测到差异。

于 2013-01-21T15:44:31.890 回答
3

我刚遇到这个模块

https://github.com/EnotionZ/GpiO

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

于 2013-01-21T17:24:31.047 回答
0

顺便说一句,有一个与 node.js 非常相似的项目(但更精简)称为Espruino

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

于 2013-02-07T10:35:42.367 回答