Код Arduino Uno создает неправильные значения времени

StackOverflow https://stackoverflow.com//questions/23050491

  •  21-12-2019
  •  | 
  •  

Вопрос

Здравствуйте, у меня есть недавно приобретенная плата Arduino Uno, и я пытаюсь запустить на ней функцию секундомера.У меня есть две кнопки мгновенного действия.При нажатии первой кнопки в переменной startTime сохраняется количество времени, прошедшее с тех пор, как программа начала использовать функцию millis().Когда позже нажимается вторая кнопка, она также сохраняет количество времени, прошедшее с момента запуска программы, в переменной endTime, используя ту же функцию millis().Затем он вычисляет timeElapsed, отделяя startTime от endTime.

Между ними я использовал Serial.print для отладки.Я получаю ожидаемые значения startTime и endTime, и они верны, однако мое значение elapsedTime, похоже, работает неправильно.

Есть один ключ к решению проблемы.Прошедшее время предназначено для возврата значения endTime-startTime.Однако вместо этого он всегда возвращает значение endTime-773.Я не уверен, что именно это означает, но считаю, что это может быть полезная информация, которая поможет решить мою проблему.

void setup(){
  Serial.begin(9600); //start the Serial.moniter on the computer
  pinMode(2, INPUT);  //Set the button attached to pin 2 as an input
  pinMode(3, INPUT);  //Set the button attached to pin 3 as an input
}

void loop(){
  int buttonStateTwo = digitalRead(2);  //stores either a HIGH(button pressed) or LOW(button not being pressed) value
  int buttonStateThree = digitalRead(3);

  unsigned int startTime;  
  unsigned int endTime;
  unsigned int elapsedTime;

  if(buttonStateTwo == HIGH){       //if the button is pressed
    startTime = millis();  
    Serial.print(" The start time is: "); 
    Serial.print(startTime);
    delay(1000);                    //pause the program for a second
  }

  if(buttonStateThree == HIGH){
    endTime = millis();
    Serial.print(" The end time is: ");
    Serial.print(endTime);                   
    elapsedTime = endTime-startTime;         //this returns an incorrect value
    Serial.print(" The time elapsed is: ");
    Serial.println(elapsedTime);             //incorrect value 
    delay(1000);
  }
}

Я был бы очень благодарен, если бы кто-нибудь мог мне помочь, поскольку я уже много лет пытаюсь решить эту проблему и применяю много разных подходов.

Это было полезно?

Решение

Объявление переменных выполняется в loop().Это означает, что каждый раз loop() вызывается библиотеками Arduino, эти переменные могут содержать произвольные значения, которые могут совпадать или не совпадать со значениями, которые они имели при loop() последний раз звонили.Вместо этого переместите объявления в область действия модуля (за пределами и до loop()), так что они создаются только один раз.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top