3、传感器技术入门:温度传感器(NTC、DS18B20)、湿度传感器(DHT11/DHT22)、压力传感器原理与选型

做暖通空调嵌入式开发,传感器就是你的眼睛和耳朵。没有它们,你的控制器就是个瞎子。

我记得刚入行那会儿,老板扔给我一个项目——给一个大型冷库做温控系统。我天真地以为,随便买个温度探头焊上去就能用。结果呢?冷库温度波动得像过山车,压缩机频繁启停,最后把压缩机烧了。老板的脸比冷库还冷。

从那以后,我花了大把时间研究传感器。今天就把这些经验掰开了揉碎了讲给你听。

3.1 温度传感器:NTC热敏电阻

NTC,全称是负温度系数热敏电阻。说白了,温度越高,电阻值越小。这东西便宜、皮实,在空调、冰箱、热水器里随处可见。

工作原理

NTC的电阻值和温度之间的关系,不是线性的。它遵循一个指数关系,通常用Steinhart-Hart方程来描述:

1/T = A + B * ln(R) + C * (ln(R))^3

其中T是开尔文温度,R是当前电阻值,A、B、C是厂家给出的系数。

实际项目中,我们一般不会去手算这个方程。更常见的做法是查表法——厂家会提供一个温度-电阻对照表,我们直接查表或者做线性插值。

选型要点

  • B值:常见的有3435、3950等。B值越大,灵敏度越高。我一般选B=3950的,通用性好。
  • 标称电阻:25℃时的电阻值,常见10kΩ、100kΩ。空调领域10kΩ最常见。
  • 精度:±1%、±3%、±5%。做温控的话,至少选±1%。

实战经验:NTC的引线长度会影响测量精度。线越长,引入的电阻误差越大。我曾经在项目里用了5米长的线,结果温度读数偏高了2℃。后来改用三线制接法,问题才解决。

小技巧:如果只是做简单的温度判断(比如高于50℃就关压缩机),可以用比较器直接处理NTC的分压信号,连ADC都省了。成本能降好几毛钱。

3.2 温度传感器:DS18B20

DS18B20是Dallas半导体公司的数字温度传感器。它最大的好处是——直接输出数字信号,不需要ADC,不需要校准。

为什么我喜欢它?

因为它用一根数据线就能通信,这就是所谓的「单总线协议」。而且一条总线上可以挂多个DS18B20,每个芯片有唯一的64位序列号。你想想看,一个冷库里有十几个测温点,只需要一根线串起来,多省事。

典型电路

VCC (3.3V 或 5V)
  │
  ├─── 4.7kΩ ───┐
  │              │
  │              ├─── DQ (数据线) ───→ 单片机GPIO
  │              │
  │              └─── GND
  │
DS18B20
  │
  └─── GND

注意那个4.7kΩ的上拉电阻,不能省。我见过有人偷懒没加,结果通信时好时坏,排查了整整一天。

代码示例(读取温度)

// 简化版DS18B20读取函数
float readDS18B20(void) {
    uint8_t data[9];
    float temperature;

    // 复位脉冲
    resetDS18B20();
    // 跳过ROM(单设备时使用)
    writeByte(0xCC);
    // 启动温度转换
    writeByte(0x44);
    delay_ms(750);  // 等待转换完成

    // 再次复位
    resetDS18B20();
    writeByte(0xCC);
    // 读取暂存器
    writeByte(0xBE);

    // 读取9个字节
    for (int i = 0; i < 9; i++) {
        data[i] = readByte();
    }

    // 计算温度值
    int16_t raw = (data[1] << 8) | data[0];
    temperature = raw * 0.0625;

    return temperature;
}

注意:DS18B20的转换时间最长要750ms。如果你需要快速采样,这个延迟可能受不了。我有个项目要求每100ms采集一次温度,DS18B20就不合适了,最后换成了模拟输出的LM35。

3.3 湿度传感器:DHT11 vs DHT22

