3

我们正在模拟一个烤箱。电位器设置所需的温度,传感器读取作为“烤箱”的小铜板的当前温度。

两个温度传感器都连接到我的 arduino uno 上它们自己的模拟输入引脚。单独地,我得到了有意义的电位计和温度传感器的值(我正在监视串行窗口上的值)。但是,当我调整电位器时,它会显着改变传感器读数。

例如:

  • 电位器处于 0 位置,传感器处于室温空气中。串口显示 TempSensor = 22 C, TSet = 0 C。这是正常的。
  • 然后当我把锅打开时:TempSensor= 40 C, TSet=55 C. -但是温度传感器仍然在室温空气中!因此,电位器值 TSet 会按应有的方式上升,但也会影响传感器读数,即使温度并没有真正改变。

任何建议将不胜感激。谢谢!

 void setup() {    
     Serial.begin(9600); 
 }

 void loop() {  
     int sensorValue = analogRead(A3);
     float tsens =  map(sensorValue, 0, 1023, 0, 500); 

     int sensorValue2 = analogRead(A1);
     float tset =  map(sensorValue2, 0, 1023, 0, 70);

     Serial.println(tsens); 
     Serial.println(tset);
 }
4

4 回答 4

3

我最近遇到了一个类似的问题,我的搜索表明在读取之间插入延迟会有所帮助。在这个问题上,我发现这个答案这个答案特别有用。

这个想法是,您需要在读取后等待一段时间,然后在 ADC 稳定后再次读取。这是我一直在使用的一个功能:

int safeAnalogRead(int pin)
{
  int x = analogRead(pin);  // make an initial reading to set up the ADC
  delay(10);                // let the ADC stabilize
  x = analogRead(pin);      // toss the first reading and take one we will keep
  delay(10);                // delay again to be friendly to future readings
  return x;
}

我仍然无法准确读取连接到配置为 vcc 和接地之间的分压器的模拟引脚的几个电位器,但至少现在这些值是稳定的。

顺便说一句,可以说,由于您在第一次阅读后有延迟,因此没有必要进行第二次延迟。如果您safeAnalogRead()在两个不同的引脚上快速连续调用两次,这可能很重要。

于 2015-08-26T06:21:51.977 回答
0

您的温度传感器很可能有未接地或接线错误的接地。Arduinos 中模拟引脚上的引脚配置彼此非常靠近,因此当附近引脚施加电压时,浮动电压会向上或向下移动。如果传感器的接地连接(或电源,尽管一开始是正确的,它可能是接地)断开或固定到高阻抗线路,则模拟电压将在整个地方移动,因为其他通常很小的电压源将主导信号寻路。如果您也将手指放在A3销钉附近,它可能会大幅波动。

于 2013-12-17T00:46:52.513 回答
0

我之前在快速连续读取多个模拟传感器时遇到过这个问题。一个可能的原因(也是我经历过的一个)是 arduino 只有 1 个 ADC 并且它为电容器充电以获取该读数。该电容器可以在读数之间保持充电,从而使它们倾斜。

正如另一位用户指出的那样,引入延迟可能会对此有所帮助,但是我能想出的最简洁的解决方案是“重置”并通过对直接连接到的第三个引脚进行模拟读取来为 ADC 电容器放电地面。

 int sensorValue;
 int sensorValue2;
 float tsens;
 float tset;
 int resetADC;
 
 void setup() 
 {    
     Serial.begin(9600);
     pinMode(A0,input);
     pinMode(A1,input);
     pinMode(A3,input); 
 }

 void loop() 
 {  
     resetADC = analogRead(A0);
     sensorValue = analogRead(A3);
     tsens =  map(sensorValue, 0, 1023, 0, 500); 
     
     resetADC = analogRead(A0);
     sensorValue2 = analogRead(A1);
     tset =  map(sensorValue2, 0, 1023, 0, 70);

     Serial.println(tsens); 
     Serial.println(tset);
  }
于 2020-07-14T08:59:44.753 回答
0

是噪音还是价值不高?我做了一个小测试程序,查看一个引脚并将其与之前的最大值和最小值进行检查。每当出现新的边界值时,我都会将其打印到串行监视器上。如果错误值稳定,请检查电路。如果它在有效值附近有噪声,则数字低通滤波器效果很好。读取 34 个读数。找到最高和最低值并丢弃它们。然后取其余 32 个读数的平均值。我看到我的设置提高了 90%(40 个计数错误降至 3 个)。丢弃 2 个高和 2 个低的 36 个读数可能会进一步改善情况。如果你有时间,你可以做一个双通滤波器。重复同样的过程 34 次,然后扔掉高低并再次平均。所有这些都是 34 x 34 的读数,所以噪音应该消失,但是您需要很长时间才能获取样本,并且需要一段时间才能检测到更换锅具。为了节省时间,我在每次通过主循环时读取罐子并将每个值保存在循环缓冲区中。当我需要阅读锅时,我会查看历史上的 33 个读数以及第 34 个新读数。

于 2016-05-03T21:32:53.753 回答