介绍
基于NTC热敏电阻(典型10KΩ B值3950)和分压电路的模拟温度传感器模块,三线制(AO/DO双输出,VCC/GND),模拟输出经LM393比较器同时提供数字开关量输出(阈值可调电位器),温度范围-25°C~125°C,响应快成本低,适用于水温/气温/设备温度监测
基于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热敏电阻测温模块 — 代码例程
---
## 示例 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)
```
暂无参考文献