【问题标题】:Arduino: detecting buttons pressed inside a while loopArduino:检测在while循环内按下的按钮
【发布时间】:2017-09-25 00:40:22
【问题描述】:

我一直在尝试编写一个代码,以便在我按下一个按钮时基本上为分数加分,同时一定的时间不多了。我发现的问题是它没有检测到在时间减少时按下按钮的时间,实际上它只能检测到时间开始减少的时间,然后按钮处于哪个状态都没有关系继续加分。无论如何这里是主要代码:

void loop() {
  buttonState01 = digitalRead(button01);
  buttonState02 = digitalRead(button02);
  buttonState03 = digitalRead(button03);

if (buttonState01){

time = 3000;
    while(time > 0){
      if (buttonState02){
        score += 10;
        Serial.println(score);
      }
  time--;
Serial.println(time);
    }
  }
}

如果需要,这里是完整的代码:

int button01 = 4;
int button02 = 3;
int button03 = 2;

int buttonState01 = 0;
int buttonState02 = 0;
int buttonState03 = 0;

float time;
int score;

void setup() {
  score = 0;

  time = 0;

  pinMode(button01, INPUT);
  pinMode(button02, INPUT);
  pinMode(button03, INPUT);

  Serial.begin(9600);
}

void loop() {
  buttonState01 = digitalRead(button01);
  buttonState02 = digitalRead(button02);
  buttonState03 = digitalRead(button03);

  if (buttonState01){
    time = 3000;
    while(time > 0){
      if (buttonState02){
        Serial.println("Points");
      }
      time--;
      Serial.println(time);  
    }
  }
}

【问题讨论】:

  • “我发现的问题是它没有检测到在时间减少时按下按钮的时间”。那是因为您在时间减少时没有阅读按钮。此外,任何地方都没有信号去抖动,因此除非您在硬件中安装了一些外部 RC 低通滤波器,否则此代码将永远无法可靠地工作。此外,如果外部没有拉电阻,则需要启用内部拉电阻。
  • 发布的代码缺少很多必要的语句。建议阅读:arduino.cc/en/Reference/digitalRead> 以更好地理解“按钮”处理

标签: c loops if-statement while-loop arduino


【解决方案1】:

您应该在 while 循环中读取按钮的状态。像这样:

while(time > 0)
{
  buttonState02 = digitalRead(button02);
  if (buttonState02){
    Serial.println("Points");
  }
  time--;
  Serial.println(time);  
}

并且在您的代码中,没有任何逻辑可以给分数加分。

【讨论】:

    【解决方案2】:

    硬件中断完全可以满足您的需求。

    将中断例程附加到您的按钮链接到的引脚上,并让它设置“分数”变量。确保引入某种超时以避免按钮弹跳(即在增加分数时设置 LastTimeIncremented,并且仅在 LastTimeIncremented 超过 1 秒前才增加分数)

    这样,无论程序可能执行什么其他操作,都会始终设置分数。

    这方面的信息可以在Arduinohttps://www.arduino.cc/en/Reference/attachInterrupt中找到

    该页面上的示例完全符合您的要求,只需将 'blink' 替换为 'incrementScore' 即可完成

     const byte ledPin = 13;
     const byte interruptPin = 2;
     int score = 0;
     int increment = 1;
    
    
    void setup() {
       pinMode(ledPin, OUTPUT);
       pinMode(interruptPin, INPUT_PULLUP);
       attachInterrupt(digitalPinToInterrupt(interruptPin), incScore, RISING);
    }
    
    void loop() {
       digitalWrite(ledPin, state);
    }
    
    void incScore() {
       score = score+increment;
       // add anti-bounce functionality here
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      相关资源
      最近更新 更多