0

我们使用的是LM35温度传感器和 Arduino 板引脚 A0 到 A7,实际上是其中的任何一个引脚。问题是我无法在 Arduino 软件的串行窗口中获得稳定准确的值。下面是我正在使用的代码:

int pin = 0; // analog pin
int tempc = 0, tempf = 0; // Temperature variables
int samples[8]; // Variables to make a better precision
int maxi = -100, mini = 100; // To start max/min temperature
int i;

void setup()
{
    Serial.begin(9600); // Start serial communication
}

void loop()
{
    for(i = 0; i <= 7; i++) { // Gets 8 samples of temperature
        samples[i] = ( 5.0 * analogRead(pin) * 100.0) / 1024.0;
        tempc = tempc + samples[i];
        delay(1000);
    }

    tempc = tempc/8.0; // Better precision
    tempf = (tempc * 9)/ 5 + 32; // Converts to fahrenheit

    if (tempc > maxi) {
        maxi = tempc;
    } // Set max temperature

    if (tempc < mini) {
        mini = tempc;
    } // Set min temperature

    Serial.print(tempc,DEC);
    Serial.print(" Celsius, ");

    Serial.print(tempf,DEC);
    Serial.print(" fahrenheit -> ");

    Serial.print(maxi,DEC);
    Serial.print(" Max, ");
    Serial.print(mini,DEC);
    Serial.println(" Min");

    tempc = 0;

    delay(1000); // Delay before loop
}
4

2 回答 2

1

很高兴知道问题是什么,但这里有一些需要考虑的事情:

  • 您正在平均几个样本。这是一个很好的步骤。
  • 您可以通过事后而不是在循环本身中进行电压到温度的转换来使平均值更好一些。在循环中,只需将analogRead读数添加到某个值,然后在打印前将其转换为温度。这样可以避免一些潜在的浮点舍入错误。
  • 如果您这样做,至少将样本存储为floats
  • 确保电压稳定,尤其是在使用电池运行时。在 Arduino 的电源和接地引脚之间有一个不错的大旁路电容器。
  • 你没有展示LM35是如何连接的。这可能是问题的一部分。另外,如果我没记错的话,它驱动容性负载的能力非常有限。如果你的 LM35 的引线很长,那么接线本身就会有一些电容。查看 LM35数据表,了解如何使 LM35 和微控制器之间的连接更加可靠。
  • 如果您想了解更多技术信息,请查看这篇关于如何提高 AVR ADC 精度的应用说明。虽然取决于您使用的 Arduino,但这可能不适用。

但是,更大的问题可能是电路的固有精度。在 25 度时,LM35 输出 0.25 V,显示为 ADC 上的读数 51,温度每变化 +1 度,ADC 的读数就为 +2,因此 ADC 精确到 1/2 度. LM35 在室温下精确到 1/2 度,所以现在您的精确度是 +1/-1 摄氏度,这可能是您抖动的原因。如果您只是测量 100 摄氏度以下的温度,您可以为您的 ADC 使用 3.3 V 参考电压(同样取决于您使用的 Arduino),这将为您提供更好的精度。

但是,您总会有一些抖动。

于 2013-03-21T17:57:25.820 回答
0
  void setup() {
   // initialize serial communication at 9600 bits per second:
    Serial.begin(9600);
  }

  int samples =0;
  float temprature = 0.0;
  // the loop routine runs over and over again forever:
  void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // Convert the analog reading (which goes from 0 - 1023) to a temprature
  temprature += sensorValue * (500.0 / 1023.0);
  // print out the value you read:
  samples++;
  if(samples >= 10){
      temprature = temprature/10;
      Serial.println(temprature);
      temprature = 0.0;
      samples = 0;
  }
  delay(50);
}
于 2018-07-29T14:50:37.647 回答