在嵌入式开发的世界里,环境感知是构建智能系统的第一步。而在众多环境参数中,温度无疑是最基本也最关键的因素之一。无论是空调自动调温、风扇控制,还是工业设备过热报警——一切都离不开温度检测。
今天我们就来认识一位温控“功臣”——NTC热敏电阻模块。
🧊 1. 什么是NTC热敏电阻?
NTC,全称 Negative Temperature Coefficient,即“负温度系数”。顾名思义:温度升高 → 阻值下降。
聪明的工程师们利用这个特性,将NTC热敏电阻与分压电路、比较器、LED等元件封装成一个小巧实用的模块,既能输出连续变化的模拟信号(模拟量),也能输出开关控制信号(数字量),完美适用于各种温控应用。
🔧 2. 模块结构与技术参数
下图是市面上常见的热敏电阻模块样式(含LED指示灯与可调电位器):
参数项 | 说明 |
---|---|
传感器类型 | NTC热敏电阻 |
工作电压 | DC 3.3V ~ 5V |
检测范围 | -55℃ ~ 125℃(实用范围通常为20℃ ~ 80℃) |
检测精度 | ±1% |
模拟输出(AO) | 输出范围 0~5V,随温度变化连续变化 |
数字输出(DO) | 可调温度阈值开关量输出(高/低电平),默认低温高电平,高温低电平 |
信号芯片 | LM393 双路比较器,波形干净,驱动能力强(可达15mA) |
接口引脚 | VCC、GND、DO(数字输出)、AO(模拟输出) |
调节方式 | 板载蓝色可调电位器调节温度阈值 |
💡 不同厂家模块可能在电路细节上有所不同,实际参数请以技术手册为准。
🧠 3. 模块工作原理解析
模拟量输出(AO)
模块通过NTC与固定电阻组成分压电路,当温度升高时,NTC电阻下降 → 电压变化 → STM32通过ADC读取 → 推算出当前温度。
温度 (℃) | 电阻值 (Ω) | 输出电压(V) |
---|---|---|
0 | 32650 | ≈ 4.0V |
25 | 10000 | ≈ 2.5V |
50 | 3500 | ≈ 1.3V |
75 | 1400 | ≈ 0.6V |
100 | 700 | ≈ 0.3V |
参考电阻为10kΩ,供电电压为5V,数值为理论计算值,仅供参考。
数字量输出(DO)
模块内部比较器将AO与电位器设定阈值比较,当温度超过设定温度时,DO输出低电平(0),并点亮绿色指示灯;当低于阈值时,DO输出高电平(1),灯灭。
⚙️ 4. STM32读取温度实战教程
硬件平台:STM32F103C8T6
开发环境:Keil MDK + 标准外设库(StdLib)
接线方式:AOUT → PA1,VCC → 5V,GND → GND
🧩 步骤一:GPIO+ADC初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
📐 步骤二:温度换算函数(Steinhart-Hart)
float Calculate_Temperature(float voltage) {
float resistance = (3.3 - voltage) * 10000 / voltage;
float steinhart = resistance / 10000.0;
steinhart = log(steinhart);
steinhart = 1.0 / (0.001129148 + 0.000234125 * steinhart +
0.0000000876741 * pow(steinhart, 3));
return steinhart - 273.15; // 开尔文转摄氏度
}
🔄 步骤三:主循环读取并打印
float Read_ADC(uint8_t channel) {
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
uint16_t adc_val = ADC_GetConversionValue(ADC1);
return (adc_val * 3.3) / 4096.0;
}
int main(void) {
float voltage, temp;
ADC_Config();
GPIO_Config();
while (1) {
voltage = Read_ADC(1);
temp = Calculate_Temperature(voltage);
printf("温度:%.2f °C\n", temp); // 串口输出或OLED显示
Delay_ms(1000);
}
}
✅ 5. 实际调试小技巧
-
💡 电位器调节方法:
通电后,将模块放置在桌面,缓慢调节蓝色电位器,直到绿色指示灯刚好亮起,再回调一点让其熄灭。然后通过加热热敏电阻(如手捂、热风枪等)测试其是否响应。 -
📉 模拟输出更平稳:
读取AO时建议加软滤波(滑动平均),或硬件滤波电容,提高精度和抗干扰能力。 -
🔥 过温保护注意:
模块虽然支持高温,但建议避免长时间处于80℃以上环境,防止元件老化。
🔗 6. 应用案例拓展
应用方向 | 说明 |
---|---|
家居自动控温系统 | 控制风扇、暖气、空调等 |
智能农业环境监控 | 棚室温度监测与通风调节 |
工业设备过温报警 | 与蜂鸣器或继电器搭配使用 |
DIY电子钟温显 | OLED+温度传感器组合 |
水温控制应用 | 更换为带引线NTC探头后,可测量水温/水箱温度 |
📐 原理图:
🎉 结语
NTC热敏电阻模块,是一个成本低廉、功能实用、使用简单的温度感知利器。在 STM32、Arduino、树莓派等主控平台中,都可以轻松接入并实现精准温控功能。无论你是初学者,还是正在开发一个实用项目,它都是你不可错过的传感器模块之一!