传感器选型与数据采集:温度、湿度、风速、压力传感器选型,I2C/SPI接口通信,数据手册解读
各位同学,咱们今天聊聊传感器选型和数据采集。说实话,这部分是智能风机控制系统的“眼睛”和“耳朵”。传感器选错了,后面算法再牛也白搭。我见过不少项目,控制逻辑写得漂漂亮亮,结果因为传感器精度不够或者接口没选对,整个系统表现一塌糊涂。
咱们先看一张图,把今天要讲的知识体系理清楚。
一、传感器选型——别只看参数表
选传感器,说白了就是找平衡。精度、成本、功耗、体积,这几样东西你得掂量着来。我刚开始做项目那会儿,总想着选最好的,结果一个传感器比MCU还贵,老板脸都绿了。
1. 温度传感器
智能风机系统里,温度测量是基本功。常用的有DS18B20、SHT30、BME280这些。我个人习惯用数字式温度传感器,直接输出数字信号,省得搞ADC转换。
| 型号 | 精度 | 接口 | 工作电压 | 典型应用 |
|---|---|---|---|---|
| DS18B20 | ±0.5°C | 1-Wire | 3.0~5.5V | 多点测温 |
| SHT30 | ±0.3°C | I2C | 2.4~5.5V | 温湿度一体 |
| BME280 | ±1.0°C | I2C/SPI | 1.71~3.6V | 环境监测 |
2. 湿度传感器
湿度对风机控制影响很大,尤其是冷凝风险判断。常用的有SHT系列、DHT系列、HDC1080。嗯,这里要注意,DHT11虽然便宜,但精度太差,我踩过这个坑。
3. 风速传感器
风速测量是风机控制的核心。常见的有热膜式、超声波式、叶轮式。热膜式便宜但容易受污染,超声波式精度高但贵。
- 热膜式风速传感器:响应快,适合管道内测量,但怕灰尘
- 超声波风速传感器:精度高,无机械磨损,适合户外
- 叶轮式风速传感器:结构简单,但机械部件容易老化
我个人建议,室内风机用热膜式就够了,户外风机还是上超声波吧,省得三天两头维护。
4. 压力传感器
压力传感器用来测风压、差压。常用的有MPXV7002、SDP810、MS5611。差压传感器在风机控制里特别重要,能帮你判断过滤器是否堵塞。
二、I2C/SPI接口通信——选对总线,事半功倍
传感器选好了,怎么跟MCU通信?I2C和SPI是两大主流。你想想看,I2C只需要两根线,SPI需要四根线,但SPI速度快。怎么选?
1. I2C接口
I2C用两根线:SCL(时钟)和SDA(数据)。每个设备有唯一地址。我习惯用I2C接温湿度传感器,因为数据量小,速度要求不高。
// I2C读取SHT30示例代码
#include <Wire.h>
#define SHT30_ADDR 0x44
void setup() {
Wire.begin();
Serial.begin(115200);
}
void loop() {
Wire.beginTransmission(SHT30_ADDR);
Wire.write(0x2C);
Wire.write(0x06);
Wire.endTransmission();
delay(100);
Wire.requestFrom(SHT30_ADDR, 6);
if(Wire.available() == 6) {
uint16_t temp_raw = (Wire.read() << 8) | Wire.read();
uint16_t hum_raw = (Wire.read() << 8) | Wire.read();
float temp = -45.0 + 175.0 * temp_raw / 65535.0;
float hum = 100.0 * hum_raw / 65535.0;
Serial.print("Temp: "); Serial.print(temp);
Serial.print(" C, Hum: "); Serial.print(hum);
Serial.println(" %");
}
delay(1000);
}
2. SPI接口
SPI用四根线:SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。速度比I2C快很多,适合高速数据采集。
// SPI读取BME280示例(简化版)
#include <SPI.h>
#define BME280_CS 10
void setup() {
SPI.begin();
pinMode(BME280_CS, OUTPUT);
digitalWrite(BME280_CS, HIGH);
Serial.begin(115200);
// 初始化BME280
digitalWrite(BME280_CS, LOW);
SPI.transfer(0xF2); // 写控制寄存器
SPI.transfer(0x01); // 设置模式
digitalWrite(BME280_CS, HIGH);
}
void loop() {
uint8_t data[8];
digitalWrite(BME280_CS, LOW);
SPI.transfer(0xF7 | 0x80); // 读压力数据
for(int i=0; i<8; i++) {
data[i] = SPI.transfer(0x00);
}
digitalWrite(BME280_CS, HIGH);
// 解析数据...
delay(1000);
}
三、数据手册解读——别被参数忽悠了
数据手册是传感器的“身份证”。但说实话,很多工程师看数据手册只看个大概,结果被坑了。我教你怎么看。
1. 电气特性
工作电压、工作电流、功耗。这些是基础,但要注意“典型值”和“最大值”的区别。有些厂家标的典型值很漂亮,但实际用起来差很多。
2. 精度与分辨率
精度是实际误差,分辨率是能分辨的最小变化。这两个概念别搞混了。我见过有人把16位分辨率当成高精度,结果实际误差大得离谱。
3. 时序图
时序图是通信的灵魂。I2C的起始条件、停止条件、数据有效性,SPI的时钟极性和相位,这些都得看明白。
4. 寄存器映射
数字传感器都有寄存器。你得知道哪个寄存器存温度,哪个存湿度,哪个是配置寄存器。我建议把寄存器表打印出来,贴在工位上。
四、实战经验总结
说了这么多,总结几条实在的:
- 传感器选型别贪便宜:便宜没好货,尤其是传感器。省下来的钱都会变成调试时间还回去。
- 接口选择看需求:数据量小、距离近用I2C;数据量大、要求速度快用SPI。
- 数据手册要细读:别只看第一页,后面的时序图、寄存器表、应用笔记都得看。
- 先验证再批量:我习惯先买几片样品,搭个测试板跑一跑,没问题了再批量采购。
好了,这一章的内容就到这儿。传感器选型这块,多动手、多踩坑,慢慢就有感觉了。