NTC热敏电阻测温模块

元器件
传感器
库存 180

介绍

基于NTC热敏电阻(典型10KΩ B值3950)和分压电路的模拟温度传感器模块,三线制(AO/DO双输出,VCC/GND),模拟输出经LM393比较器同时提供数字开关量输出(阈值可调电位器),温度范围-25°C~125°C,响应快成本低,适用于水温/气温/设备温度监测

规格参数

参数
B值3950
DO输出TTL电平(LM393比较器,电位器阈值可调)
分压电阻10KΩ (与NTC串联)
响应时间<3秒 (水中), <15秒 (空气中)
工作电压3.3V ~ 5V
标称阻值10KΩ @25°C
模块尺寸约 32x14mm
测温范围-25°C ~ +125°C
输出接口AO模拟电压 + DO数字开关量
传感器类型NTC热敏电阻

代码例程

NTC热敏电阻测温模块 — 代码例程.md
# NTC热敏电阻测温模块 — 代码例程

---

## 示例 1:Arduino — 基础温度读取 (AO)

```cpp
/*
 * NTC 热敏电阻模块 — Arduino 基础测温
 * 接线: AO→A0, VCC→5V, GND→GND
 * NTC: 10KΩ @25°C, B=3950, 分压电阻 10KΩ
 */

#define NTC_PIN    A0
#define R_FIXED    10000.0   // 分压电阻 10K
#define R0        10000.0   // NTC 在 25°C 的阻值
#define T0        298.15    // 25°C = 298.15K
#define B_VALUE   3950.0    // NTC B值
#define VCC       5.0       // 供电电压

float readTemperature() {
  int adc = analogRead(NTC_PIN);
  float voltage = adc * VCC / 1023.0;

  // 防止除零
  if (voltage >= VCC * 0.999) voltage = VCC * 0.999;
  if (voltage <= 0.001) voltage = 0.001;

  // 计算 NTC 电阻
  float R_ntc = R_FIXED * voltage / (VCC - voltage);

  // Steinhart-Hart B参数方程
  float T_kelvin = 1.0 / (1.0/T0 + log(R_ntc/R0) / B_VALUE);
  return T_kelvin - 273.15;  // 转摄氏度
}

void setup() {
  Serial.begin(115200);
  Serial.println("NTC 温度计启动");
}

void loop() {
  float temp = readTemperature();
  Serial.print("温度: ");
  Serial.print(temp, 1);
  Serial.println(" °C");
  delay(500);
}
```

---

## 示例 2:Arduino — AO + DO 双模式(温度报警)

```cpp
/*
 * NTC 模块 — 模拟测温 + 数字开关量报警
 * AO→A0, DO→D2 (中断引脚), VCC→5V, GND→GND
 */
#define NTC_PIN   A0
#define DO_PIN    2

#define R_FIXED   10000.0
#define R0        10000.0
#define T0        298.15
#define B_VALUE   3950.0
#define VCC       5.0

volatile bool alarmTriggered = false;

void alarmISR() {
  alarmTriggered = true;  // DO 拉低时触发(FALLING)
}

float getTemperature() {
  int adc = analogRead(NTC_PIN);
  float V = adc * VCC / 1023.0;
  if (V >= VCC * 0.999) V = VCC * 0.999;
  if (V <= 0.001) V = 0.001;
  float R_ntc = R_FIXED * V / (VCC - V);
  float T_k = 1.0 / (1.0/T0 + log(R_ntc/R0) / B_VALUE);
  return T_k - 273.15;
}

void setup() {
  Serial.begin(115200);
  pinMode(DO_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(DO_PIN), alarmISR, FALLING);
  Serial.println("NTC 温度报警器就绪");
  Serial.println("调节模块电位器设定报警阈值");
}

void loop() {
  float temp = getTemperature();
  bool doState = !digitalRead(DO_PIN);  // 低电平=报警

  Serial.print("温度: ");
  Serial.print(temp, 1);
  Serial.print(" °C  |  DO状态: ");
  Serial.println(doState ? "⚠ 超阈值!" : "✓ 正常");

  if (alarmTriggered) {
    alarmTriggered = false;
    Serial.println(">>> 温度报警触发!<<<");
  }

  delay(500);
}
```

---

## 示例 3:Arduino — 查表法(更快更精确)

