第一章:传感器基础与选型

大家好,我是老李。做物联网这些年,我经手过的传感器少说也有上百种了。今天咱们聊聊传感器的基础知识和选型。说实话,选传感器这事儿,看着简单,其实坑不少。我刚开始做项目时,就吃过不少亏。

一、常见传感器类型

传感器说白了,就是把物理世界的信号变成电信号的东西。咱们物联网项目里,最常用的就这几类:

1. 温度传感器

这个大家最熟悉。我常用的有DS18B20、DHT11、SHT30这些。DS18B20精度不错,-55℃到125℃范围,适合大多数场景。DHT11便宜,但精度一般,我一般只用在要求不高的环境监测里。

我的经验: 如果项目对温度精度要求高,比如医疗设备,我建议用SHT30或BME280。虽然贵点,但稳定性好很多。

2. 湿度传感器

湿度测量其实挺讲究的。电容式湿度传感器响应快,但容易受温度影响。电阻式的便宜,但精度差一些。我做过一个粮仓监测项目,当时选了SHT30,效果不错。

3. 压力传感器

压力传感器分绝对压力、表压和差压。我做过一个水箱液位监测,用的就是扩散硅压力传感器。选型时要注意量程,别选太大,否则小信号测不准。

4. 光照传感器

光照传感器有光敏电阻、光电二极管、数字光照传感器。BH1750是我常用的,I2C接口,直接读数字量,省事。

二、传感器关键参数

选传感器,你得看懂参数表。我刚开始时,看着一堆参数头都大。后来慢慢总结出几个关键点:

参数 说明 我的建议
精度 测量值与真实值的偏差 一般选±2%以内的
分辨率 能检测到的最小变化量 12位以上够用
采样率 每秒采集次数 温度1Hz够,振动要100Hz+
量程 能测量的范围 留20%余量
响应时间 信号变化到输出的时间 温度慢,光照快
核心要点: 精度和分辨率是两码事。精度高不一定分辨率高,反之亦然。我见过有人把分辨率当精度用,结果数据波动大,根本没法用。

三、选型实战案例

光说不练假把式。我拿一个实际项目说说:

项目背景: 智能温室环境监测系统。需要测温度、湿度、光照、CO2浓度。

我的选型思路:

  1. 温度湿度: 选了SHT30。精度±0.3℃,湿度±2%RH。I2C接口,好接线。
  2. 光照: 选了BH1750。0-65535 lux范围,16位分辨率。够用。
  3. CO2: 选了MH-Z19B。红外原理,400-5000ppm。注意要预热。
避坑指南: 我曾经在选CO2传感器时,图便宜买了电化学的。结果用了半年就漂移严重,数据完全不准。后来换了红外的,稳定多了。所以,关键参数上别省钱。

选型时,我还会考虑接口类型。模拟输出要ADC,数字输出省事。I2C和SPI是主流,UART也常见。我个人习惯优先选I2C,因为接线少,调试方便。

四、知识体系总览

下面这张图,是我自己总结的传感器选型框架。你照着这个思路走,基本不会出错:

传感器选型 常见传感器类型 温度 湿度 压力 光照 关键参数 精度 分辨率 采样率 量程 接口类型 I2C SPI UART 模拟 选型原则:先定类型 → 再看参数 → 最后选接口 留余量、看环境、考虑成本

嗯,这张图基本把选型的逻辑说清楚了。你想想看,是不是这个理?先确定要测什么(类型),再看需要多准(参数),最后考虑怎么接(接口)。

五、代码示例:读取SHT30温湿度

最后,给个实际代码。这是我在树莓派上读SHT30的Python代码:

import smbus
import time

# SHT30 I2C地址
SHT30_ADDR = 0x44

# 初始化I2C
bus = smbus.SMBus(1)

def read_sht30():
    # 发送测量命令
    bus.write_i2c_block_data(SHT30_ADDR, 0x2C, [0x06])
    time.sleep(0.5)
    
    # 读取6字节数据
    data = bus.read_i2c_block_data(SHT30_ADDR, 0x00, 6)
    
    # 计算温度
    temp_raw = ((data[0] << 8) | data[1])
    temperature = -45 + 175 * temp_raw / 65535.0
    
    # 计算湿度
    hum_raw = ((data[3] << 8) | data[4])
    humidity = 100 * hum_raw / 65535.0
    
    return temperature, humidity

# 主循环
while True:
    temp, hum = read_sht30()
    print(f"温度: {temp:.2f}℃, 湿度: {hum:.2f}%")
    time.sleep(2)
小技巧: 代码里我加了0.5秒延时,这是SHT30转换数据需要的时间。别急着读,否则数据不对。我刚开始就犯过这个错。

好了,传感器基础就聊到这儿。记住,选传感器没有万能方案,关键看你的项目需求。多看看数据手册,多动手试试,慢慢就有感觉了。

可可精品资料库