D1 mini ESP8266 NTC温度监测异常求助:计算值偏差过大
问题分析与解决方案
核心错误点
1. 电阻分压计算公式完全颠倒
你的电路为3.3V → 热敏电阻 → A0 → 10kΩ串联电阻 → GND,根据分压原理,ADC采样值对应串联电阻两端的电压,正确的热敏电阻阻值计算公式应为:
float resistance = seriesResistor * (1023.0 / rawADC - 1.0);
而你当前代码中使用的seriesResistor / ((1023.0 / rawADC) - 1.0)完全颠倒了分压关系,导致计算出的阻值严重偏离实际值,直接引发温度计算异常。
2. B值公式(简化Steinhart-Hart)应用逻辑错误
你代码中的温度计算完全不符合B值公式的推导规则:
- 忽略了基准温度项
1/T0(25℃对应298.15K),仅将ln(Rt/R0)除以B值后取倒数,无法得到正确的开尔文温度 - 最后一步
1 - (kelvin - 273.15)是逻辑错误,摄氏度应为开尔文温度减去273.15,而非1减去该差值。
3. 规格书参数误解(印刷错误)
TTC-103的型号后缀“103”是阻值代码,代表10×10³=10kΩ,你实际测得的25℃下10kΩ阻值是正确的,规格书中标注的“10Ω”属于印刷错误,因此25℃基准阻值R0应使用10000而非10。
修正后的代码
#include <Arduino.h> const int thermistorPin = A0; const float seriesResistor = 10000.0; const float R0 = 10000.0; // 25℃时热敏电阻实际阻值 const float T0 = 298.15; // 25℃对应的开尔文温度 const float B = 4050.0; // 热敏电阻B值 void setup() { Serial.begin(9600); } float readTemperature() { int rawADC = analogRead(thermistorPin); // 处理ADC值为0的极端情况,避免除以0报错 if (rawADC == 0) { return -999.0; // 返回异常标记值 } // 正确计算热敏电阻阻值 float resistance = seriesResistor * (1023.0 / rawADC - 1.0); // 使用B值公式计算开尔文温度 float invT = 1.0 / T0 + (log(resistance / R0)) / B; float kelvin = 1.0 / invT; // 转换为摄氏度 float temperature = kelvin - 273.15; return temperature; } void loop() { float temperature = readTemperature(); Serial.print("Temperature: "); Serial.print(temperature, 1); // 保留1位小数,提升可读性 Serial.println(" °C"); delay(500); }
额外验证建议
- 可在代码中添加打印热敏电阻阻值的逻辑,确认25℃环境下计算值是否接近10kΩ,先验证阻值计算的正确性
- ESP8266的ADC精度有限,若需要更高稳定性,可增加多次采样取平均值的逻辑
内容的提问来源于stack exchange,提问作者Louis Eiden
相关产品推荐
相关产品推荐

