Не работает задержка millis() esp8266

Рейтинг: 0Ответов: 2Опубликовано: 20.03.2023

У меня есть:

  1. esp8266
  2. Матрица MAX7219
  3. Библа GyverMAX7219.h

Так же есть функция вывода времени и температуры с интернета(что-то типа умных часов) и в функции вывода температуры должна быть задержка, delay() на удивление работает нормально, но его использовать нельзя. Остаётся только millis(), но в условной конструкции, такое ощущение, что таймер не срабатывает, а в конструкции цикла while,таймер срабатывает, температуру выводит, но по искончанию esp8266 ресетается. Подобное встречал раньше когда хотел сделать мигающее двоеточие, но там двоеточие по времени таймера сначала нету (так и должно быть), мигает и моментально пропадает. Я думаю, что тут один общий косяк. Помогите пожалуйста! p.s Если нужен весь код, скажите, предоставлю.

#define INTERNET_WEATHER_TIME 10000
void outInfo(bool time, bool tempInternet)
{
  if(time)
  {
    internetTime();
  }
  if (tempInternet)
  {
    const unsigned long interval = INTERNET_WEATHER_TIME;
    static unsigned long previousMillis = 0;
    unsigned long currentMillis = millis();

    if (currentMillis - previousMillis >= interval)
    {
      previousMillis = currentMillis;
      internetTemperature();
      //тут всё ок
    }
  }
  
}

void internetTime()
{
  matrix.clear();
  matrix.setCursor(3, 1);
  matrix.print(String(hours < 10 ? "0" : "") + hours);
  matrix.setCursor(14, 1);
  matrix.print(":");
  matrix.setCursor(18, 1);
  matrix.print(String(minutes < 10 ? "0" : "") + minutes);
  matrix.update();
}

void internetTemperature()
{

  matrix.clear();
  matrix.setCursor(10, 1);
  matrix.print(temperature);
  matrix.setCursor(16, 1);
  matrix.print("C");
  matrix.update();
  const unsigned long interval = 5000;
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    //тут проблема
  }
}

Ответы

▲ 0
if (currentMillis - previousMillis >= interval)
{
  previousMillis = currentMillis;
  internetTemperature();
  //тут всё ок
}

Может лучше сделать этот таймер один раз и он будет менять значение переменной по сбросу, а дальше уже привязывать события к значению этой переменной? А если этот код повторяется дважды в программе, то во второй раз там уже previousMillis = currentMillis;, то есть он уже сброшен.

▲ 0

previousMillis = 0 каждый цикл она обнуляется и тут караз проблема. Выносите эту переменную в глобал