2013-01-21 11 views
23

ho collegato un pulsante alle porte Raspberry Pi GPIO:asincrono lampone pi eventi GPIO in nodejs

http://adafruit.com/products/801

Il nodo js modulo pi-gpio permette solo di tirare lo stato attuale ma non in attesa per un cambiamento di stato :

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

Esiste una soluzione per associare gli eventi in modo asincrono?

In questo esempio, ciò avverrebbe ogni volta che si preme il pulsante.

risposta

11

Suggerirei di utilizzare il modulo chiamato onoff.

Ha la capacità di guardare un file di valori senza tassare la CPU con intervalli di polling.

Ho creato una piccola app di test con node.js per provare i LED ei pulsanti con esso, è possibile verificarlo here.

10

purtroppo non viene generato alcun evento quando si utilizza l'hardware GPIO. È possibile creare un evento utilizzando un emettitore e setInterval per creare un timer che controlla lo stato ogni tanto e quindi emette un evento per l'applicazione.

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 

È possibile regolare il timer in base alle proprie esigenze. Penso che 50ms sia un buon numero in quanto non è possibile per l'occhio umano rilevare la differenza se è più veloce.

3

Ho appena venuto attraversavano questo modulle

https://github.com/EnotionZ/GpiO

non ho guardato a fondo ad esso, ma si sembra che utilizza il metodo setInterval in background.

+2

Sì, utilizza lo stesso metodo descritto nella mia risposta. –

0

Per inciso, c'è un progetto molto simile a node.js (comunque molto più ridotto) chiamato Espruino.

Questo funziona su Raspberry Pi (e anche su molti microcontroller ARM a bassa potenza), supporta HTTP e ha una funzione chiamata setWatch che si comporta esattamente nel modo richiesto.

Problemi correlati