Почему функция внутри настройки 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, если невозможно получить время
}
@master_yoda, 👍0
Обсуждение1 ответ
Лучший ответ:
Функция setSyncProvider
библиотеки TimeLib устанавливает функцию, которая будет вызываться библиотекой каждые interval
секунд. interval
устанавливается с помощью setSyncInterval
. Интервал по умолчанию — 300 секунд.
Я проверил время звонков в последовательном мониторе. Как я уже упоминал в вопросе, в моем основном цикле есть функция, которая вызывается каждую минуту. в основном цикле getNtpTime вызывается на 360,8 секунды, а затем на 660,8. После первого вызова ошибки отображения не было. Но после второго вызова произошла ошибка отображения. Дисплей вернулся в нормальное состояние в следующую минуту, и описанный выше цикл ошибки повторился. Это означает, что 3-й вызов был в порядке, 4-й дает ошибку. 5-й был в порядке, 6-й выдает ошибку! Какие-либо предложения, @master_yoda
попробуйте немного увеличить время ожидания, @Juraj
- Что происходит при включении Arduino и сколько времени все это занимает?
- Есть ли способ перенести дату и время моего MacBook в Arduino IDE?
- Получить подсчет производства за текущую минуту
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как справиться с rollover millis()?
- Как получить текущее время и дату в Arduino без внешнего источника?
- Преобразование в Unix Timestamp и обратно
Arduino по какой-то причине перезагружается?, @SBF
Но никакие другие функции внутри пустого набора не повторялись. Если бы Arduino перезагружался, все внутри настройки должно было повториться, верно?, @master_yoda
у меня есть эта функция
millis()
внутриgetNtpTime()
иmainFunction()
. есть вероятность конфликтов?, @master_yoda