3、传感器基础:数字传感器 vs 模拟传感器,I2C、SPI、UART通信协议入门,如何看数据手册

好,咱们进入第三讲。这一讲是硬骨头,但也是你从「搭积木」到「真懂硬件」的分水岭。

传感器,说白了就是农业气象站的「眼睛」和「耳朵」。你得先搞清楚它们是怎么说话的,才能让单片机听懂。

3.1 数字传感器 vs 模拟传感器

先问个问题:你拿到的传感器,输出的是电压,还是数字信号?

这就是模拟和数字最根本的区别。

模拟传感器

输出的是连续变化的电压或电流。比如一个老式的土壤湿度探头,湿度越高,输出电压越高。单片机得用ADC(模数转换器)去读这个电压,才能换算成湿度值。

特点:

  • 信号是连续的,理论上无限精细
  • 但抗干扰能力差,线一长就容易飘
  • 需要ADC引脚,占用单片机资源
  • 典型代表:电位器、热敏电阻、光敏电阻
⚠️ 我曾经踩过的坑: 用一根10米的屏蔽线接模拟土壤湿度传感器,结果读数跳得像心电图。后来发现是线缆上的共模干扰。从那以后,超过2米的模拟信号线,我必加运放做差分传输。

数字传感器

内部集成了ADC和逻辑电路,直接输出一串0和1。你通过通信协议去读它,拿回来的直接就是温度、湿度、气压这些数值。

特点:

  • 抗干扰能力强,线长一点问题不大
  • 直接出数值,省去换算麻烦
  • 通常需要时钟线和数据线(或更多)
  • 典型代表:BME280、SHT30、DS18B20

我个人习惯,能上数字传感器就上数字传感器。省心,稳定。除非你非要测那种极低成本、或者极高速变化的信号,才考虑模拟。

3.2 三种通信协议入门:I2C、SPI、UART

数字传感器怎么和单片机聊天?靠的就是通信协议。农业气象站里,最常用的就这三种。

I2C(Inter-Integrated Circuit)

两根线:SDA(数据线)和SCL(时钟线)。所有设备挂在这两根线上,每个设备有个唯一地址。

特点:

  • 两根线可以挂多个设备(理论上127个)
  • 速度一般,标准模式100kHz,快速模式400kHz
  • 距离短,板级通信为主(1米以内)
  • 需要上拉电阻(4.7kΩ左右)

你想想看,一个气象站里,温湿度、气压、光照,全挂在一根I2C总线上,多清爽。

💡 我的经验: I2C总线上的设备越多,总线电容越大,波形就越容易变形。我一般控制在4-5个设备以内,超过就加I2C中继器(比如PCA9548)。

SPI(Serial Peripheral Interface)

四根线:MOSI(主出从入)、MISO(主入从出)、SCLK(时钟)、CS(片选)。每个从设备独占一根CS线。

特点:

  • 速度快,轻松上MHz
  • 全双工,可以同时收发
  • 每增加一个设备,就多一根CS线
  • 适合高速数据采集(比如风速风向传感器)

我在项目里用SPI接过一个高速光照传感器,采样率能跑到1kHz以上。I2C就做不到这么快。

UART(Universal Asynchronous Receiver/Transmitter)

两根线:TX(发送)和RX(接收)。没有时钟线,靠约定好的波特率来同步。

特点:

  • 点对点通信,一个发一个收
  • 距离可以做到几十米(用RS232或RS485转)
  • 速度取决于波特率,常用9600、115200
  • 异步通信,需要双方时钟误差小

说白了,UART就是最朴素的聊天方式。你一句我一句,不用握手信号。很多GPS模块、LoRa模块都用UART。

协议 线数 速度 距离 多设备 典型应用
I2C 2 是(地址区分) 温湿度、气压
SPI 4+ 是(片选区分) 高速ADC、SD卡
UART 2 否(点对点) GPS、LoRa

3.3 如何看数据手册(Datasheet)

嗯,这里我要多说几句。很多新手拿到数据手册就头大,几十页甚至上百页,不知道从哪看起。

我教你一个「三看」法:

  1. 看第一页的Features和Description —— 这页告诉你这个芯片是干嘛的,精度多少,供电电压多少,接口是什么。看完这页,你就知道它适不适合你的项目。
  2. 看Pin Configuration(引脚定义) —— 每个引脚叫什么,接什么。这是你画原理图的依据。
  3. 看通信时序图(Timing Diagram) —— 这是最核心的。它告诉你数据怎么读怎么写。比如I2C的起始条件、停止条件、ACK信号长什么样。
🔑 核心原则: 不要从头读到尾。带着问题去查。比如「这个传感器怎么初始化?」「怎么读温度值?」—— 直接去目录里找对应的章节。

举个例子,看BME280的数据手册:

  • 第一页:供电1.71V-3.6V,I2C/SPI接口,温度精度±0.5°C
  • 引脚图:SDA、SCL、CSB、SDI、SDO
  • 时序图:I2C读操作,先发设备地址+写位,再发寄存器地址,再发设备地址+读位,然后读数据

我曾经带过一个实习生,他拿着数据手册问我:「老师,这个芯片的I2C地址是多少?」我说你翻到第8页,Table 3。他翻了半天说没找到。我走过去一看,他看的是一份中文翻译版,翻译把「Address」译成了「地址」,但表格标题写的是「Slave Address」。嗯,有时候看原版英文手册反而更清楚。

⚠️ 避坑指南: 数据手册里的「典型值」和「最大值/最小值」是两回事。比如供电电压典型值是3.3V,但最大值可能是3.6V。你千万别卡着极限用,留20%的余量是基本素养。

3.4 实战:选一个传感器

假设你要测农业大棚里的温湿度和气压。你会怎么选?

我的建议:

  • 用BME280(I2C接口),一颗芯片搞定三个参数
  • 供电3.3V,直接接STM32或ESP32
  • I2C地址0x76(或0x77),挂到总线上
  • 读数据时,先写寄存器地址0xFA(温度)、0xF7(气压)、0xFD(湿度),然后连续读6个字节

你看,数据手册里都有这些寄存器地址。你只要照着时序图写代码就行。

好了,这一讲就到这里。下一讲我们开始动手,把传感器焊到板子上,跑通第一个I2C通信。