Как сохранить значение состояния кнопки для таймера?

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


person Jay    schedule 03.05.2019    source источник
comment
Ваш код не C, это C++.   -  person Antti Haapala    schedule 03.05.2019
comment
В вашем примере кода отсутствует закрывающая скобка (}) в конце функции setup().   -  person mhopeng    schedule 05.05.2019


Ответы (1)


Если вы нажимаете кнопку запуска только в начале программы, почему бы вам просто не дождаться действия кнопки в 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
  }
}
person Kentaro Okuda    schedule 03.05.2019
comment
Большое спасибо! Я не знал, что вы можете объявить цикл while как функцию в настройках и передать параметр true или false при его вызове, круто! - person Jay; 06.05.2019