Arduino中DS3231 RTC时间戳秒数截断问题的代码修改求助
问题分析
你的推测完全正确,当前判断逻辑只对比分钟数差值,忽略了秒数的影响,这是导致后续时间戳秒数被截断的核心原因:
- 第一次触发时,
time_previous被设置为包含具体秒数的完整时间(比如14:02:31); - 后续触发条件仅检查分钟差≥1,会在新分钟到来的第一秒就触发(比如14:03:00),此时
time_previous被重置为这个整分时间; - 循环往复,后续所有触发的时间戳自然都会显示为整分的0秒。
另外,直接比较分钟数还存在边界bug:当时间从59分跳转到0分(如23:59:xx→00:00:xx),abs()计算的分钟差会是59,会导致误触发。
解决方法
改用Adafruit DateTime类的unixtime()方法,将时间转换为Unix时间戳(从1970年开始的总秒数),直接比较秒数差是否达到设定间隔,这种方式能准确处理所有时间边界情况,同时保留完整的秒数信息。
修改后的核心代码如下:
// 定义触发间隔(秒),示例为1分钟=60秒 const unsigned long TRIGGER_INTERVAL = 60; // 注意:需在setup()中初始化time_previous为当前RTC时间 // time_previous = rtc.now(); if (time_current.unixtime() - time_previous.unixtime() >= TRIGGER_INTERVAL) { // 重置定时器为当前完整时间 time_previous = time_current; // 以下原有代码保持不变 dtostrf(ReadTemperatureF(), 3, 1, tempF); dtostrf(ReadHumidity(), 3, 1, humd); logfile.print(time_current.timestamp(DateTime::TIMESTAMP_DATE)); logfile.print(','); logfile.print(time_current.timestamp(DateTime::TIMESTAMP_TIME)); logfile.print(','); logfile.print(tempF); logfile.print(','); logfile.println(humd); logfile.flush(); #if DEBUG == 1 Serial.print(time_current.timestamp(DateTime::TIMESTAMP_DATE)); Serial.print(','); Serial.print(time_current.timestamp(DateTime::TIMESTAMP_TIME)); Serial.print(','); Serial.print(tempF); Serial.print(','); Serial.println(humd); #endif CreateNewLogFile(time_current); }
额外说明
unixtime()直接基于总秒数计算差值,无需手动处理时分秒的进位逻辑,简洁且可靠;- 如果需要调整触发间隔(比如30秒),只需修改
TRIGGER_INTERVAL的数值即可,灵活性更高; - 务必在
setup()中完成time_previous的初始化,避免第一次触发逻辑异常。
内容的提问来源于stack exchange,提问作者Fabian Butkovich
相关产品推荐
相关产品推荐

