【发布时间】:2019-12-04 11:28:02
【问题描述】:
我有一个能够读取温度和湿度的 ESP8266。我们的想法是将这些读数上传到 Firebase 数据库,一旦上传这些数据,就使用 Firebase 的函数触发器采取一些行动。
我有一个从 ESP8622 上传数据的 Arduino 代码。上传的数据是时间戳、传感器 ID、温度和湿度。如下:
void updateDatabase(String &temp, String &humidity, String &temp_feeling)
{
String path = "/Measurements";
String SensorID = "1";
timeClient.update();
// timeClient.setTimeOffset(3600);
long timeStamp = timeClient.getEpochTime();
json.clear().set("id",DEVICE_ID);
json.set("timestamp",(String)timeStamp);
json.set("temperature",temp_feeling);
json.set("humidity",humidity);
mostrarJSON(json);
if (Firebase.pushJSON(firebaseData, path,json))
{
Serial.println("PASSED");
Serial.println("PATH: " + firebaseData.dataPath());
Serial.println("TYPE: " + firebaseData.dataType());
Serial.println("ETag: " + firebaseData.ETag());
Serial.print("VALUE: ");
printResult(firebaseData);
Serial.println("------------------------------------");
Serial.println();
}
else
{
Serial.println("FAILED");
Serial.println("REASON: " + firebaseData.errorReason());
Serial.println("------------------------------------");
Serial.println();
}
}
此 JSON 已上传到 Firebase 数据库。上传数据的结果如下:
Firebase 函数具有此代码来处理上传的最新测量结果。
exports.onDataAdded = functions.database.ref('/Measurements').onWrite((change,context)=>{
const snapshot = change.after;
const val = snapshot.child("").val()
console.log(val)
const temperature = snapshot.child("").child("temperature").val()
const humidity = snapshot.child("").child("humidity").val()
console.log(`New data received : temp : ${temperature}, humidity : ${humidity}`)
takeActionSensorUpdate(temperature,humidity)
return null
})
Firebase 控制台上的代码结果如下:
- 我是否在 Arduino 代码上正确构建了 JSON 对象?我应该创建自己的节点名称,而不是为每个测量使用随机的唯一 ID?如果是这样,我该怎么做?
- 如果我仅在收到来自 ESP8266 的新上传时触发代码,为什么要打印多个数据库实例?
- 正如您在控制台上看到的,温度和湿度数据显示为空。我想这是因为我在 /Measurements 下添加的每个新测量都有一个自动随机 ID,因为它可以在上传到数据库的对象上看到。如何更改 Firebase 函数的代码以获取我想要的值,在这种情况下是温度和湿度?
非常感谢!
【问题讨论】:
标签: node.js firebase firebase-realtime-database arduino google-cloud-functions