这两个传感器在暖通空调里用得特别多。它们都是数字输出,单总线通信,但性能差别不小。

参数 DHT11 DHT22
湿度范围 20% ~ 90% RH 0% ~ 100% RH
湿度精度 ±5% RH ±2% RH
温度范围 0℃ ~ 50℃ -40℃ ~ 80℃
温度精度 ±2℃ ±0.5℃
采样周期 1秒 2秒
价格 约2元 约8元

怎么选?

我个人习惯:做消费级产品(比如家用温控器)用DHT11就够了,便宜。做工业级或者精密控制,必须上DHT22。我曾经在一个恒温恒湿实验室项目里用了DHT11,结果湿度控制一直在±8%之间晃,根本达不到要求。换成DHT22后,稳稳地控制在±2%以内。

通信协议要点

DHT系列的数据格式是固定的:40位数据包,前16位是湿度,中间16位是温度,最后8位是校验和。

// DHT11读取数据格式
// 数据包: 8位湿度整数 + 8位湿度小数 + 8位温度整数 + 8位温度小数 + 8位校验和
// 示例: 00101101 00000000 00011010 00000000 01000111
// 湿度 = 0x2D = 45% RH
// 温度 = 0x1A = 26℃
// 校验和 = 0x47 = 0x2D + 0x00 + 0x1A + 0x00 = 0x47 (正确)

避坑指南:DHT11的采样周期是1秒。如果你在1秒内连续读取两次,第二次读到的数据会是上一次的缓存值。我曾经踩过这个坑,写了个循环每100ms读一次,结果读出来的数据全是重复的。后来加了1秒的延时才搞定。

3.4 压力传感器

暖通空调系统里,压力传感器主要用在制冷剂管路、风管和水管上。常见的类型有:

  • 压阻式:利用硅片的压阻效应,精度高,体积小。我用的最多。
  • 电容式:利用膜片位移改变电容,适合低压测量。
  • 陶瓷式:耐腐蚀,适合恶劣环境。

选型关键参数

  1. 量程:制冷系统高压侧一般选0~3.5MPa,低压侧选0~1.5MPa。别选大了,精度会下降。
  2. 输出信号:常见的有0~5V、0~10V、4~20mA。工业现场4~20mA最常用,抗干扰能力强。
  3. 精度:一般±0.5% FS就够了。精密控制需要±0.25% FS。
  4. 介质兼容性:测制冷剂要用不锈钢膜片,测水可以用陶瓷膜片。

实战案例:有一次做中央空调的变风量系统,需要测量风管内的静压。我选了个量程0~1000Pa的差压传感器,输出0~10V。结果安装后发现读数一直在跳,根本稳不住。排查了半天,发现是风管里的气流脉动造成的。后来在取压管上加了个阻尼器,问题解决。

接线注意事项

压力传感器通常有三根线:电源正、电源负、信号输出。4~20mA的传感器,信号线需要串联一个250Ω的电阻,把电流信号转成1~5V电压信号给ADC采样。

// 4~20mA转电压计算
// 250Ω电阻: 4mA × 250Ω = 1V, 20mA × 250Ω = 5V
// ADC读取电压值 V
// 压力值 P = (V - 1V) / (5V - 1V) × (量程上限 - 量程下限) + 量程下限

float calcPressure(float voltage, float rangeMin, float rangeMax) {
    float pressure;
    pressure = (voltage - 1.0) / 4.0 * (rangeMax - rangeMin) + rangeMin;
    return pressure;
}

重要提醒:压力传感器的电源不能和压缩机、风机等大功率设备共用。我曾经图省事,直接从继电器电源上取电给传感器,结果每次压缩机启动,传感器读数就跳变一次。后来加了独立的稳压电源才稳定。

嗯,传感器这块内容不少。但说白了,选传感器就是三个字:够用、可靠、便宜。别追求最高精度,也别为了省钱用最差的。根据你的系统要求,找到那个平衡点就行。

下一章我们聊聊执行器——有了传感器感知环境,还得有执行器去改变环境。到时候见。