math - 无法从 ESP8266/NodeMCU 上的 VMA320 热敏电阻获得准确的温度读数
问题描述
前几天我一时兴起在电子商店买了几个 VMA320 热敏电阻,却不知道自己在做什么。我已经在这几天了,我只是不知道如何将这个东西发送给我的数据变成准确的温度读数。我已经阅读了几本指南并尝试直接从网上使用几张草图,但我一直得到相同的结果。在大约 70-72°F 的房间里,我正在读取大约 40°F(带有“上拉”配置的代码,这是我的热敏电阻),或大约 150°F(在上拉-下配置)。来自模拟引脚的原始数据保持恒定在 750 左右,这让我相信问题一定是我正在使用的公式(全部基于 Steinhart-Hart 方程)。
热敏电阻设计为接收 5V 电压,并具有内置的 10k 欧姆电阻器。通过插入微型 USB 并从我的 ESP8266 的 VIN 引脚获得 5V 电压,我可以非常一致地获得上述温度读数(尽管我已经对其进行了计量,它实际上约为 4.35V)。我还尝试使用 12V 直流适配器 + 一个可调节至 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 Ohm)的电阻器和热敏电阻(根据温度波动)之间的电阻差,方法是从电压中推断出来返回,这就是 ADC 值所代表的内容(从 0 映射到 1023)。我认为。“如果我理解正确”是一个很大的如果,哈哈。最后几行只是将计算出的电阻转换为开尔文温度,然后是摄氏度,然后是华氏度。
解决方案
ADC 将输入电压与参考电压进行比较,并在其输出范围内输出相应的值。简单芯片上的参考电压通常是电源电压,在许多芯片上,ADC 都有自己的参考电压,需要注意。
在您的情况下,ESP8266 看起来是 3.3V 芯片,因此您应该将 VMA320 上的 5V 连接到 ESP8266 上的 3.3V
VMA320 只是与热敏电阻和参考电阻形成一个电阻分压器,因此实际电源电压并不重要,它在 3.3V 上也能正常工作
推荐阅读
- java - Java 客户端 OCSP 抛出“无法确定吊销状态”
- python - 从 sqlite 数据库中以整数形式检索某些内容
- javascript - 为什么我的倍数函数返回 NaN?
- python - 乘客应用程序错误:内部错误
- javascript - 如何访问护照中的整个用户对象
- javascript - 如何将 JSON 文件转换为 JS 数组
- google-cloud-firestore - SwiftUI 和 Picker 和 FireStore 返回文档 ID 不落
- flask - url_for 的烧瓶蓝图问题
- wordpress - 触发高级自定义字段 (ACF) 'acf/save_post' 操作
- python - PayPal 是否仍支持通过 HTTP REST API 的活动报告和余额?