【发布时间】:2017-01-03 23:34:30
【问题描述】:
我有一个 Sparkfun 的 Arduino 温度计,可以测量温度。它非常精确,但我需要更多的平均值。
我使用的代码直接来自 Sparkfun (https://learn.sparkfun.com/tutorials/sik-experiment-guide-for-arduino---v32/experiment-7-reading-a-temperature-sensor)
const int temperaturePin = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
float voltage, degreesC, degreesF;
voltage = getVoltage(temperaturePin);
degreesC = (voltage - 0.5) * 100.0;
degreesF = degreesC * (9.0/5.0) + 32.0;
Serial.print("voltage: ");
Serial.print(voltage);
Serial.print(" deg C: ");
Serial.print(degreesC);
Serial.print(" deg F: ");
Serial.println(degreesF);
delay(1000);
}
float getVoltage(int pin)
{
return (analogRead(pin) * 0.004882814);
}
我希望每分钟平均每 10 秒获得一次读数,并剔除异常值,而不仅仅是每分钟的实际情况。 例如,如果在一分钟内读取 65、64、66、67、65、44 ......它将平均前 5 个并丢弃 44 个,平均为 65.4。
【问题讨论】:
-
您可以通过首先执行five number summary来计算哪些值是异常值
-
一种方法是丢弃最低和最高读数并对其余读数进行平均。还有其他方法...谷歌?一种更复杂的方法是,在知道可能的温度变化率后,任何超出该变化率的变化都必须持续达到规定的读数次数。
-
问题是什么?
-
平均不反对精确。而且 Arduino 不是 C 或标准 C++。
-
你必须定义什么是异常值。有 6 个样本,很难说“这显然是一个异常值”。如果有两个超过 6 的异常值怎么办?和3?我的建议是保留所有这些。如果有噪音,则在一秒钟内进行 10 次测量,并在一分钟内将它们平均 6 次(每 10 秒开始一个 10 次测量的循环)。或者,如果您发现您的结果类型很常见,请排除最高和最低的结果。我建议你在转换之前用整数做这个数学运算,并在一行中完成所有转换,这样编译器就可以只做一条指令而不是三条指令。