Как сохранить значение состояния кнопки для таймера? - PullRequest
0 голосов
/ 03 мая 2019

Я делаю таймер с 3 кнопками и 16x2 ЖК-экраном на Arduino.Очевидно, я хочу нажать один раз кнопку пуска, чтобы таймер отсчитывал до тех пор, пока не будет нажата кнопка остановки.У меня есть кнопка сброса, что он подключен к контакту сброса, поэтому я не написал код для него.

Я уже был на уроке 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 сохранит состояние кнопки и будет считать до тех пор, пока не будет нажата кнопка остановки.Когда кнопка останова нажата, она должна отображать время (текущий счет), когда она была нажата.Вместо этого кнопку Старт нужно нажать дважды, чтобы считать одну секундуЯ даже не могу добраться до логики кнопки остановки.

1 Ответ

0 голосов
/ 03 мая 2019

Если вы нажмете кнопку пуска только в начале программы, почему бы вам просто не подождать действия кнопки в 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
  }
}
...