ESP32无法上传数据至Firebase实时数据库:数据库无数据显示
问题描述
我正在开发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,排除网络环境问题。
进一步调试步骤
- 添加认证状态打印
在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()); }
- 简化代码测试
暂时注释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); }
检查Firebase控制台日志
进入Firebase控制台的Authentication -> Users页面,查看是否有匿名用户被创建,确认认证流程是否正常。验证数据库路径
Firebase路径区分大小写,确认代码中的/EnergyMeter/Voltage与控制台中的节点名称完全一致(避免大小写或拼写错误)。
内容的提问来源于stack exchange,提问作者Abdul Rehman