```cpp
/*
 * NTC 测温 — 查表法 (Look-up Table)
 * 适用于对浮点运算敏感的场合或需要更高精度时
 * 表基于: R0=10K, B=3950, Rf=10K, 10-bit ADC
 */
#include <avr/pgmspace.h>

// ADC值 → 温度 (°C),步进 10 ADC单位,共103个点
// 预计算表格 (仅展示关键部分)
const PROGMEM int16_t tempTable[] = {
  // ADC: 0,  10,  20,  30,  40,  50,  60,  70,  80,  90...
  125, 118, 111, 105, 100, 96,  92,  88,  85,  82,   //   0~90
   79,  76,  74,  71,  69,  67,  65,  63,  61,  59,   // 100~190
   57,  55,  54,  52,  50,  48,  47,  45,  43,  42,   // 200~290
   40,  39,  37,  35,  34,  32,  31,  29,  28,  26,   // 300~390
   25,  23,  22,  20,  19,  17,  16,  15,  13,  12,   // 400~490
   10,   9,   8,   6,   5,   3,   2,   1,  -1,  -2,   // 500~590
   -4,  -5,  -6,  -8,  -9, -10, -12, -13, -14, -16,   // 600~690
  -17, -18, -20, -21, -23, -25, -25, -25, -25, -25,   // 700~790
  -25, -25, -25, -25, -25, -25, -25, -25, -25, -25,   // ...
  -25, -25, -25, -25, -25, -25, -25, -25, -25, -25,
  -25, -25, -25
};

int16_t getTempFromTable(uint16_t adc) {
  uint16_t idx = adc / 10;
  if (idx >= 103) idx = 102;
  return pgm_read_word(&tempTable[idx]);
}

void setup() {
  Serial.begin(115200);
}

void loop() {
  int adc = analogRead(A0);
  int16_t tempTimes10 = getTempFromTable(adc);
  Serial.print("ADC: "); Serial.print(adc);
  Serial.print(" → 温度: ");
  Serial.print(tempTimes10 / 10.0, 1);
  Serial.println(" °C");
  delay(500);
}
```

---

## 示例 4:STM32 HAL — ADC 读取 + 温度计算

```c
/*
 * STM32 HAL — ADC1 通道读取 NTC 模块
 * CubeMX: ADC1_INx (如 PA0), 12-bit, 连续转换
 * VCC=3.3V, Rf=10K, R0=10K, B=3950
 */
#include "main.h"
#include <math.h>

ADC_HandleTypeDef hadc1;

#define R_FIXED   10000.0f
#define R0        10000.0f
#define T0        298.15f
#define B_VALUE   3950.0f
#define VREF      3.3f
#define ADC_MAX   4095.0f

float NTC_ReadTemperature(void) {
  HAL_ADC_Start(&hadc1);
  if (HAL_ADC_PollForConversion(&hadc1, 10) != HAL_OK) {
    return -999.0f;
  }
  uint32_t adcVal = HAL_ADC_GetValue(&hadc1);

  float voltage = (float)adcVal * VREF / ADC_MAX;

  // 边界保护
  if (voltage >= VREF * 0.999f) voltage = VREF * 0.999f;
  if (voltage <= 0.001f) voltage = 0.001f;

  float R_ntc = R_FIXED * voltage / (VREF - voltage);
  float T_kelvin = 1.0f / (1.0f/T0 + logf(R_ntc/R0) / B_VALUE);

  return T_kelvin - 273.15f;
}

// 使用示例
void main_loop(void) {
  while (1) {
    float temp = NTC_ReadTemperature();
    printf("Temperature: %.1f °C\r\n", temp);
    HAL_Delay(500);
  }
}
```

---

## 示例 5:MicroPython (ESP32 / Pico)

```python
"""
NTC热敏电阻模块 — MicroPython
AO → GPIO34 (ESP32 ADC1), VCC→3.3V
"""
from machine import Pin, ADC
import time, math

R_FIXED = 10000.0   # 分压电阻
R0      = 10000.0   # NTC @25°C
T0      = 298.15    # 25°C Kelvin
B_VALUE = 3950.0    # B 常数
VREF    = 3.3       # 参考电压

adc = ADC(Pin(34))
adc.atten(ADC.ATTN_11DB)   # 0~3.3V 量程
adc.width(ADC.WIDTH_12BIT) # 12-bit (0~4095)

def read_temp():
    raw = adc.read()
    voltage = raw * VREF / 4095.0

    if voltage >= VREF * 0.999:
        voltage = VREF * 0.999
    if voltage <= 0.001:
        voltage = 0.001

    R_ntc = R_FIXED * voltage / (VREF - voltage)
    T_k = 1.0 / (1.0/T0 + math.log(R_ntc/R0) / B_VALUE)
    return T_k - 273.15

print("NTC 温度计 (MicroPython)")
while True:
    temp = read_temp()
    print(f"温度: {temp:.1f} °C")
    time.sleep(0.5)
```

参考资料

暂无参考文献