2013-01-21 20 views
23

podłączony przycisk do portów Raspberry Pi GPIO:asynchroniczny Raspberry Pi GPIO wydarzenia nodejs

http://adafruit.com/products/801

pi-gpio węzeł js Moduł pozwala jedynie wyciągnąć aktualny stan, ale nie czekając na zmianę stanu :

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

Czy istnieje rozwiązanie asynchronicznie wiążące zdarzenia?

W tym przykładzie będzie to zawsze, gdy przycisk zostanie naciśnięty.

Odpowiedz

11

Proponuję użyć modułu o nazwie onoff.

Ma możliwość oglądania pliku wartości bez jednoczesnego obciążania procesora za pomocą odpytywania.

Zrobiłem małą aplikację testową z plikiem node.js, aby wypróbować diody LED i przyciski, można to sprawdzić here.

10

Niestety nie ma żadnego zdarzenia generowanego podczas korzystania ze sprzętowego GPIO. Możesz utworzyć wydarzenie, używając emiterów i setInterval, aby utworzyć zegar, który co jakiś czas sprawdza stan, a następnie emituje wydarzenie do Twojej aplikacji.

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 

Możesz ustawić czasomierz zgodnie z własnymi wymaganiami. Myślę, że 50 ms to dobra liczba, ponieważ ludzkie oko nie jest w stanie wykryć różnicy, jeśli jest szybsza.

3

ja po prostu przyszedł po drugiej stronie tej modulle

https://github.com/EnotionZ/GpiO

Nie wyglądał na głębokości do niego, ale wydaje się, że wykorzystuje metodę setInterval w tle.

+2

Tak, używa tej samej metody, którą opisałem w mojej odpowiedzi. –

0

Na marginesie istnieje projekt bardzo podobny do node.js (bez względu na to, o wiele bardziej szczegółowo) o nazwie Espruino.

Działa na Raspberry Pi (i wielu mikrokontrolerach ARM małej mocy), obsługuje protokół HTTP i ma funkcję o nazwie setWatch, która zachowuje się dokładnie tak, jak tego potrzebujesz.

Powiązane problemy