Асинхронные малиновые события pi gpio в узлах
Я подключил кнопку к портам PIP GPIO для малины:
![http://adafruit.com/products/801]()
Модуль pi-gpio node позволяет только вывести текущий статус, но не ждать
для изменения состояния:
gpio.read(16, function(err, value) {
if(err) throw err;
console.log(value); // The current state of the pin
});
Есть ли какое-либо решение для асинхронного связывания событий?
В этом примере это будет всякий раз, когда нажимается кнопка.
Ответы
Ответ 1
Я бы предложил использовать модуль под названием onoff.
Он имеет возможность смотреть файл значений, не облагая налогом процессор с интервалом опроса.
Я сделал небольшое тестовое приложение с node.js, чтобы опробовать светодиоды и кнопки с ним, вы можете проверить здесь здесь.
Ответ 2
К сожалению, при использовании аппаратного 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
Я только что перешел к этому модулю
https://github.com/EnotionZ/GpiO
Я не смотрел в глубину, но кажется, что он использует метод setInterval в фоновом режиме.
Ответ 4
В стороне, есть проект, очень похожий на node.js(но гораздо более сокращенный), называемый Espruino.
Это работает на Raspberry Pi (и на многих микроконтроллерах с низким энергопотреблением ARM), поддерживает HTTP и имеет функцию setWatch, которая ведет себя точно так, как вам нужно.