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 土壤湿度传感器

土壤湿度传感器,说白了就是测土壤里的水分含量。温室里这东西很关键——浇多了烂根,浇少了蔫苗。

市面上常见的土壤湿度传感器有两种:电阻式电容式。我强烈建议你选电容式的。为什么?

电阻式 vs 电容式:
  • 电阻式:靠两根金属探针测土壤电阻。便宜,但容易电解腐蚀,用几个月就不准了。
  • 电容式:靠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 小结

传感器接口设计,说难不难,说简单也不简单。关键是要注意细节:上拉电阻选对值、去耦电容放对位置、电平匹配做对、线缆屏蔽到位。

这些经验,都是我一个个坑踩出来的。你照着做,能少走很多弯路。

下一章咱们聊聊执行器接口设计——继电器、电机驱动、加热器控制。那又是另一番天地了。