Почему функция внутри настройки void повторяется через несколько минут

Я пытаюсь синхронизировать свое оборудование Arduino с NTP-сервером по времени. У меня есть функция setSyncProvider(getNtpTime) для этого, которая вызывается внутри настройки void. У меня есть еще одна функция (mainFunction) внутри основного цикла, которая вызывается каждую минуту. Я добавил функцию для отображения времени внутри этой mainFunction, чтобы время обновлялось каждые минуты. Код работает нормально первые пять минут. Затем он снова вызывает getNtpTime, даже если он не находится внутри цикла. Почему это происходит?

time_t getNtpTime()
{
  while (Udp.parsePacket() > 0) ; // отбросить все ранее полученные пакеты
  Serial.println("Transmit NTP Request");
  sendNTPpacket(timeServer);
  uint32_t beginWait = millis();
  while (millis() - beginWait < 1500) {
    int size = Udp.parsePacket();
    if (size >= NTP_PACKET_SIZE) {
      Serial.println("Receive NTP Response");
      Udp.read(packetBuffer, NTP_PACKET_SIZE);  // читаем пакет в буфер
      unsigned long secsSince1900;
      // конвертируем четыре байта, начиная с позиции 40, в длинное целое
      secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
      secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
      secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
      secsSince1900 |= (unsigned long)packetBuffer[43];
      return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
    }
  }
  Serial.println("No NTP Response :-(");
  return 0; // вернуть 0, если невозможно получить время
}



, 👍0

Обсуждение

Arduino по какой-то причине перезагружается?, @SBF

Но никакие другие функции внутри пустого набора не повторялись. Если бы Arduino перезагружался, все внутри настройки должно было повториться, верно?, @master_yoda

у меня есть эта функция millis() внутри getNtpTime() и mainFunction(). есть вероятность конфликтов?, @master_yoda


1 ответ


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

1

Функция setSyncProvider библиотеки TimeLib устанавливает функцию, которая будет вызываться библиотекой каждые interval секунд. interval устанавливается с помощью setSyncInterval. Интервал по умолчанию — 300 секунд.

,

Я проверил время звонков в последовательном мониторе. Как я уже упоминал в вопросе, в моем основном цикле есть функция, которая вызывается каждую минуту. в основном цикле getNtpTime вызывается на 360,8 секунды, а затем на 660,8. После первого вызова ошибки отображения не было. Но после второго вызова произошла ошибка отображения. Дисплей вернулся в нормальное состояние в следующую минуту, и описанный выше цикл ошибки повторился. Это означает, что 3-й вызов был в порядке, 4-й дает ошибку. 5-й был в порядке, 6-й выдает ошибку! Какие-либо предложения, @master_yoda

попробуйте немного увеличить время ожидания, @Juraj