You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:17:46