ESP8266使用Button2库操作D0脚

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

一、硬件


ESP8266具有丰富的引脚接口,如下所示。引脚说明更详细的在:ESP8266引脚的说明 - ejiyuan - 博客园 (cnblogs.com)

ESP8266引脚说明

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

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

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

二、问题描述


由于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!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用ESP8266通过STM32的串口2通信的示例代码: ```c #include "stm32f10x.h" #include "usart.h" // 串口驱动 #define ESP8266_USART USART2 // 定义使用的USART #define ESP8266_BAUDRATE 115200 // 定义ESP8266的波特率 void ESP8266_Init(void) { USART_InitTypeDef USART_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 使能USART2时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // PA2为USART2的TX引 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = ESP8266_BAUDRATE; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(ESP8266_USART, &USART_InitStructure); USART_Cmd(ESP8266_USART, ENABLE); } int main(void) { ESP8266_Init(); while (1) { USART_SendData(ESP8266_USART, 'A'); while (USART_GetFlagStatus(ESP8266_USART, USART_FLAG_TXE) == RESET); delay_ms(500); // 发送完毕后等待一段时间 USART_SendData(ESP8266_USART, 'B'); while (USART_GetFlagStatus(ESP8266_USART, USART_FLAG_TXE) == RESET); delay_ms(500); // 发送完毕后等待一段时间 } } ``` 在该代码中,我们将使用USART2作为与ESP8266通信的接口,并通过ESP8266_Init函数对USART2进行初始化。在主函数中,我们通过USART_SendData函数向ESP8266发送数据,并通过USART_GetFlagStatus函数检查发送是否完成。需要注意的是,在每次发送完毕后我们都需要等待一段时间,否则可能会影响ESP8266的响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值