Adafruit RTClib TimeSpan 计算在 ESP32 上失败

Adafruit RTClib TimeSpan calculation fails on ESP32

我目前正在尝试使用 Adafruit 的 RTClib library 测量给定时间戳之前的剩余时间。我的 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)

在这种情况下,条件永远不会满足。 我错过了什么吗?

你的代码行:

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

没有按照您的想法去做。

remaining.minutes() returns type int8_t 不输入 String。您将它添加到指向 C 字符串的 C 字符指针 remaining time: - 如果该值大于该字符串的长度,则生成的指针无效,您很幸运您的程序没有崩溃。

例如,如果 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()方法returns a String,因此向其添加C字符串导致字符串连接而不是向字符指针添加整数。

在这两种情况下,您对 String() 的封闭调用是多余的,应该避免:

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

您已经在计算 String 个值;无需从中创建新的 String 对象。

找出 remaining.minutes() 的值,以便回答您的​​其他问题。 remaining 的计算方式可能存在问题,并且是不同问题的问题。