1

我正在使用 node.js 和 arduino 开发一个应用程序。

我正在使用 johnny-5 框架并将 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 次。我究竟做错了什么?

4

2 回答 2

3

这是完全正确的。这些值的读取速度比您的手移动速度快,因此在您更改设备的物理状态之前,可能会读取许多当前状态(无论是“HIGH”还是“LOW”)。一种解决方案是对处理程序进行去抖动,另一种是存储最后一个值,并且仅在当前值不同时才进行操作:

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 频道

于 2014-12-05T00:27:14.333 回答
3

您还可以为此使用标准的 johnny-5 保险杠按钮类。它已经实现了 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();    
  });
});

这将需要您重构代码,但之后会更干净。

于 2015-08-04T16:29:03.190 回答