Ошибка вычисления временного интервала Adafruit RTClib в ESP32

#c #esp32 #real-time-clock

#c #esp32 #часы реального времени

Вопрос:

В настоящее время я пытаюсь измерить оставшееся время до заданной метки времени, используя библиотеку RTClib Adafruit. Мой модуль RTC — это DS3231. вот мой объект TimeSpan в коде:

 TimeSpan remaining = next.depart - rtc.now();
 

Однако, когда я пытаюсь распечатать оставшиеся минуты, я не получаю данных.
Вот мой код, который выводит результат:

   Serial.println(String("current time: "   rtc.now().timestamp()));
  Serial.println(String("targetTime: "   next.depart.timestamp()));
  Serial.println(String("remaining time: "   remaining.minutes()));
 

И вывод правильный, за исключением оставшегося времени в минутах:

 current time: 2020-12-06T05:38:55
target time: 2020-12-06T05:42:30
aining time: 
 

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

 if(remaining.minutes() >= 10)
 

В этом случае условие никогда не выполняется.
Я что-то упустил?

Ответ №1:

Ваша строка кода:

   Serial.println(String("remaining time: "   remaining.minutes()));
 

делает не то, что вы думаете, что он делает.

remaining.minutes() возвращает тип int8_t , а не тип String . Вы добавляете его к указателю символа C на строку remaining time: C — если значение больше длины этой строки, то результирующий указатель недействителен, и вам повезло, что ваша программа не вылетает.

Например, если remaining.minutes() бы было 3, то ваш результат был бы:

 aining time: 
 

Вместо этого ваш код должен выглядеть примерно так:

   Serial.println("remaining time: "   String(remaining.minutes()));
 

или лучше:

   Serial.print("remaining time: ");
  Serial.println(remaining.minutes());
 

Преимущество второй формы заключается в том, что она позволяет избежать ненужных String экземпляров объектов и выделения памяти.

Причина, по которой ваши две строки:

   Serial.println(String("current time: "   rtc.now().timestamp()));
  Serial.println(String("targetTime: "   next.depart.timestamp()));
 

работа заключается в том, что timestamp() метод возвращает a String , поэтому добавление к нему символьной строки C приводит к конкатенации строк, а не к добавлению целого числа к символьному указателю.

В этих двух случаях ваш заключающий вызов String() является излишним, и его следует избегать:

   Serial.println("current time: "   rtc.now().timestamp());
  Serial.println("targetTime: "   next.depart.timestamp());
 

Вы уже вычисляете String значения; нет необходимости создавать String из них новые объекты.

Узнайте, какое значение remaining.minutes() имеет, чтобы ответить на ваш другой вопрос. Вероятно, это проблема со способом remaining вычисления, и это вопрос для другого вопроса.

Комментарии:

1. Вы были правы. Похоже, что приведение типа к строке или массиву символов работает. Я думал, что тип будет таким же, как в метке времени. Спасибо за ваш ответ.