web-dev-qa-db-ja.com

nodejsの非同期RaspberryPigpioイベント

ボタンをRaspberryPiGPIOポートに接続しました。

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
});

イベントを非同期にバインドするソリューションはありますか?

この例では、これはボタンが押されたときです。

24
jantimon

onoff というモジュールを使用することをお勧めします。

間隔を置いてポーリングすることでCPUに負担をかけずに、値ファイルを監視する機能があります。

Node.jsを使用して小さなテストアプリを作成し、LEDとボタンを試してみました。チェックしてみてください ここ

11
Olli K

残念ながら、ハードウェア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の方が速いと人間の目では違いを検出できないので、50msが良い数値だと思います。

10
Russ Bradberry

このモジュールに出くわしました

https://github.com/EnotionZ/GpiO

詳細は調べていませんが、バックグラウンドでsetIntervalメソッドを使用しているようです。

3
Rudie

余談ですが、 Espruino と呼ばれるnode.jsに非常によく似たプロジェクトがあります(ただし、はるかに削減されています)。

これはRaspberryPi(および多くの低電力ARMマイクロコントローラーも)で実行され、HTTPをサポートし、 setWatch と呼ばれる関数を備えており、必要な方法で動作します。

0
Gordon Williams