无法从ESP8266 / NodeMCU上的VMA320热敏电阻获得准确的温度读数

时间:2018-07-29 06:53:59

标签: math arduino arduino-esp8266

前几天,我一时兴起,在一家电子商店购买了几对VMA320热敏电阻,却一无所知。我已经待了好几天了,但我只是想不通如何把这个东西发送给我的数据转换成准确的温度读数。我已经阅读了几本指南,并尝试直接在网络上使用多个草图,但是得到的结果仍然相同。在大约70-72°F的房间中,我正在读取大约40°F(带有“上拉”配置的代码,这就是我的热敏电阻的意思),或者是大约150°F(在拉式配置中)。下配置)。来自模拟引脚的原始数据保持在750左右恒定,这使我相信问题一定是我使用的公式(全部基于Steinhart-Hart方程)。

热敏电阻的设计电压为5V,内置一个10k欧姆电阻。通过将ESP8266的VIN引脚插入微型USB端获得5V电压,我可以始终如一地获得上述温度读数(尽管我已经对其进行了计量,实际上约为4.35V)。我还尝试使用12V DC适配器+可调降压转换器(精确调至5V)为热敏电阻供电,但是由于未知原因,这给我带来了非常不一致的读数。我想我可能会从降压转换器发送太多电压(因为用万用表测试它所需的多余电线会产生更多的压降?),所以我尝试在读取串行监视器时慢慢调低电压,以查看是否可以将其调整为理智的阅读方式-不用运气。而且我向热敏电阻施加了一些温和的热量,并观察到了预期的温度读数峰值,因此我认为该组件没有故障。

我准备放弃这个项目。我不太擅长数学,而且我是电子领域的新手,所以说实话我真的不明白我一直在插入代码中的公式。我在这里错过明显的东西吗?我是否需要调整公式以考虑到4.35而不是5V,如果是,如何?我用于B系数和/或标称温度的变量是否有可能是错误的,如果是,如何找到正确的值?该组件的用户手册非常稀疏,因此我唯一确定的是它使用了10k Ohm电阻器和上拉配置(无论如何)。

//---------------
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);
}

上面的代码(以及我发现的所有其他示例草图)使用Steinhart-Hart方程。如果我对它的理解正确,那么它最终要做的就是通过从电压推断出一个已知值(10k欧姆)的电阻和热敏电阻(随温度而变化)之间的电阻差。返回值,这是ADC值表示的值(映射到0到1023)。我认为。 “如果我理解正确”是一个很大的前提,哈哈。最后几行只是将计算出的电阻转换为开氏温度,摄氏温度和华氏温度。

1 个答案:

答案 0 :(得分:2)

ADC将输入电压与参考电压进行比较,并在其输出范围内输出相应的值。 简单芯片上的参考电压通常是电源电压,在许多芯片上,ADC都有自己的参考电压,需要提防。

在您的情况下,ESP8266看起来是3.3V芯片,因此您应该将VMA320上的5V连接到ESP8266上的3.3V

VMA320只是与热敏电阻和参考电阻组成一个电阻分压器,因此实际电源电压并不重要,并且在3.3V电压下也能正常工作