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,则输出按钮被松开的消息。

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

相关内容

热门资讯

记者揭秘!智星菠萝辅助(透视辅... 记者揭秘!智星菠萝辅助(透视辅助)拱趴大菠萝辅助神器,扑克教程(有挂细节);模式供您选择,了解更新找...
一分钟揭秘!约局吧能能开挂(透... 一分钟揭秘!约局吧能能开挂(透视辅助)hhpoker辅助靠谱,2024新版教程(有挂教学);约局吧能...
透视辅助!wepoker模拟器... 透视辅助!wepoker模拟器哪个好用(脚本)hhpoker辅助挂是真的,科技教程(有挂技巧);囊括...
透视代打!hhpkoer辅助器... 透视代打!hhpkoer辅助器视频(辅助挂)pokemmo脚本辅助,2024新版教程(有挂教程);风...
透视了解!约局吧德州真的有透视... 透视了解!约局吧德州真的有透视挂(透视脚本)德州局HHpoker透视脚本,必胜教程(有挂分析);亲,...
六分钟了解!wepoker挂底... 六分钟了解!wepoker挂底牌(透视)德普之星开辅助,详细教程(有挂解密);德普之星开辅助是一种具...
9分钟了解!wpk私人辅助(透... 9分钟了解!wpk私人辅助(透视)hhpoker德州透视,插件教程(有挂教学);风靡全球的特色经典游...
推荐一款!wepoker究竟有... 推荐一款!wepoker究竟有透视(脚本)哈糖大菠萝开挂,介绍教程(有挂技术);囊括全国各种wepo...
每日必备!wepoker有人用... 每日必备!wepoker有人用过(脚本)wpk有那种辅助,线上教程(有挂规律);wepoker有人用...
玩家必备教程!wejoker私... 玩家必备教程!wejoker私人辅助软件(脚本)哈糖大菠萝可以开挂,可靠技巧(有挂神器)申哈糖大菠萝...