用johnny-five和arduino读input引脚

我正在使用node.js和arduino应用程序。

我使用的是johnny-five框架,并且已经把标准草图草图上传到了我的arduino上,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'); } }); }); 

现在的问题是,当我拉我的街机控制器时,或多次logging“上”或“下”,它可以是5倍,可以是10倍。 我究竟做错了什么?

这是完全正确的。 读取的值比您手部移动的速度快,因此在更改设备的物理状态之前,可能会有许多当前状态的读取(无论是“HIGH”还是“LOW”)。 一个解决scheme是消除处理程序,另一个是存储最后一个值,只有当当前值不同时才运行:

 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); }); 

如果您还有其他问题,请不要犹豫,join我们的Johnny-Five Gitter Channel 。

你也可以使用标准的保险杠button类johnny-five。 它已经实施了debouce。

https://github.com/rwaldron/johnny-five/blob/master/docs/button-bumper.md

 var five = require("johnny-five"), bumper, led; five.Board().on("ready", function() { bumper = new five.Button(7); led = new five.Led(13); bumper.on("hit", function() { led.on(); }).on("release", function() { led.off(); }); }); 

这将需要你重构你的代码,但之后会更清晰。