第二章:常见传感器原理
做物联网这些年,我接触过的传感器少说也有上百种。但说实话,真正在项目里高频使用的,其实就那么几类。今天咱们就聊聊最常见的五种传感器——温度、湿度、压力、光照,以及它们背后的原理。
你可能会问:「搞懂原理有什么用?直接用现成的库不就行了?」嗯,我以前也这么想。直到有一次在冷链物流项目里,热电偶读数飘得离谱,排查了三天才发现是冷端补偿没做对。从那以后,我养成了一个习惯:用任何传感器之前,先搞清楚它「为什么能测」。
2.1 温度传感器
温度测量是物联网里最基础的需求。常见的方案有三种:热电偶、热敏电阻、数字传感器(DS18B20)。
2.1.1 热电偶
热电偶的原理其实挺有意思——两种不同金属接在一起,温度变化时会产生微弱的电压。这个现象叫「塞贝克效应」。我当年在大学实验室第一次看到这个现象时,觉得特别神奇。
关键参数:
- 测温范围:-200℃ ~ 2000℃(K型最常见)
- 输出信号:微伏级电压(约40μV/℃)
- 精度:±1.5℃ ~ ±2.5℃
我曾经在高温炉项目里直接用热电偶接ADC,结果读数完全不对。后来才意识到:热电偶输出的是差分信号,而且需要冷端补偿。说白了,你得知道参考端的温度,才能算出真实值。很多新手在这里栽跟头。
典型电路连接:
// 使用MAX6675冷端补偿芯片读取K型热电偶
#include <SPI.h>
#include <MAX6675.h>
MAX6675 thermocouple(SCK_PIN, CS_PIN, SO_PIN);
void setup() {
Serial.begin(9600);
}
void loop() {
float temp = thermocouple.readCelsius();
Serial.print("温度:");
Serial.println(temp);
delay(1000);
}
2.1.2 热敏电阻
热敏电阻说白了就是个「温度变了电阻跟着变」的元件。分两种:NTC(负温度系数,温度越高电阻越小)和PTC(正温度系数)。
我个人习惯用NTC,因为便宜、响应快。但要注意——它的阻值和温度不是线性关系,得查表或者用Steinhart-Hart方程算。
实际项目中,我一般用10kΩ的NTC配合10kΩ上拉电阻做分压。这样在25℃时输出正好是VCC的一半,ADC分辨率利用率最高。
Steinhart-Hart方程:
1/T = A + B·ln(R) + C·(ln(R))³
其中:
T = 开尔文温度
R = 当前电阻值
A、B、C = 传感器厂商提供的系数
2.1.3 DS18B20 数字温度传感器
DS18B20是我个人最喜欢的温度传感器。为什么?因为它直接输出数字信号,一根线就能传数据(OneWire协议),而且每个芯片有唯一ID,可以挂一堆在总线上。
核心特性:
| 参数 | 值 |
|---|---|
| 测温范围 | -55℃ ~ +125℃ |
| 精度 | ±0.5℃(-10℃ ~ +85℃) |
| 分辨率 | 9~12位可配置 |
| 供电方式 | 3.0V ~ 5.5V(支持寄生供电) |
我在温室大棚项目里用了32个DS18B20挂在同一条总线上。一开始总有几个读不到数据,排查发现是线太长导致信号衰减。解决办法:在总线末端加一个4.7kΩ上拉电阻,并且把线长控制在50米以内。
// 读取单个DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
sensors.begin();
}
void loop() {
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0);
Serial.print("DS18B20温度:");
Serial.println(temp);
delay(1000);
}
2.2 湿度传感器:DHT11 / DHT22
温湿度一体传感器里,DHT系列是的「街机」。DHT11便宜但精度一般,DHT22贵一些但性能好很多。
对比一下:
| 参数 | DHT11 | DHT22 |
|---|---|---|
| 湿度范围 | 20% ~ 90% RH | 0% ~ 100% RH |
| 湿度精度 | ±5% RH | ±2% RH |
| 温度范围 | 0℃ ~ 50℃ | -40℃ ~ 80℃ |
| 采样周期 | 1秒 | 2秒 |
| 价格 | 约3元 | 约15元 |
我曾经在户外气象站项目里用了DHT11,结果湿度超过90%时读数直接飘到99%。后来换成DHT22才解决问题。说白了,DHT11只适合室内环境,户外或者高湿场景别省那点钱。
// DHT22读取示例
#include <DHT.h>
DHT dht(DHT_PIN, DHT22);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("读取失败!");
return;
}
Serial.print("湿度:");
Serial.print(h);
Serial.print("% 温度:");
Serial.println(t);
delay(2000);
}
2.3 压力传感器
压力传感器种类很多,但原理万变不离其宗——把压力转换成电信号。最常见的是压阻式和电容式。
压阻式原理: 硅片上做四个压敏电阻组成惠斯通电桥。压力变化时,电阻值变化,电桥输出差分电压。
我在智能水压监测项目里用过MPX5700系列,输出0.2~4.7V模拟信号,对应0~700kPa。注意一点:这种传感器输出不是从0V开始的,ADC采集时要做偏移校准。
压力传感器最怕两件事:一是过压(超过量程会永久损坏),二是介质腐蚀。选型时一定要留20%~30%的余量,并且确认密封材料是否兼容你的被测介质。
2.4 光照传感器
2.4.1 光敏电阻
光敏电阻(LDR)是最简单的光传感器。光照越强,电阻越小。暗电阻可达1MΩ,亮电阻可低至几百Ω。
但说实话,光敏电阻的精度很差,而且响应慢。我一般只用在「有没有光」这种开关量场景,比如路灯控制、窗帘开关。
2.4.2 BH1750 数字光照传感器
如果你需要精确测量光照强度(单位:lux),BH1750是首选。它通过I2C接口输出数字值,分辨率最高可达1lux。
核心参数:
- 测量范围:1 ~ 65535 lux
- 分辨率:1 lux(高分辨率模式)
- 接口:I2C(地址0x23或0x5C)
- 功耗:0.12mA(典型)
我在智能农业大棚项目里用BH1750配合遮阳帘控制。当光照超过50000lux时自动拉下遮阳帘,低于20000lux时收起。用了两年,数据一直很稳定。
// BH1750读取示例
#include <Wire.h>
#include <BH1750.h>
BH1750 lightMeter;
void setup() {
Serial.begin(9600);
Wire.begin();
lightMeter.begin();
}
void loop() {
float lux = lightMeter.readLightLevel();
Serial.print("光照强度:");
Serial.print(lux);
Serial.println(" lux");
delay(500);
}
2.5 本章知识体系
下面这张图总结了本章的核心内容,方便你快速回顾:
好了,以上就是常见传感器的工作原理和实际使用经验。每种传感器都有它的脾气,摸透了就好用。记住一点:选型时别只看参数表,多想想你的实际场景——温度范围够不够?精度要求高不高?环境有没有干扰?这些才是决定成败的关键。
可可精品资料库