1.单按钮多状态功能开发

单击

// 最好使用millis进行消抖,不要使用delay
#define button 8
#define debounce 100 // 按钮消抖时间

byte btnStatusCurrent = LOW;
byte btnStatusPrevious = LOW;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(button, INPUT);
}

void loop() {
  btnStatusCurrent = digitalRead(button);

  // 按钮按下
  // if (btnStatusCurrent == LOW) {
  //   Serial.println("按下");
  // }
  // 单击
  if ((btnStatusCurrent == LOW) && (btnStatusPrevious == HIGH)) {
   Serial.println("单击");

   delay(debounce);
  }
btnStatusPrevious =   btnStatusCurrent;

}

通过检测一段时间内按钮按动的次数,来实现对应的功能。

void clickTick()
{
  static byte pressCount = 0;
  static unsigned long clickMaxPeriod = 400; // 在400ms内检测一共按了多少次
  static unsigned long startTime = 0;
  static bool isStart = false;

  // 按下按钮松手后,按下前高电平,按下后低电平
  if((btnStatusCurrent == LOW) && (btnStatusPrevious == HIGH)){
  if (isStart = false)
  {                       // 按钮周期第一次开启
    pressCount = 1;       // 当前按钮次数1
    isStart = true;       // 设置周期开启
    startTime = millis(); // 记录周期开启时间
  }
  else
    pressCount++; //记录按钮次数
  delay(120);     // 按键消抖
  }
  // 如果周期已经开启,并且过了周期的等待时间
  if (((millis() - startTime) > clickMaxPeriod) && isStart)
  {
    isStart = false; //停止周期
    switch (pressCount)
    {
    case 1:
      singleClick();
      break;
    case 2:
      doubleClick();
      break;
    case 3:
      tripleClick();
      break;
    default:
      break;
    }
  }
}

使用库函数进行按钮功能开发,根据实际需要,进行按键自定义函数功能的书写

#include <Arduino.h>
#include "OneButton.h"

// 使用两个按钮
#define BTN1_PIN 2
#define BTN2_PIN A0

#define ACTIVE_LOW true
#define ACTIVE_HIGH false
#define PULLUP_ENABLE true
#define PULLUP_DISABLE false

// 按钮1实例化
OneButton button1(BTN1_PIN, ACTIVE_LOW, PULLUP_ENABLE);
// OneButton button(BTN1_PIN,true,true);
// 第二个参数:true 低有效  false 高有效
// 第三个参数:true 开启内部拉高  false 关闭内部拉高,默认为false

// 按钮2实例化
OneButton button2(BTN2_PIN, ACTIVE_HIGH, PULLUP_DISABLE);

void singleClick1() {}
void doubleClick1() {}
void multiClick1()
{
  int n = button1.getNumberClicks();
  switch (n)
  {
  case 3:
    Serial.println("Triple Click");
    break;
  case 4:
    Serial.println("4 Click");
    break;
  default:
    break;
  }
}

void LongPressStart1()
{
  Serial.println("");
}

void LongPressStop1()
{
  Serial.println("");
}

void LongPress1()
{
  Serial.println("");
}

void setup()
{
  Serial.begin(9600);
  button1.setDebounceTicks(50); // 按键消抖

  // 按键单击,双击,三连击,N连击
  button1.setClickTicks(500);              // 时间判定 500ms
  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();
  button2.tick();
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值