2013-01-21 3 views
23

я подключил кнопку к портам Raspberry Pi GPIO:Асинхронного Raspberry Pi GPIO событие в nodejs

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

Есть ли какое-либо решение для асинхронного связывания событий?

В этом примере это будет всякий раз, когда нажимается кнопка.

ответ

11

Я бы предложил использовать модуль под названием onoff.

Он имеет возможность наблюдать файл значений, не облагая налогом процессор с интервалом опроса.

Я сделал небольшое тестовое приложение с node.js, чтобы опробовать светодиоды и кнопки с ним, вы можете проверить его here.

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 мс - это хорошее число, так как человеческому глазу невозможно обнаружить разницу, если она быстрее.

3

Я просто наткнулся на эту modulle

https://github.com/EnotionZ/GpiO

Я не смотрел в глубину к нему, но, кажется, он использует setInterval метод в фоновом режиме.

+2

Да, он использует тот же метод, который я описал в своем ответе. –

0

Как в стороне, есть проект, очень похожий на node.js (но гораздо более урезанный), называемый Espruino.

Это работает на Raspberry Pi (и многих микроконтроллерах с низким энергопотреблением ARM), поддерживает HTTP и имеет функцию setWatch, которая ведет себя точно так, как вам нужно.