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

Can't get an accurate temperature reading from a VMA320 thermistor on an ESP8266/NodeMCU

前几天我一时兴起在电子商店买了几个 VMA320 热敏电阻,但完全不知道自己在做什么。我已经这样做了好几天了,我就是想不通如何将这东西发送给我的数据转换为准确的温度读数。我已经阅读了几份指南并尝试直接使用网上的几张草图,但我一直得到相同的结果。在一个大约 70-72°F 的房间里,我正在读取大约 40°F(带有 "pull-up" 配置的代码,这就是我的热敏电阻),或者大约 150°F(在拉动中)下配置)。来自模拟引脚的原始数据保持恒定在 750 左右,这让我相信问题一定是我使用的公式(全部基于 Steinhart-Hart 方程)。

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

我正准备放弃这个项目。我不擅长数学,而且我是电子学的新手,所以说实话,我真的不明白我一直在插入代码的公式。我在这里遗漏了一些明显的东西吗?我是否需要调整公式以考虑 4.35 而不是 5V,如果是这样,怎么做?我用于 B 系数 and/or 标称温度的变量是否有可能是错误的,如果是这样,我如何找到正确的值?该组件的用户手册非常少,所以我唯一确定的是它使用了一个 10k 欧姆的电阻器和一个上拉配置(不管是什么意思)。

//---------------
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)。我认为。 "If I'm understanding correctly" 是一个很大的如果,哈哈。最后几行只是将计算出的电阻转换为以开尔文为单位的温度,然后是摄氏度,然后是华氏度。

ADC 将输入电压与参考电压进行比较,并在其输出范围内输出相应的值。 简单芯片上的参考电压一般是电源电压,很多芯片上的adc都有自己的参考电压,需要注意。

在你的例子中,ESP8266 看起来是一个 3.3V 芯片,所以你应该将 VMA320 上的 5V 连接到 ESP8266 上的 3.3V

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