E-ra IoT平台小时流量不重置问题求助(附ESP32代码)
ESP32+DS3231+YF-B1项目小时流量异常排查指南
核心问题现象
- 小时流量固定停留在午夜的14.9L,无法每小时自动清零
- 午夜过后,E-ra IoT平台图表不再显示小时流量数据(仅午夜有记录)
排查方向及代码检查点
1. DS3231 RTC时间同步与小时判断逻辑
- 先确认RTC时间读取是否准确:在串口打印当前RTC的年/月/日/时/分/秒,验证午夜过后小时数是否正常递增(比如从00→01→02...),排除RTC时间卡死或时区配置错误的问题
- 检查小时重置触发逻辑:代码中判断「进入新小时」的条件是否正确,常见错误包括:
- 误把日期切换当成小时切换的判断依据
last_hour初始化错误(比如固定设为0,午夜后未更新)- 时区偏移导致RTC时间与实际时间错位,触发逻辑失效
2. 小时流量变量的生命周期与重置逻辑
- 确认小时流量变量的存储类型:如果是局部变量,可能在函数调用后丢失数值;如果是全局变量,要检查是否在小时切换时执行了
hourly_flow = 0的重置操作 - 验证流量累加逻辑:检查YF-B1的脉冲计数是否正确累加到小时流量中,而非仅在午夜时赋值14.9L。可以在串口打印脉冲触发后的流量数值,确认累加是否正常
- 排查14.9L的来源:检查代码中是否有硬编码该数值的地方,或初始化时将
hourly_flow默认设为14.9L,导致重置逻辑失效后数值固定
3. E-ra IoT平台数据上传逻辑
- 检查上传触发时机:是否仅在午夜时上传小时流量,而非每小时定时上传?或设置了流量变化阈值,午夜后流量无变化导致不上传
- 验证上传数据格式:确保上传的小时流量字段名称、数据类型(浮点数/整数)与平台要求一致,避免因格式错误导致平台不显示数据
- 确认网络稳定性:在串口打印网络连接状态和上传结果,排查午夜后ESP32是否断网,导致数据无法发送到平台
4. 代码常见错误示例排查
假设你的代码有类似结构,重点检查标记的错误点:
#include <Wire.h> #include <DS3231.h> #include <WiFi.h> float hourly_flow = 0.0; int last_hour = -1; DS3231 rtc; void setup() { Serial.begin(115200); rtc.begin(); // 正确:初始化last_hour为当前小时,而非固定0 DateTime now = rtc.now(); last_hour = now.hour(); } void loop() { DateTime now = rtc.now(); int current_hour = now.hour(); // 错误示例:仅在午夜(current_hour == 0)时重置 // 正确逻辑:当current_hour != last_hour时触发重置 if (current_hour != last_hour) { hourly_flow = 0.0; last_hour = current_hour; Serial.println("Hour changed, reset hourly flow"); } // YF-B1脉冲计数处理逻辑 // ... 此处确保脉冲触发时正确累加hourly_flow ... // 错误示例:仅在午夜上传数据 // 正确逻辑:每小时定时上传或每次流量更新时上传 uploadToPlatform(hourly_flow); delay(1000); }
额外验证步骤
- 串口实时监控:在代码中添加串口输出,打印当前RTC时间、小时流量、
last_hour值、上传状态,观察午夜前后这些值的变化,定位是逻辑错误还是上传问题 - 模拟小时切换:手动修改DS3231时间(从23:59改到00:00再到01:00),观察小时流量是否重置,数据是否正常上传
- 单独测试YF-B1:断开RTC,手动触发传感器脉冲,验证小时流量是否正常累加,排除传感器硬件问题
内容的提问来源于stack exchange,提问作者Anh Cao
相关产品推荐
相关产品推荐

