使用 Button2 库对 D0 脚操作注意事项


文章目录

  • 使用 Button2 库对 D0 脚操作注意事项
  • 一、硬件
  • 二、问题描述
  • 三、总结


一、硬件


ESP8266具有丰富的引脚接口,如下所示。

esp8266ex引脚详细 esp8266各个引脚说明_esp8266ex引脚详细

  • 当我们做项目的过程中,一般是不会去使用 D0 脚的,但当引脚不够使用的情况下,我们还是希望 D0 脚能有点作用

刚好,最近做项目发现一个不错的按键库,叫 Button2,它可以轻易实现按键的:单击、双击、长按,甚至是松手触发,以下是该库的源仓库地址:

  • LennartHennigs/Button2: Arduino/ESP button library that provides callback functions to track single, double, triple and long clicks. It also takes care of debouncing. (github.com)

在使用这个库的过程中,开发者仅需要较少的代码,即可实现上述提到的操作。推荐大家使用!!!

二、问题描述


由于D0脚默认有下拉电阻,而其他脚均为上拉电阻,这导致其无法被上拉。而我们想要使用 Button2 库实现按键检测,则需要在初始化的过程中进行以下配置:

Button2 Button_UP  = Button2(D0, INPUT_PULLDOWN_16, false);

这里我们可以看到Button2库的源码,其 Button2.h 中:

Button2();
Button2(byte attachTo, byte buttonMode = INPUT_PULLUP, boolean activeLow = true);

void begin(byte attachTo, byte buttonMode = INPUT_PULLUP, boolean activeLow  = true);
  • 由此,结合函数名和传参我们不难理解,其中
  • attachTo: 传递的是引脚名称
  • buttonMode: 传递的是IO引脚模式
  • activeLow: 传递的是 是否为低电平触发

Button2.cpp 中对于它的初始化函数为:

Button2::Button2(byte attachTo, byte buttonMode /* = INPUT_PULLUP */, boolean activeLow /* = true */) {
  begin(attachTo, buttonMode, activeLow);
  _setID();
}

/

void Button2::begin(byte attachTo, byte buttonMode /* = INPUT_PULLUP */, boolean activeLow /* = true */) {  
  pin = attachTo;
  longclick_counter = 0;
  longclick_retriggerable = false;
  _pressedState = activeLow ? LOW : HIGH;
  if (attachTo != VIRTUAL_PIN) {
    pinMode(attachTo, buttonMode);
  }
  //  state = activeLow ? HIGH : LOW;
  state = _getState();
  prev_state = state ;
}

可以看到,默认使用时,管脚配置为 上拉输入,检测状态配置为 低电平检测,而对于 D0 而言则不能这样操作。所以我们按照上述的写法进行更改,然后就可以愉快使用这个库啦!!!

三、总结

  • 首先要理解 IO 口的功能以及是否有上拉或下拉电阻
  • 其次要看使用的库中初始化传递的参数信息

很高兴大家能看到这篇文章,其实这也是一个小的细节性问题,希望大家在今后的工程中,少出 bug!!!