0

我正在 Arduino 上制作一个带有 3 个按钮和 16x2 LCD 屏幕的计时器。显然,我想按一下我的开始按钮,让计时器开始计时,直到按下停止按钮。我有一个重置按钮,它连接到重置引脚,所以我没有为它编写代码。

我已经去过 ladayada.com 关于按钮状态的教程,我严格按照说明进行操作。我仍然得到错误的结果。

signed short minutes, seconds;
char timeline[16];
int startPin = 7;
int stopPin = 6;
int buttonState1;
int buttonState2;
int oldState;
int currentState;

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(startPin,INPUT_PULLUP);
  pinMode(stopPin,INPUT_PULLUP);

  buttonState1 = digitalRead(startPin);
  buttonState2 = digitalRead(stopPin);

void loop() {
 currentState = digitalRead(startPin);
  if(currentState!= buttonState1){
  if(currentState==LOW){ 

  lcd.setCursor(0, 1);
  sprintf(timeline,"%0.2d mins %0.2d secs", minutes, seconds);
  lcd.print(timeline);
  delay(1000);
  seconds++; 

 if (seconds == 60){
    seconds = 0;
    minutes ++; }
  }
  }

 if(buttonState2==LOW){
    delay(500);
    sprintf(timeline,"%0.2d mins %0.2d secs", minutes, seconds);
    }

 buttonState1 = currentState;
}

我希望 Arduino 保存按钮的状态并计数,直到按下停止按钮。按下停止按钮时,应显示按下时的时间(当前计数)。相反,必须按两次“开始”按钮才能计数一秒。我什至无法理解停止按钮的逻辑。

4

1 回答 1

0

如果只在程序开始时按下开始按钮,为什么不等待按钮动作setup()呢?

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(startPin,INPUT_PULLUP);
  pinMode(stopPin,INPUT_PULLUP);

  while (digitalRead(startPin) != LOW); // <- wait for button action
}

loop()中,您要向上计数,直到按下停止按钮。如果您之后进行硬件重置,您可以在按下停止按钮后将程序置于无限循环中。

void loop() {
  lcd.setCursor(0, 1);
  sprintf(timeline,"%0.2d mins %0.2d secs", minutes, seconds);
  lcd.print(timeline);
  delay(1000);

  seconds++; 

  if (seconds == 60) {
    seconds = 0;
    minutes ++; 
  }

  if (digitalRead(stopPin) == LOW) {
    delay(500);
    sprintf(timeline,"%0.2d mins %0.2d secs", minutes, seconds);
    while(true) {} // infinite loop
  }
}
于 2019-05-03T19:22:31.087 回答