I connected a button to the Raspberry Pi GPIO ports:
The pi-gpio node
unfortunately there is no event generated when using the hardware GPIO. You can create an event by using an emitter and setInterval
to create a timer that checks the status every so often and then emits an event out to your application.
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
You can tune the timer to your requirements. I think 50ms is a good number as it is not possible for the human eye to detect the difference if it is faster.
As an aside, there is a project very similar to node.js (however much more cut-down) called Espruino.
This runs on Raspberry Pi (and many low power ARMs microcontrollers too), supports HTTP, and has a function called setWatch which behaves in exactly the way you require.
I just came accross this modulle
https://github.com/EnotionZ/GpiO
I have not looked in depth to it but is seems it uses the setInterval method in the background.
I'd suggest using the module called onoff.
It has the ability to watch a value-file while not taxing the cpu with polling in intervals.
I made a small test-app with node.js to try out leds and buttons with it, you can check it out here.