Проблема с простым таймером на основе millis()

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

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

Есть ли какая-то ошибка в моем коде?

unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
const long interval = 1000;

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (currentMillis - previousMillis >= interval) {
    Serial.println(previousMillis);
    previousMillis = currentMillis;
  }
  else {
    ;
  }
}

//  previousMillis += interval;

, 👍1

Обсуждение

Простая проблема: вы нигде не обновляете переменную currentMillis. Его значение не обновляется волшебным образом, когда вы однажды присвоили ему значение millis (). Вставьте currentMillis = millis() прямо в начало функции loop ()., @chrisl

Спасибо вам за ваш ответ. Я думал, что он автоматически обновляется с последним значением millis() постоянно. Таким образом, он будет обновляться только на каждой итерации цикла? Если вы хотите опубликовать этот ответ, я могу принять его, если это имеет для вас какое-то значение, потому что это очень полезно для меня., @Zhelyazko Grudov


1 ответ


Лучший ответ:

2

Поскольку currentMillis - это всего лишь простая переменная, она не будет автоматически обновляться. На самом деле инициализация с помощью millis() в глобальной области видимости не нужна. Просто инициализируйте значение 0. В то время, когда создаются глобальные переменные, время в любом случае равно 0 мс.

Вам нужно обновлять переменную currentMillis каждый раз, прежде чем использовать ее. Так что просто вставьте

currentMillis = millis();

прямо в начале функции loop ().

,

Еще раз спасибо за вашу помощь., @Zhelyazko Grudov