1

我正在使用 node-red 来获取我的称重传感器的信号。我使用 MQTT(来自我的 python 脚本)接收称重传感器的值,然后我想保存来自 MQTT 的前 5 个值来计算我的称重传感器的偏移量。然后,当我有我的偏移量时,我可以从我的偏移量中减去它,msg.payload将称重传感器设置为 0。

我试图做一个while循环来累积前5个值,但即使前5个值消失了,结果也会更新。即使循环结束,它看起来也应用了我的循环内的计算。

var offset0 = 0;
var i = 0;


while (i < 5) {
    offset0 = parseFloat(msg.payload) + offset0;
    i = i + 1;
}
offset0 = offset0 / 5;


msg.payload = offset0;
return msg;

msg在每个来自我的称重传感器的新值之后更新......或者我只想保留前 5 个值(5 用于进行测试,然后我想使用超过 5 个点)。

例如,这是我从称重传感器获得的数据:

1.93, 1.94, 1.95, 1.94, 1.96, 1.93, 1.88, 1.93. 

它应该采用前 5 个:

1.93, 1.94, 1.95, 1.94, 1.96 

并做出平均。

4

2 回答 2

1

您可以取索引的剩余部分并将其重置sum为零,然后在四位上获得最后五个的平均值。

var values = [1.93, 1.94, 1.95, 1.94, 1.96, 1.93, 1.88, 1.93],
    sum = 0,
    count = 0,
    i;

for (i = 0; i < values.length; i++) {
    if (i % 5 === 0) sum = 0;         // reset
    sum += values[i];
    if (i % 5 === 4) {                // take mean
        console.log(sum / 5);
    }
}

于 2020-01-20T09:58:27.667 回答
1

您的方法存在许多问题。

首先,默认情况下,函数节点(运行代码的地方)不保持任何状态。这意味着offset0对于每条传入消息,它将重置为 0。

其次,代码由传入消息触发,这意味着循环将始终以相同的值运行(触发节点的消息while()曾经是什么)msg.payload

您需要利用所谓的上下文来存储到达函数节点的消息之间的值。

像这样的东西应该是一个起点:

//get current offset array from context or empty array
var offset = context.get('offset') || [];

//if less than 5 readings store value and do not send on message
if (offset.length < 5) {
  offset.push(msg.payload);
  context.set('offset',offset);
  return;
} else {
  //otherwise calculate mean and remove from value and forward.
  var o;
  for (var i=0; i<5; i++) {
    o += offset[i];
  }
  msg.payload = msg.payload - (o/5);
  return msg;
}
于 2020-01-20T11:38:39.487 回答