3、传感器基础:数字传感器 vs 模拟传感器,I2C、SPI、UART通信协议入门,如何看数据手册
好,咱们进入第三讲。这一讲是硬骨头,但也是你从「搭积木」到「真懂硬件」的分水岭。
传感器,说白了就是农业气象站的「眼睛」和「耳朵」。你得先搞清楚它们是怎么说话的,才能让单片机听懂。
3.1 数字传感器 vs 模拟传感器
先问个问题:你拿到的传感器,输出的是电压,还是数字信号?
这就是模拟和数字最根本的区别。
模拟传感器
输出的是连续变化的电压或电流。比如一个老式的土壤湿度探头,湿度越高,输出电压越高。单片机得用ADC(模数转换器)去读这个电压,才能换算成湿度值。
特点:
- 信号是连续的,理论上无限精细
- 但抗干扰能力差,线一长就容易飘
- 需要ADC引脚,占用单片机资源
- 典型代表:电位器、热敏电阻、光敏电阻
数字传感器
内部集成了ADC和逻辑电路,直接输出一串0和1。你通过通信协议去读它,拿回来的直接就是温度、湿度、气压这些数值。
特点:
- 抗干扰能力强,线长一点问题不大
- 直接出数值,省去换算麻烦
- 通常需要时钟线和数据线(或更多)
- 典型代表:BME280、SHT30、DS18B20
我个人习惯,能上数字传感器就上数字传感器。省心,稳定。除非你非要测那种极低成本、或者极高速变化的信号,才考虑模拟。
3.2 三种通信协议入门:I2C、SPI、UART
数字传感器怎么和单片机聊天?靠的就是通信协议。农业气象站里,最常用的就这三种。
I2C(Inter-Integrated Circuit)
两根线:SDA(数据线)和SCL(时钟线)。所有设备挂在这两根线上,每个设备有个唯一地址。
特点:
- 两根线可以挂多个设备(理论上127个)
- 速度一般,标准模式100kHz,快速模式400kHz
- 距离短,板级通信为主(1米以内)
- 需要上拉电阻(4.7kΩ左右)
你想想看,一个气象站里,温湿度、气压、光照,全挂在一根I2C总线上,多清爽。
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)
嗯,这里我要多说几句。很多新手拿到数据手册就头大,几十页甚至上百页,不知道从哪看起。
我教你一个「三看」法:
- 看第一页的Features和Description —— 这页告诉你这个芯片是干嘛的,精度多少,供电电压多少,接口是什么。看完这页,你就知道它适不适合你的项目。
- 看Pin Configuration(引脚定义) —— 每个引脚叫什么,接什么。这是你画原理图的依据。
- 看通信时序图(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.4 实战:选一个传感器
假设你要测农业大棚里的温湿度和气压。你会怎么选?
我的建议:
- 用BME280(I2C接口),一颗芯片搞定三个参数
- 供电3.3V,直接接STM32或ESP32
- I2C地址0x76(或0x77),挂到总线上
- 读数据时,先写寄存器地址0xFA(温度)、0xF7(气压)、0xFD(湿度),然后连续读6个字节
你看,数据手册里都有这些寄存器地址。你只要照着时序图写代码就行。
好了,这一讲就到这里。下一讲我们开始动手,把传感器焊到板子上,跑通第一个I2C通信。