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

ESP32无法上传数据至Firebase实时数据库:数据库无数据显示

ESP32无法向Firebase Realtime Database上传数据的排查方案

问题描述

我正在开发ESP32项目,使用EmonLib库测量电压、电流、功率及能耗,并将数据上传至Firebase Realtime Database。ESP32已成功连接WiFi,Serial Monitor能正确打印传感器数值,但Firebase中始终无数据显示。

已完成的排查操作

  • 成功将ESP32连接至WiFi
  • 配置Firebase的API密钥与数据库URL
  • 尝试使用Firebase匿名认证
  • 将Firebase实时数据库规则设置为公开用于测试:
{
  "rules": {
    ".read": true,
    ".write": true
  }
}
  • 在Serial Monitor中添加调试打印
  • 尝试用最简代码上传简单字符串,但仍未成功
  • 确认Firebase URL无末尾斜杠

项目代码

#include <WiFi.h>
#include <Firebase_ESP_Client.h>
#include <EmonLib.h>

#define WIFI_SSID "Abdul"
#define WIFI_PASSWORD "987654321"

#define API_KEY "AIzaSyDgW-hYeBKeEEsFJvSeYiQLN5HIE31K_wg"
#define DATABASE_URL "https://fyp308-f4c78-default-rtdb.asia-southeast1.firebasedatabase.app"

FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
EnergyMonitor emon;

float kWh = 0.0;
unsigned long lastMillis = 0;

void setup() {
  Serial.begin(115200);

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(300);
  }

  config.api_key = API_KEY;
  config.database_url = DATABASE_URL;

  auth.user.email = "";
  auth.user.password = "";

  Firebase.begin(&config, &auth);
  Firebase.reconnectWiFi(true);

  emon.voltage(35, 41.5, 1.7);
  emon.current(34, 0.015);

  lastMillis = millis();
}

void loop() {
  emon.calcVI(20, 2000);
  float voltage = emon.Vrms;
  float current = emon.Irms;
  float power = emon.apparentPower;

  unsigned long now = millis();
  kWh += (power * (now - lastMillis)) / 3600000.0;
  lastMillis = now;

  Serial.printf("Voltage: %.2f, Current: %.3f, Power: %.2f, Energy: %.5f\n", voltage, current, power, kWh);

  if (Firebase.ready()) {
    if (!Firebase.RTDB.setFloat(&fbdo, "/EnergyMeter/Voltage", voltage))
      Serial.println("Voltage upload failed: " + fbdo.errorReason());
    if (!Firebase.RTDB.setFloat(&fbdo, "/EnergyMeter/Current", current))
      Serial.println("Current upload failed: " + fbdo.errorReason());
    if (!Firebase.RTDB.setFloat(&fbdo, "/EnergyMeter/Power", power))
      Serial.println("Power upload failed: " + fbdo.errorReason());
    if (!Firebase.RTDB.setFloat(&fbdo, "/EnergyMeter/Energy_kWh", kWh))
      Serial.println("Energy upload failed: " + fbdo.errorReason());
  } else {
    Serial.println("Firebase not ready");
  }

  delay(5000);
}

当前症状

  • Serial Monitor能正确显示传感器数值
  • Firebase Realtime Database中无数据显示
  • 未打印任何WiFi或Firebase连接相关错误信息
  • 已尝试移除DATABASE_URL的末尾斜杠

可能的原因及修复方案

1. 匿名认证配置错误

你的代码中手动设置了空的邮箱和密码,但Firebase匿名认证不需要这些字段,且需要显式调用匿名登录接口。同时要确保Firebase控制台已开启匿名认证功能(路径:Authentication -> Sign-in method)。

修复代码:
将setup中的auth.user.email = ""; auth.user.password = "";替换为:

if (!Firebase.Auth.signInAnonymously(&config)) {
  Serial.printf("匿名认证失败: %s\n", config.signer.signupError.message.c_str());
}

2. 设备时间未同步

Firebase的Token验证依赖正确的系统时间,ESP32默认没有同步时间,可能导致认证失败。

修复代码:
在WiFi连接成功后添加NTP时间同步:

// WiFi连接成功后添加
configTime(0, 0, "pool.ntp.org", "time.nist.gov");
while (!time(nullptr)) {
  delay(1000);
  Serial.println("等待时间同步...");
}

3. 库初始化顺序或状态监听缺失

部分版本的Firebase_ESP_Client库需要监听Token状态来确认认证是否完成,可以添加状态回调函数排查问题。

修复代码:
在setup中Firebase.begin前添加:

config.token_status_callback = tokenStatusCallback;

然后在全局范围添加回调函数:

void tokenStatusCallback(TokenInfo info) {
  Serial.printf("Token状态: %d\n", info.status);
  if (info.status == token_status_error) {
    Serial.printf("Token错误: %s\n", info.error.message.c_str());
  }
}

4. 网络环境限制

ESP32所在网络可能存在防火墙或代理,阻止了Firebase域名的访问。可以尝试切换到手机热点连接ESP32,排除网络环境问题。


进一步调试步骤

  1. 添加认证状态打印
    在setup中Firebase.begin后添加:
if (Firebase.Auth.isSignedIn(&config)) {
  Serial.println("Firebase认证成功");
} else {
  Serial.println("Firebase认证失败");
  Serial.printf("错误信息: %s\n", config.signer.signupError.message.c_str());
}
  1. 简化代码测试
    暂时注释EmonLib相关代码,只保留WiFi和Firebase部分,尝试上传固定值:
void loop() {
  if (Firebase.ready()) {
    float testVal = 220.0;
    if (!Firebase.RTDB.setFloat(&fbdo, "/test/voltage", testVal)) {
      Serial.println("上传失败: " + fbdo.errorReason());
      Serial.printf("HTTP状态码: %d\n", fbdo.httpCode());
      Serial.printf("错误类型: %d\n", fbdo.errorCode());
    } else {
      Serial.println("上传成功");
    }
  } else {
    Serial.println("Firebase未就绪");
  }
  delay(5000);
}
  1. 检查Firebase控制台日志
    进入Firebase控制台的Authentication -> Users页面,查看是否有匿名用户被创建,确认认证流程是否正常。

  2. 验证数据库路径
    Firebase路径区分大小写,确认代码中的/EnergyMeter/Voltage与控制台中的节点名称完全一致(避免大小写或拼写错误)。

内容的提问来源于stack exchange,提问作者Abdul Rehman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:59:52