【问题标题】:Arduino getting stuck in simple C++ functionArduino陷入简单的C++函数
【发布时间】: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 &lt; numberOfMeasurements; ++i) { .... delay(10); ... }numberOfMeasurements的最大值是多少?
  • 函数是怎么调用的?函数如何神奇地知道analogObjectTempPin?我假设你在某处有一个对象......但我不确定。

标签: c++ arduino


【解决方案1】:

如果 analogReaddelay 工作正常,应该没问题。该函数的一个大问题是不能使用参数 2 调用它。这将导致零除异常,并且可能还会导致黑洞。为什么不这样:

... 
} // the for-loop closes here. 

if (numberOfMeasurements == 0)
  return 0;
// Must have at least 3 measurements in order to remove 2 of them.
else if (numberOfMeasurements > 2) 
{
  temperatureMeasurementValueSum -= maxMeasuredTempValue;
  temperatureMeasurementValueSum -= minMeasuredTempValue;
  numberOfMeasurements -= 2; // Compensate removing two measurements.
}

// Average is sum divided by measurements.
int temperatureMeasurementAverageValue = temperatureMeasurementValueSum / numberOfMeasurements;

return temperatureMeasurementAverageValue;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    相关资源
    最近更新 更多