第二章:常见传感器原理

做物联网这些年,我接触过的传感器少说也有上百种。但说实话,真正在项目里高频使用的,其实就那么几类。今天咱们就聊聊最常见的五种传感器——温度、湿度、压力、光照,以及它们背后的原理。

你可能会问:「搞懂原理有什么用?直接用现成的库不就行了?」嗯,我以前也这么想。直到有一次在冷链物流项目里,热电偶读数飘得离谱,排查了三天才发现是冷端补偿没做对。从那以后,我养成了一个习惯:用任何传感器之前,先搞清楚它「为什么能测」。

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 本章知识体系

下面这张图总结了本章的核心内容,方便你快速回顾:

常见传感器原理知识体系 传感器分类 温度传感器 热电偶(塞贝克效应) 热敏电阻(NTC/PTC) DS18B20(数字输出) 湿度传感器 DHT11(低成本) DHT22(高精度) 压力传感器 压阻式(惠斯通电桥) 电容式(高灵敏度) 光照传感器 光敏电阻(LDR) BH1750(数字输出) 核心原则:模拟信号需ADC + 校准,数字信号更便捷

好了,以上就是常见传感器的工作原理和实际使用经验。每种传感器都有它的脾气,摸透了就好用。记住一点:选型时别只看参数表,多想想你的实际场景——温度范围够不够?精度要求高不高?环境有没有干扰?这些才是决定成败的关键。

可可精品资料库