我正在使用node.js和arduino开发应用程序。
我正在使用johnny-five框架,并将StandardFirmata草图上载到我的arduino,后者在2、3、4和5针上连接了街机控制器。
这是我的实现:
var five = require('johnny-five');
var board
board = new five.Board();
board.on('ready', function(){
console.log('board is ready');
this.pinMode(2, five.Pin.INPUT);
this.pinMode(3, five.Pin.INPUT);
this.pinMode(4, five.Pin.INPUT);
this.pinMode(5, five.Pin.INPUT);
this.digitalRead(2, function(value) {
if(value === 0)
{
console.log('up');
}
});
this.digitalRead(3, function(value) {
if(value === 0) {
console.log('right');
}
});
this.digitalRead(4, function(value) {
if(value === 0) {
console.log('left');
}
});
this.digitalRead(5, function(value) {
if(value === 0) {
console.log('down');
}
});
});
现在的问题是,当我将街机控制器拉低或调高时,它多次记录“上”或“下”。它可能是5次,也可能是10次。我究竟做错了什么?
最佳答案
完全正确。读取值的速度比手移动的速度快,因此在更改设备的物理状态之前,可能要读取许多当前状态(无论是“高”还是“低”)。一种解决方案是消除处理程序的反跳,另一种解决方案是存储最后一个值,并且仅在当前值不同时才操作:
var five = require("../lib/johnny-five");
var board = new five.Board();
board.on("ready", function(){
var directions = {
up: { pin: 2, value: null },
right: { pin: 3, value: null },
left: { pin: 4, value: null },
down: { pin: 5, value: null },
};
Object.keys(directions).forEach(function(key) {
var pin = directions[key].pin;
this.pinMode(pin, five.Pin.INPUT);
this.digitalRead(pin, function(data) {
// Catpure the initial pin value
if (directions[key].value === null) {
directions[key].value = data;
}
// Something changed
if (directions[key].value !== data) {
console.log(pin, key);
}
directions[key].value = data;
});
}, this);
});
如有其他疑问,请随时加入Johnny-Five Gitter Channel。