2、传感器技术基础:温湿度传感器(DHT22)、气体传感器(MQ系列)、光照传感器(BH1750)的工作原理与选型
好,咱们进入第二章。传感器,说白了就是系统的「眼睛」和「鼻子」。你系统再牛,数据不准也是白搭。这一章我带你摸透三个最常用的传感器:DHT22、MQ系列和BH1750。嗯,都是实战中高频出现的家伙。
2.1 温湿度传感器:DHT22
DHT22,也叫AM2302。我个人习惯用它替代DHT11,虽然贵几块钱,但精度和稳定性完全不是一个级别。
工作原理
DHT22内部有一个电容式感湿元件和一个NTC测温元件。说白了,湿度变化改变电容值,温度变化改变电阻值。内部有个8位单片机直接帮你算好,输出数字信号。你不需要搞什么模拟量换算,直接读数据就行。
关键参数对比:DHT11 vs DHT22
| 参数 | DHT11 | DHT22 |
|---|---|---|
| 温度精度 | ±2°C | ±0.5°C |
| 湿度精度 | ±5% RH | ±2% RH |
| 采样周期 | 1秒 | 2秒 |
| 量程(温度) | 0~50°C | -40~80°C |
我在项目里踩过一个坑:DHT22的采样周期是2秒,你如果1秒读一次,数据会卡死。曾经有个学员死活读不到数据,折腾半天,就是时序没卡对。
接线与代码示例
// DHT22 读取示例(Arduino)
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
delay(2000); // 注意:必须大于2秒!
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("读取失败,检查接线");
return;
}
Serial.print("湿度: "); Serial.print(h);
Serial.print(" % 温度: "); Serial.print(t);
Serial.println(" °C");
}
避坑指南:我曾经把DHT22放在通风口旁边,数据跳得像心电图。后来加了防风罩,数据才稳下来。记住:传感器不能直接对着风口。
2.2 气体传感器:MQ系列
MQ系列是个大家族。MQ-2(可燃气体)、MQ-7(一氧化碳)、MQ-135(空气质量)。它们的工作原理其实都一样——气敏电阻。
工作原理
说白了,就是传感器内部有个加热丝,把敏感材料加热到工作温度。当目标气体接触敏感材料时,电阻值会变化。你通过测量电阻变化,反推出气体浓度。
但这里有个坑:MQ系列输出的是模拟电压,不是数字值。你需要自己校准。我记得第一次用MQ-2时,直接拿ADC读数当浓度,结果闹了笑话。
选型建议
- MQ-2:检测液化气、丙烷、氢气。适合厨房燃气报警。
- MQ-7:专门测一氧化碳。适合车库、地下室。
- MQ-135:测氨气、苯、烟雾。适合空气质量监测。
重要提醒:MQ传感器需要预热!刚上电的前30秒数据完全不可信。我曾经因为这个被客户投诉,说设备一开机就报警。后来加了预热倒计时,问题解决。
代码示例:读取MQ-2
// MQ-2 模拟读取示例
int mq2Pin = A0;
int sensorValue = 0;
void setup() {
Serial.begin(9600);
Serial.println("预热中,请等待30秒...");
delay(30000); // 预热
Serial.println("预热完成");
}
void loop() {
sensorValue = analogRead(mq2Pin);
// 注意:这个值需要根据你的电路和校准曲线换算
Serial.print("ADC值: ");
Serial.println(sensorValue);
delay(1000);
}
2.3 光照传感器:BH1750
BH1750是我最喜欢的光照传感器。为什么?因为它直接输出勒克斯(lux)值,不需要你搞什么光电转换计算。你想想看,用光敏电阻还得自己搭电路、查曲线,多麻烦。
工作原理
BH1750内部集成了光电二极管和ADC转换器。它通过I2C接口直接输出数字光照强度。精度高、功耗低,而且不受光源类型影响——白炽灯、LED、日光灯,它都能准确测量。
我记得有一次做智能窗帘项目,客户要求根据光照自动调节。用BH1750,两行代码就搞定了。要是用光敏电阻,光校准就得花半天。
接线与代码示例
// BH1750 读取示例(Arduino)
#include <Wire.h>
#include <BH1750.h>
BH1750 lightMeter;
void setup() {
Serial.begin(9600);
Wire.begin();
if (!lightMeter.begin()) {
Serial.println("BH1750 未检测到,检查接线");
while (1);
}
}
void loop() {
float lux = lightMeter.readLightLevel();
Serial.print("光照强度: ");
Serial.print(lux);
Serial.println(" lx");
delay(500);
}
小技巧:BH1750有多个测量模式。高分辨率模式精度最高,但测量时间稍长。如果你做的是快速响应的项目,可以用连续高分辨率模式。我个人习惯用默认模式,省心。
2.4 知识体系总览
下面这张图,是我自己梳理的传感器选型逻辑。你照着这个思路走,基本不会选错。
2.5 选型总结
说了这么多,我帮你理一下思路:
- 温湿度:别犹豫,直接上DHT22。DHT11那点差价,不够你后期调试的时间成本。
- 气体:先搞清楚你要测什么气体,再选对应的MQ型号。别拿MQ-2去测CO,那是找骂。
- 光照:BH1750是首选。除非你预算极低,才考虑光敏电阻。
核心原则:传感器选型,不是选最贵的,也不是选最便宜的。是选「够用且稳定」的。我见过太多人为了省两块钱,后期花两百块去调试。得不偿失。
嗯,这一章就到这儿。传感器是系统的根基,选对了,后面就顺了。你把这些原理吃透,后面实战章节会轻松很多。