4、传感器接口设计:温湿度传感器(DHT22/SHT30)、土壤湿度传感器、光照传感器(BH1750)电路
传感器接口设计,说白了就是让MCU能跟传感器“说上话”。
我刚开始做温室项目时,总觉得传感器选好了,电路随便接一下就能跑。结果呢?数据跳得像心电图,有的干脆不工作。后来才明白——接口电路里的门道,远比数据手册上写的多。
今天咱们就一个一个来拆解。我会把每个传感器的典型电路、注意事项、还有我踩过的坑,都摊开来讲。
4.1 温湿度传感器:DHT22 vs SHT30
温湿度传感器是温室控制的基础。没有它,你连环境基准都没有。
市面上常见的就两种:DHT22和SHT30。我个人的习惯是:预算够就上SHT30,想省成本就用DHT22。但两者的电路设计思路完全不同。
4.1.1 DHT22 电路设计
DHT22是单总线协议,说白了就是一根数据线既当输入又当输出。这种设计对时序要求很苛刻。
先看典型电路:
DHT22 引脚连接:
Pin 1 (VDD) → 3.3V
Pin 2 (DATA) → MCU GPIO (如 PB5)
Pin 3 (NC) → 悬空
Pin 4 (GND) → GND
外部元件:
R1 (上拉电阻) → 4.7kΩ,连接 DATA 到 VDD
C1 (去耦电容) → 100nF,靠近 VDD 引脚放置
这里有个关键点:上拉电阻不能省。DHT22的数据线在空闲时是高电平,靠的就是这个上拉电阻。
有一次我用了10kΩ的上拉电阻,结果通信时好时坏。后来查了数据手册才发现,DHT22推荐的是4.7kΩ。电阻太大,信号上升沿变缓,MCU采样就容易出错。嗯,从那以后我再也不敢随便换电阻值了。
另外,DHT22对电源纹波比较敏感。我建议在VDD和GND之间加一个100nF的陶瓷电容,而且要尽量靠近传感器引脚放置。走线长了,电容的效果就打折扣了。
4.1.2 SHT30 电路设计
SHT30用的是I2C接口。相比DHT22的单总线,I2C要稳定得多。你想想看,有专用的时钟线SCL和数据线SDA,时序控制自然更可靠。
SHT30 引脚连接(默认I2C地址 0x44):
Pin 1 (VDD) → 3.3V
Pin 2 (GND) → GND
Pin 3 (SCL) → MCU SCL (如 PB6)
Pin 4 (SDA) → MCU SDA (如 PB7)
Pin 5 (ADDR) → GND (地址选择,接地为0x44)
Pin 6 (RST) → 悬空或接3.3V (内部上拉)
外部元件:
R2, R3 (上拉电阻) → 10kΩ,分别连接 SCL 和 SDA 到 VDD
C2 (去耦电容) → 100nF,靠近 VDD 引脚
SHT30的I2C地址可以通过ADDR引脚配置。接地是0x44,接VDD是0x45。如果你在一条I2C总线上挂多个SHT30,这个功能就很有用了。
I2C总线的上拉电阻,我一般选4.7kΩ到10kΩ之间。总线长度短(10cm以内)用10kΩ,长了就换4.7kΩ。为什么?电阻越小,驱动能力越强,但功耗也越大。温室控制器通常走线不长,10kΩ够用了。
4.2 土壤湿度传感器
土壤湿度传感器,说白了就是测土壤里的水分含量。温室里这东西很关键——浇多了烂根,浇少了蔫苗。
市面上常见的土壤湿度传感器有两种:电阻式和电容式。我强烈建议你选电容式的。为什么?
- 电阻式:靠两根金属探针测土壤电阻。便宜,但容易电解腐蚀,用几个月就不准了。
- 电容式:靠PCB上的铜箔形成电容,土壤水分影响介电常数。寿命长,不易腐蚀。
我在项目中遇到过,电阻式传感器用了三个月,探针就锈得不成样子了。后来全换成电容式的,再没出过问题。
电容式土壤湿度传感器的典型电路如下:
电容式土壤湿度传感器(以常见模块为例):
模块引脚:
VCC → 3.3V 或 5V (看模块规格)
GND → GND
AO → MCU ADC 引脚 (如 PA0)
DO → 可选,数字阈值输出
外部电路:
C3 (滤波电容) → 100nF,靠近 VCC 引脚
R4 (分压电阻) → 可选,如果 ADC 输入电压范围不匹配
这里要注意的是ADC采样。土壤湿度传感器的输出是模拟电压,需要MCU的ADC来读取。我一般用12位ADC,分辨率够用。
我曾经遇到过一个问题:传感器输出的电压在0-3.3V之间,但MCU的ADC参考电压是3.3V,按理说没问题。可实际读数总是偏低。后来发现是传感器输出阻抗太高,MCU的ADC输入阻抗不够大,导致电压被拉低了。解决办法很简单——加一个电压跟随器(运放),或者选输入阻抗高的ADC引脚。
另外,土壤湿度传感器不要长时间通电。我建议用MCU的GPIO控制传感器的VCC,需要测量时才供电。这样既能省电,又能延长传感器寿命。
// 伪代码示例:控制传感器供电
#define SOIL_SENSOR_POWER_PIN PB1
void read_soil_moisture() {
// 先供电,等待稳定
GPIO_SetPin(SOIL_SENSOR_POWER_PIN, HIGH);
delay_ms(100); // 等待100ms让传感器稳定
// 读取ADC值
uint16_t adc_value = ADC_Read(PA0);
// 断电
GPIO_SetPin(SOIL_SENSOR_POWER_PIN, LOW);
// 处理数据...
}
4.3 光照传感器:BH1750
光照强度对温室作物来说,跟温湿度一样重要。BH1750是数字光照传感器,用I2C接口,直接输出勒克斯(lux)值,不用你自己算。
BH1750的电路设计其实很简单:
BH1750 引脚连接(默认I2C地址 0x23):
Pin 1 (VCC) → 3.3V
Pin 2 (GND) → GND
Pin 3 (SCL) → MCU SCL (如 PB6)
Pin 4 (SDA) → MCU SDA (如 PB7)
Pin 5 (ADDR) → GND (地址选择,接地为0x23)
Pin 6 (DVI) → 3.3V (数字输入接口,通常接VCC)
外部元件:
R5, R6 (上拉电阻) → 10kΩ,分别连接 SCL 和 SDA 到 VCC
C4 (去耦电容) → 100nF,靠近 VCC 引脚
BH1750的ADDR引脚跟SHT30类似,也是用来配置I2C地址的。接地是0x23,接VCC是0x5C。如果你同时用了SHT30和BH1750,注意地址不要冲突。
BH1750有个很贴心的设计——它内部有ADC和光电转换电路,你只需要通过I2C读寄存器就行了。不像一些模拟光照传感器,还得自己搭运放电路。我最早用光敏电阻,那叫一个折腾,后来换成BH1750,世界清净了。
BH1750的测量模式有几种:
| 模式 | 分辨率 | 测量时间 | 适用场景 |
|---|---|---|---|
| 高分辨率模式 | 1 lux | 120ms | 室内、弱光环境 |
| 高分辨率模式2 | 0.5 lux | 120ms | 极弱光环境 |
| 低分辨率模式 | 4 lux | 16ms | 强光、快速测量 |
| 连续测量模式 | 可配置 | 持续 | 实时监控 |
温室里我一般用高分辨率连续测量模式。1 lux的分辨率足够用了,而且连续测量不用每次发启动命令,省事。
4.4 传感器接口的共性问题
讲完单个传感器,咱们聊聊共性问题。这些是我在实际项目中总结出来的,你记一下。
4.4.1 电源去耦
每个传感器都要加去耦电容。这不是可选项,是必选项。我见过太多人省了这个电容,结果传感器读数飘忽不定。
去耦电容的放置原则:尽量靠近传感器电源引脚,走线越短越好。一般用100nF的陶瓷电容,如果空间允许,再加一个10μF的电解电容做低频滤波。
4.4.2 电平匹配
温室控制器常用3.3V的MCU,但有些传感器模块是5V供电的。这时候要注意电平匹配。
我个人的做法是:所有传感器都用3.3V供电。如果传感器必须用5V,那就在I2C或GPIO线上加电平转换电路。最简单的办法是用两个MOS管搭双向电平转换,或者直接用现成的电平转换模块。
4.4.3 线缆屏蔽
温室里环境复杂,电机、加热器、水泵都会产生电磁干扰。传感器线缆如果太长,建议用屏蔽线。
我曾经遇到过一个问题:温湿度数据在白天正常,一到晚上就乱跳。查了半天,发现是晚上加热器启动时产生的电磁干扰。后来把传感器线缆换成屏蔽线,问题就解决了。
4.4.4 防反接保护
这个说起来简单,但很多人会忽略。在传感器的电源输入端加一个二极管,防止电源接反烧坏传感器。
我一般用SS34肖特基二极管,正向压降小,不影响供电。
4.5 小结
传感器接口设计,说难不难,说简单也不简单。关键是要注意细节:上拉电阻选对值、去耦电容放对位置、电平匹配做对、线缆屏蔽到位。
这些经验,都是我一个个坑踩出来的。你照着做,能少走很多弯路。
下一章咱们聊聊执行器接口设计——继电器、电机驱动、加热器控制。那又是另一番天地了。