Math Can';t从ESP8266/NodeMCU上的VMA320热敏电阻获取准确的温度读数
前几天我一时兴起在电子商店买了两个VMA320热敏电阻,根本不知道自己在干什么。我已经做了好几天了,我只是不知道如何把这个东西发送给我的数据转换成准确的温度读数。我读过几本指南,并尝试直接在网上使用几幅草图,但我一直得到同样的结果。在温度约为70-72°F的房间里,我读取的温度约为40°F(带有“上拉”配置的代码,这就是我的热敏电阻),或约为150°F(在下拉配置中)。模拟管脚的原始数据保持在750左右不变,这让我相信问题一定是我使用的公式(都基于Steinhart-Hart方程) 热敏电阻设计为5V,内置10k欧姆电阻。我通过插入micro USB从ESP8266的VIN引脚获得5V的电压(尽管我已经测量过,实际上大约是4.35V),从而获得上述温度读数。我也尝试过用12V直流适配器+一个调到5V的可调降压转换器为热敏电阻供电,但由于未知原因,这会导致读数不一致。我想我可能是从降压转换器发送了太多的电压(因为用万用表测试它需要额外的电线产生更多的电压降?),所以我尝试在读取串行监视器时缓慢地调低电压,看看是否可以将其调整为正常读数-不走运。我已经对热敏电阻施加了一些温和的热量,并观察到了预期的温度读数峰值,所以我不认为部件有故障 我准备放弃这个项目。我对数学不在行,而且我对电子学是全新的,所以说实话,我真的不理解我一直插入代码中的公式。我是不是漏掉了什么明显的东西?我是否需要调整公式以考虑4.35而不是5V,如果需要,如何调整?我用于B系数和/或标称温度的变量是否可能是错误的,如果是,我如何找到正确的值?这个组件的用户手册非常少,所以我唯一能确定的是它使用了10k欧姆的电阻器和上拉配置(不管这意味着什么)Math Can';t从ESP8266/NodeMCU上的VMA320热敏电阻获取准确的温度读数,math,arduino,arduino-esp8266,Math,Arduino,Arduino Esp8266,前几天我一时兴起在电子商店买了两个VMA320热敏电阻,根本不知道自己在干什么。我已经做了好几天了,我只是不知道如何把这个东西发送给我的数据转换成准确的温度读数。我读过几本指南,并尝试直接在网上使用几幅草图,但我一直得到同样的结果。在温度约为70-72°F的房间里,我读取的温度约为40°F(带有“上拉”配置的代码,这就是我的热敏电阻),或约为150°F(在下拉配置中)。模拟管脚的原始数据保持在750左右不变,这让我相信问题一定是我使用的公式(都基于Steinhart-Hart方程) 热敏电阻设计
上面的代码(以及我找到的所有其他示例草图)使用斯坦哈特-哈特方程。如果我理解正确的话,它最终要做的就是通过从返回的电压(ADC值表示的值)(从0到1023映射)推断出具有已知值(10k欧姆)的电阻器和热敏电阻器(随温度波动)之间的电阻差。我想。“如果我理解正确”是一个很大的如果,lol。最后几行只是将计算出的电阻转换为温度,单位为开尔文,然后是摄氏度,然后是华氏度。ADC将输入电压与参考电压进行比较,并在其输出范围内输出相应的值。 简单芯片上的参考电压通常是电源电压,在许多芯片上adc都有自己的参考电压,这是需要注意的 在您的情况下,ESP8266看起来是一个3.3V芯片,因此您应该将VMA320上的5V连接到ESP8266上的3.3V
VMA320仅与热敏电阻和参考电阻构成一个电阻分压器,因此实际电源电压并不重要,它在3.3V上也能正常工作。ADC将输入电压与参考电压进行比较,并在其输出范围内输出相应的值。 简单芯片上的参考电压通常是电源电压,在许多芯片上adc都有自己的参考电压,这是需要注意的 在您的情况下,ESP8266看起来是一个3.3V芯片,因此您应该将VMA320上的5V连接到ESP8266上的3.3V
VMA320仅与热敏电阻和参考电阻形成一个电阻分压器,因此实际电源电压并不重要,它在3.3V上也能正常工作。在一些情况下,这看起来很可疑。第一个问题:阻力很可能是0到1之间的浮动。但你并没有把它变成这样。ADC似乎提供0..1023,因此此范围必须映射到0..1。问问自己1023/ADCvalue-1在做什么。这句话对我来说也毫无意义,但要真正判断它,我需要先阅读数据表。好吧,忘了我的评论。我发现的代码也是这样,虽然我也很难理解这一点,但它可能只是一个简洁的公式来解释电阻的反向行为——如果温度升高,电阻就会下降。关于这一点,原始ADC值的行为是否正确?上述代码使用Steinhart-Hart方程;我更新了帖子以反映这一点。如果我理解正确的话,它最终要做的是计算一个已知值(10k欧姆)的电阻器和热敏电阻之间的电阻差,通过电压推断,这就是ADC值所表示的(从0映射到1023)。我想。“如果我理解正确”是一个很大的如果,哈哈。最后几行只是覆盖了计算出的温度电阻,单位是开尔文,然后是摄氏度,然后是华氏度。是的,当热敏电阻暴露在温度突然变化的环境中时,ADC值的表现似乎和预期的一样。我所能想到的就是仔细控制数值和计算结果的匹配。我通常是Python和C++的人,所以这些语言的错误是使用1023/ADC。因为这是整数除法,所以它总是1。不是浮球。在一些情况下这看起来可疑。第一个问题:阻力很可能是0到1之间的浮动。但你并没有把它变成这样。ADC似乎提供了0..1023,所以这个
//---------------
byte NTCPin = A0;
#define SERIESRESISTOR 10000
#define NOMINAL_RESISTANCE 10000
#define NOMINAL_TEMPERATURE 25
#define BCOEFFICIENT 3950
void setup()
{
Serial.begin(115200);
}
void loop()
{
float ADCvalue;
float Resistance;
ADCvalue = analogRead(NTCPin);
Serial.print("Analog value ");
Serial.print(ADCvalue);
Serial.print(" = ");
//convert value to resistance
Resistance = (1023 / ADCvalue) - 1;
Resistance = SERIESRESISTOR / Resistance;
Serial.print(Resistance);
Serial.println(" Ohm");
float steinhart;
steinhart = Resistance / NOMINAL_RESISTANCE; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
steinhart += 1.0 / (NOMINAL_TEMPERATURE + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15; // convert to C
steinhart = steinhart * 1.8 + 32; // convert to F
Serial.print("Temperature ");
Serial.print(steinhart);
Serial.println("°F");
delay(1000);
}