我正在使用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
做个中庸之人。
发布于 2020-01-20 19:38:39
你的方法有很多问题。
首先,默认情况下,函数节点(运行代码的地方)不会保留任何状态。这意味着对于每条传入的消息,offset0
将被重置为0。
其次,代码由传入的消息触发,这意味着while()
循环将始终使用相同的值(触发节点的消息的msg.payload
中的任何值)运行。
您需要使用所谓的context来存储到达功能节点的消息之间的值。
像这样的东西应该是一个起点:
//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-20 17:58:28
您可以取索引的剩余部分,将sum
重置为0,并获得最后5个数的平均值为4。
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);
}
}
https://stackoverflow.com/questions/59820595
复制相似问题