You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32水质监测系统:浊度数据无法上传至Firebase实时数据库求助

水质监测系统浊度数据无法上传Firebase问题排查与修复

核心问题定位

从代码和现象来看,移除Firebase代码后浊度传感器正常,说明问题出在Firebase集成与传感器读取的交互或Firebase数据写入逻辑上,以下是具体排查点和修复方案:

1. 引脚资源冲突(最可能原因)

ESP32的GPIO13属于SDIO引脚组,WiFi通信时会占用该组引脚,导致模拟读取功能失效——这就是为什么移除Firebase代码(关闭WiFi)后传感器正常的原因。

修复方案:将浊度传感器引脚更换为非SDIO的模拟输入引脚,比如GPIO34、GPIO36这类仅输入的模拟引脚:

// 替换原引脚定义,比如改为GPIO34
#define TURBIDITY_PIN 34

同时硬件上把浊度传感器的输出线接到新引脚。

2. Firebase路径包含非法字符

Firebase实时数据库路径不允许包含空格、.、#等特殊字符,你生成的日期时间字符串格式是"DD-MM-YYYY HH:MM:SS",其中的空格会导致路径无效,进而引发数据写入失败。

修复方案:修改日期格式,用下划线替换空格:

void printDateTime(const RtcDateTime& dt, char* dateString)
{
    snprintf_P(dateString, 
            20,
            PSTR("%02u-%02u-%04u_%02u:%02u:%02u"), // 空格替换为下划线
            dt.Day(),
            dt.Month(),
            dt.Year(),
            dt.Hour(),
            dt.Minute(),
            dt.Second() );
}

3. 浊度数据计算错误

ESP32的ADC是12位(最大值4096),参考电压为3.3V,你之前用5.0/1024.0的计算逻辑是针对8位5V系统的,会导致浊度数据计算异常。

修复方案:修正浊度计算公式:

turbidityValue = tVoltage * (3.3 / 4096.0);

4. 缺少Firebase操作错误日志

当前代码没有判断写入是否成功,无法定位具体失败环节,添加错误日志可以快速排查问题:

if (Firebase.ready())
{
    String firebasePath = "/SensorData/" + String(dateTimeString) + "/";

    if (!Firebase.RTDB.setFloat(&fbdo, firebasePath + "Temperature", tempC)) {
        Serial.print("温度写入失败: ");
        Serial.println(fbdo.errorReason());
    }
    if (!Firebase.RTDB.setFloat(&fbdo, firebasePath + "PH Value", phValue)) {
        Serial.print("PH值写入失败: ");
        Serial.println(fbdo.errorReason());
    }
    if (!Firebase.RTDB.setFloat(&fbdo, firebasePath + "Turbidity", turbidityValue)) {
        Serial.print("浊度写入失败: ");
        Serial.println(fbdo.errorReason());
    }
}

通过串口日志能直接看到每一步的错误原因,方便精准排查。

5. WiFi通信的ADC干扰优化

ESP32在WiFi通信时的电源波动可能影响模拟读取,可优化读取顺序:先完成所有传感器数据读取,再执行Firebase写入操作,避免WiFi干扰:

void sendDataToFirebase() {
    // 先读取所有传感器数据
    DS18B20.requestTemperatures();       
    tempC = DS18B20.getTempCByIndex(0);  

    phvoltage = analogRead(PH_PIN) / ESPADC * ESPVOLTAGE;
    phValue = ph.readPH(phvoltage, tempC); // 用实时温度代替默认25℃,提升PH检测精度

    tVoltage = analogRead(TURBIDITY_PIN);
    turbidityValue = tVoltage * (3.3 / 4096.0);

    // 读取时间
    RtcDateTime now = Rtc.GetDateTime();
    char dateTimeString[20];
    printDateTime(now, dateTimeString);

    // 打印调试数据
    Serial.print("Temperature (C): ");
    Serial.println(tempC);
    Serial.print("PH Value: ");
    Serial.println(phValue);
    Serial.print("Turbidity: ");
    Serial.println(turbidityValue);

    // 最后执行Firebase写入
    if (Firebase.ready())
    {
        String firebasePath = "/SensorData/" + String(dateTimeString) + "/";
        // 写入检查代码同上
    }
    delay(2000);
}

总结

优先按以下顺序排查修复:

  1. 更换浊度传感器引脚,避开WiFi占用的SDIO引脚(12、13等)
  2. 修正Firebase路径的非法空格字符
  3. 调整浊度数据的ADC计算逻辑
  4. 添加Firebase错误日志定位问题

内容的提问来源于stack exchange,提问作者john paul Anud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 22:23:13