【问题标题】:Reducing firebase latency by only sending changed value?通过仅发送更改的值来减少 Firebase 延迟?
【发布时间】:2020-04-06 07:47:08
【问题描述】:

我正在使用 Wemos D1 Mini (Arduino) 将传感器数据发送到 Firebase。这是我要发送的一个值。我发现这会使程序变慢,因此传感器无法像发送数据一样快地获取数据(这很明显)。

无论如何,我只想在此值更改其属性时将值发送到 Firebase。这是一个int 值,但我不确定如何解决这个问题。我应该使用监听器吗?这是我的代码的一部分:

int n = 0; // will be used to store the count
Firebase.setInt("Reps/Value", n); // sends value to fb
delay(100); // Wait 1 second and scan again

我希望传感器可以每秒扫描一次,它确实做到了。 但是 在这个 rate(双关语)下,值每秒都被推送到 FB。这会将扫描速度减慢到每 3 秒一次。当n的值发生变化时,如何只使用firebaseSetInt方法?

【问题讨论】:

  • 您是如何实现如此慢的数据速率的?为了清楚起见,您只能每三秒将一个整数传输到数据库?请告诉我我误解了...
  • 如果不清楚,请原谅..我同时做两件事。 1 正在读取传感器数据,1 正在发送数据。在不将传感器数据发送到 FB 的情况下,(100) 的延迟是 100 毫秒是准确的。当添加将数据发送到 Firebase 的行时,这显然跟不上。因此,它不会像 1 秒那样进入 3 秒。这很好,我只需要在值发生变化时发送它以减少负载。希望这可以解决问题。
  • 是的.....数据库托管在哪里,通过卫星链接或其他方式?
  • 很难理解实际问题是什么:首先你声称“程序”“慢了”,然后传感器获取数据的速度不如发送数据的速度(通过程序?那没有意义)。此外,请尽量保持书写的一致性,并更恰当地缩进代码。
  • 我只想知道如何创建一个事件监听器 :(

标签: c firebase firebase-realtime-database arduino arduino-c++


【解决方案1】:

您可以在每次读取每个新值后检查该值是否已更改,只需添加一个简单的条件语句。

int n = 0; // will be used to store the count
int n_old; // old value saved to fb
if(n!=n_old)   {  //checks whether value is changed
   Firebase.setInt("Reps/Value", n); // sends value to fb
   n_old = n;  // updates the old value to the last updated
}

delay(100); // Wait 1 second and scan again

或者如果你想采用宽容的方法,你可以进一步做这样的事情:

int n = 0; // will be used to store the count
int n_old; // old value saved to fb
int tolerance = 3;  // tolerance upto 3%
if(abs((n-n_old)/((n+n_old)/2))*100 > tolerance)   {
   Firebase.setInt("Reps/Value", n); // sends value to fb
   n_old = n;  // updates the old value to the last updated
}

delay(100); // Wait 1 second and scan again

【讨论】:

  • 效果很好,没有更多的延迟,一切都很好!
  • 我不知道 Arduinos 怪异的语言科学怪人,但至少在 C 中 n_old 未初始化将导致第 3 行比较中的未定义行为(另外,你有一个错字 @987654324 @ 与 n_Old)
  • @larkey 第一次在setup()可以初始化n_old,然后n可以在loop()函数中初始化。
【解决方案2】:

来自远程数据库的专业使用,您应该采用滑动平均方法。为此,您可以创建一个圆形缓冲区,其中包含 30 个传感器值并计算平均值。只要值在 time0 记录的平均值内为 +/- 3%,您就不会更新。如果该值高于或低于您发送到 Firebase 并设置新的 time0 平均值。根据您的精度和需求,您可以减轻系统的压力。
恕我直言,只有像电流断路器或流量切割(液体)这样的生命安全装置必须是实时的,所有爱好应用,如测量风速、加热等都经过精心设计20 - 60 秒间隔。
顺便说一下,事件监听器就是这种方法,如果它不正常就做点什么。如果您有一个固定的目标值作为参考,则更容易检查 +/- 差异。如果 FB 的定价发生变化,这对开发者来说将是一个问题 - 所以请提前计划。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2018-04-10
    相关资源
    最近更新 更多