【发布时间】:2018-01-10 18:27:24
【问题描述】:
我目前正在从事一个小型 Arduino 项目,该项目使用红外温度传感器来测量某些表面温度。
硬件工作完美,使用analogRead() 读取模拟信号也可以正常工作,但使用这个简单的函数过滤测量的模拟值以获得更好的结果与 Arduino 不兼容。
每次运行此功能的草图上传到 Arduino (Pro Micro) 时,程序都会卡住并禁用 Arduino,因此必须重新设置它才能再次作为 COM 端口出现在“端口”菜单中.
这是我找不到错误的简单函数:
int TemperatureDifferenceSensor::measureRawFilteredTemperatureValue(int numberOfMeasurements) {
int temperatureMeasurementValueSum = 0;
int maxMeasuredTempValue = 0;
int minMeasuredTempValue = 0;
for (int i = 0; i < numberOfMeasurements; ++i) {
int measuredTemperatureValue = analogRead(analogObjectTempPin);
temperatureMeasurementValueSum += measuredTemperatureValue;
if (measuredTemperatureValue > maxMeasuredTempValue) {
maxMeasuredTempValue = measuredTemperatureValue;
} else if (measuredTemperatureValue < minMeasuredTempValue) {
minMeasuredTempValue = measuredTemperatureValue;
}
// A small delay, to not measure the same or similar value every time...
delay(10);
}
temperatureMeasurementValueSum -= maxMeasuredTempValue;
temperatureMeasurementValueSum -= minMeasuredTempValue;
int temperatureMeasurementAverageValue = (int) (temperatureMeasurementValueSum / (numberOfMeasurements - 2));
return temperatureMeasurementAverageValue;
}
【问题讨论】:
-
为什么是 numberOfMeasurements - 2?如果 numberOfMeasurements 为 2,那么您将使用零潜水。每个人都知道结果是奇点。
-
但如果不是这种情况,只需逐行写入串行,您就会看到执行何时终止。
-
为什么要在
int temperatureMeasurementAverageValue = (int) (temperatureMeasurementValueSum / (numberOfMeasurements - 2));中加入(int)? -
陷入循环?
for(int i = 0; i < numberOfMeasurements; ++i) { .... delay(10); ... }中numberOfMeasurements的最大值是多少? -
函数是怎么调用的?函数如何神奇地知道
analogObjectTempPin?我假设你在某处有一个对象......但我不确定。