【问题标题】:Reading input pins with johnny-five and arduino使用 johnny-5 和 arduino 读取输入引脚
【发布时间】:2014-12-04 21:49:21
【问题描述】:

我正在使用 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 次。我做错了什么?

【问题讨论】:

    标签: javascript node.js arduino johnny-five


    【解决方案1】:

    完全正确。这些值的读取速度比您的手移动速度快,因此在您更改设备的物理状态之前,可能会读取许多当前状态(无论是“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 Channel

    【讨论】:

    • 太棒了,很高兴我能帮上忙 :)
    【解决方案2】:

    您也可以为此使用标准的 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();    
      });
    });
    

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

    【讨论】:

      猜你喜欢
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多