Arduino内部有一个拉高的电阻,为20K,这样使用按钮时,就不需要外接上拉电阻了,然后按钮设置为按下为低。
#include <Arduino.h>
void setup()
{
Serial.begin(115200);
pinMode(23, INPUT_PULLUP); // 使用内部电阻进行拉高,常用
Serial.println(digitalRead(23));
}
void loop()
{
}
单按钮多状态
按一次的状态检测:上次状态和本次状态相反,由于按键有抖动,所以进行软件消抖,可以单独创建一个按键扫描的任务。
按两次:检测在一段时间内按了几次。
ESP32官方的注册组件有一个button按钮这样的库,但是功能没有OneButton这个功能多,比如自定义抖动时间,自定义长按时间。
#include <Arduino.h>
#include "OneButton.h"
#define BTN1_PIN 23
#define active_low true
#define pullup_enable true
/*按钮低电平有效,开启内部拉高*/
OneButton button1(BTN1_PIN, active_low, pullup_enable);
// 第一个参数,按钮连接的引脚
// 第二个参数,true 低电平有效,false 高电平有效
// 第三个参数,是否开启内部拉高
void singleClick1() {}
void doubleClick1() {}
void multiClick1()
{
int n = button1.getNumberClicks();
switch (n)
{
case 3:
Serial.println("Triple Click");
break;
case 4:
Serial.println("Quadruple Click");
break;
}
}
void longPressStart1()
{
}
void longPressStop1()
{
}
void longPress1()
{
}
void setup()
{
Serial.begin(115200);
button1.setDebounceTicks(50); // 设置按键消抖时长
button1.setClickTicks(500); // 设置点击时长
button1.attachClick(singleClick1); // 绑定点击事件,单击
button1.attachDoubleClick(doubleClick1); // 双击
button1.attachMultiClick(multiClick1); // 多连击
button1.setPressTicks(800); // 长按时间判定,800ms后算长按
button1.attachLongPressStart(longPressStart1); // 长按开始(可选)
button1.attachLongPressStop(longPressStop1); // 长按结束(可选)
button1.attachDuringLongPress(longPress1); // 长按过程中运行的程序
}
void loop()
{
button1.tick(); // 按键扫描
}