NTC热敏电阻测温模块 — 代码例程
示例 1:Arduino — 基础温度读取 (AO)
#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;
float R_ntc = R_FIXED * voltage / (VCC - voltage);
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 双模式(温度报警)
#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 — 查表法(更快更精确)
#include <avr/pgmspace.h>
const PROGMEM int16_t tempTable[] = {
125, 118, 111, 105, 100, 96, 92, 88, 85, 82,
79, 76, 74, 71, 69, 67, 65, 63, 61, 59,
57, 55, 54, 52, 50, 48, 47, 45, 43, 42,
40, 39, 37, 35, 34, 32, 31, 29, 28, 26,
25, 23, 22, 20, 19, 17, 16, 15, 13, 12,
10, 9, 8, 6, 5, 3, 2, 1, -1, -2,
-4, -5, -6, -8, -9, -10, -12, -13, -14, -16,
-17, -18, -20, -21, -23, -25, -25, -25, -25, -25,
-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 读取 + 温度计算
#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)
"""
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)