Arduino中的多按钮按下管理
创始人
2024-09-13 00:00:29
0

在Arduino中管理多个按钮按下的一种解决方法是使用状态机来跟踪每个按钮的状态。以下是一个示例代码,演示如何管理三个按钮的按下:

const int button1Pin = 2;  // 第一个按钮连接到引脚2
const int button2Pin = 3;  // 第二个按钮连接到引脚3
const int button3Pin = 4;  // 第三个按钮连接到引脚4

// 定义按钮的状态
enum ButtonState {
  Idle,     // 空闲状态,按钮未按下
  Pressed,  // 按下状态,按钮刚刚被按下
  Held,     // 按住状态,按钮一直被按住
  Released  // 松开状态,按钮已被松开
};

ButtonState button1State = Idle;
ButtonState button2State = Idle;
ButtonState button3State = Idle;

void setup() {
  pinMode(button1Pin, INPUT_PULLUP);
  pinMode(button2Pin, INPUT_PULLUP);
  pinMode(button3Pin, INPUT_PULLUP);
}

void loop() {
  // 读取按钮的状态
  ButtonState button1NewState = readButtonState(button1Pin);
  ButtonState button2NewState = readButtonState(button2Pin);
  ButtonState button3NewState = readButtonState(button3Pin);

  // 处理按下和松开事件
  handleButtonEvent(button1State, button1NewState, 1);
  handleButtonEvent(button2State, button2NewState, 2);
  handleButtonEvent(button3State, button3NewState, 3);

  // 保存当前按钮状态
  button1State = button1NewState;
  button2State = button2NewState;
  button3State = button3NewState;
}

// 读取按钮的状态
ButtonState readButtonState(int buttonPin) {
  int buttonState = digitalRead(buttonPin);

  if (buttonState == LOW) {
    delay(10);
    if (digitalRead(buttonPin) == LOW) {
      return Pressed;
    } else {
      return Held;
    }
  } else {
    return Idle;
  }
}

// 处理按下和松开事件
void handleButtonEvent(ButtonState currentState, ButtonState newState, int buttonNumber) {
  if (newState == Pressed) {
    Serial.print("Button ");
    Serial.print(buttonNumber);
    Serial.println(" pressed.");
  } else if (newState == Released) {
    Serial.print("Button ");
    Serial.print(buttonNumber);
    Serial.println(" released.");
  }
}

上述代码创建了三个按钮的引脚常量,定义了按钮的状态枚举,以及每个按钮的当前状态变量。在setup()函数中,将按钮引脚设置为输入模式并启用内部上拉电阻。在loop()函数中,通过调用readButtonState()函数,读取每个按钮的状态,并调用handleButtonEvent()函数处理按下和松开事件。最后,保存当前按钮状态,以便在下一次循环中使用。

readButtonState()函数使用digitalRead()函数读取按钮引脚的状态。如果按钮引脚为低电平,表示按钮已按下,如果按钮引脚为高电平,表示按钮未按下。函数稍微延迟一段时间后再次读取按钮引脚的状态,以确保按下是真实的按下,而不是由于电气噪声造成的短暂按下。如果按钮引脚的状态仍为低电平,则返回Pressed状态,否则返回Held状态或Idle状态。

handleButtonEvent()函数根据当前状态和新状态来处理按下和松开事件。如果新状态为Pressed,则输出按钮被按下的消息。如果新状态为Released,则输出按钮被松开的消息。

以上代码提供了一种基本的多按钮按下管理解决方案,您可以根据实际需要进行修改和扩展。

相关内容

热门资讯

一分钟揭秘“奇迹陕西三代辅助器... 一分钟揭秘“奇迹陕西三代辅助器免费”从来有辅助挂(有挂细节);无需打开直接搜索加薇136704302...
发现一款“拱趴大菠萝挂怎么安装... 【亲,拱趴大菠萝挂怎么安装 这款游戏可以开挂的,确实是有挂的,很多玩家在这款拱趴大菠萝挂怎么安装中打...
玩家必看攻略“威信茶馆跑辅助器... 玩家必看攻略“威信茶馆跑辅助器”原先有辅助安装(有挂规律)您好:威信茶馆跑辅助器这款游戏可以开挂,确...
总算明白“雀神挂件怎么安装”素... 总算明白“雀神挂件怎么安装”素来有开挂辅助安装(有挂方式)这是一款可以让一直输的玩家,快速成为一个“...
透视好友房“微乐小程序游戏破解... 您好:微乐小程序游戏破解器下载这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多...
透视安卓版“贰柒拾智能辅助柒”... 透视安卓版“贰柒拾智能辅助柒”本来有开挂辅助工具(有挂技巧);无需打开直接搜索微信(13670430...
总算了解“中至赣牌圈挂件价格明... 大家好,今天小编来为大家解答中至赣牌圈挂件价格明细这个问题咨询软件客服可以免费测试直接加微信(136...
透视游戏“广东闲来辅助神器免费... 透视游戏“广东闲来辅助神器免费版”先前有辅助开挂挂(有挂技巧);无需打开直接搜索薇:13670430...
一分钟教会你“上饶中至辅助插件... 一分钟教会你“上饶中至辅助插件透视”原先有辅助开挂工具(有挂存在);无需打开直接搜索加薇136704...
透视透视挂“潮汕馆插件”从前有... 【亲,潮汕馆插件 这款游戏可以开挂的,确实是有挂的,很多玩家在这款潮汕馆插件中打牌都会发现很多用户的...