雨滴传感器
| 器材 | 数量 | 参考 |
|---|---|---|
| 雨滴传感器(感应板+比较模块) | 1 | — |
价格随渠道波动,以购买页实时为准。
阳台晾着衣服,人一出门就开始下雨——这是最经典的家庭痛点。要让板子替你盯着天,第一步是给它一个能"感觉到水"的器官:一块巴掌大的感应板,平摊在窗台或阳台栏杆上,雨一落上去,板子立刻知道,再触发一句提醒甚至直接收衣架。这块雨滴传感器干的就是这件事——把"板面有没有水"翻译成 ESP32 能读的电压和电平。
它是一套两件式的模块:一块裸露在外、布满交错铜箔走线的感应板,加一块带 LM393 比较器的信号处理模块。模块同时给两个输出脚:AO(模拟)随板面湿度连续变化,DO(数字)经板上电位器设定阈值后,输出"干/湿"两个电平。做"看湿到什么程度"用 AO,做"下没下雨"这种开关判断用 DO。本页两个都讲,重点把原理和那些埋着的坑说透。
工作原理
把感应板凑近看,会发现上面是两条互不相连、像梳子一样交错排布的导电铜箔走线。平时这两条走线之间隔着空气,是断开的,电阻极大(接近无穷大),可以理解成一个开着的开关。
雨滴或水膜落到板面,水把原本断开的两条走线连通了。水本身是导电的(溶了离子的水尤其如此),于是两走线之间的电阻从"无穷大"骤降到一个有限值——板面越湿、覆水面积越大,导通越充分,电阻越小。
后面那块比较模块负责把这个电阻变化读出来,给两路输出:
- AO(模拟输出):模块内部把感应板的电阻经过分压(原理见 分压)变成一个连续电压,板越湿电阻越小、这个电压也跟着变。AO 接到 ESP32 的 ADC 上 analogRead,就能读出"湿的程度"。多数模块是板越湿、AO 读数越低(干燥时是个高基线,沾水往下掉),但方向以实测为准。
- DO(数字输出):模块上的 LM393 比较器拿 AO 电压和电位器设定的阈值比一下,超过就翻转电平,输出一个干脆的高/低。这就是个"下雨/没下雨"的开关信号,用 digitalRead 一读就知道。模拟与数字的差别可参考 数字与模拟。
一句话:感应板是个"被水导通的开关 / 电阻",比较模块把它分别变成连续的 AO 和开关式的 DO 两种信号给你挑着用。
接线
感应板和模块之间用两根线连(板上常标 + / -,不分极性,对接即可)。模块再接到 ESP32。模块多数 3.3V/5V 都能供,接 ESP32 直接用 3.3V 即可,不用电平转换。
| 接法 | 连接 | 说明 |
|---|---|---|
| 感应板 → 模块 | 两根线对接模块的两个接线柱 | 不分极性 |
| 模块 VCC | ESP32 3.3V | 供电 |
| 模块 GND | ESP32 GND | 共地 |
| 模块 AO | GPIO34 | 模拟输出,接 ADC1 引脚 |
| 模块 DO | GPIO27(任意 GPIO) | 数字输出,超阈值翻转 |
ESP32 的 ADC2 在 WiFi 开启时不可用,做联网项目时 AO 一定接 ADC1(GPIO32~39 这组),GPIO34 是常用选择,且它是只输入引脚,正好拿来读传感器。DO 接哪个普通 GPIO 都行。
完整代码
下面同时读 AO(看湿度程度)和 DO(看下没下雨),串口打印对照。注意 AO 方向:本例按"板越湿读数越低"写,方向反了把判断号调过来即可。
const int PIN_AO = 34; // 模拟输出,接 GPIO34(ADC1)
const int PIN_DO = 27; // 数字输出,接 GPIO27
void setup() {
Serial.begin(115200);
pinMode(PIN_DO, INPUT);
// ESP32 ADC 默认量程偏小,加大衰减让 0~3.3V 都读得到
analogSetPinAttenuation(PIN_AO, ADC_11db);
}
void loop() {
int raw = analogRead(PIN_AO); // 0~4095,干燥时是高基线,沾水往下掉
int wet = digitalRead(PIN_DO); // 多数模块:下雨时拉低 → LOW 表示湿
Serial.print("AO="); Serial.print(raw);
Serial.print(" 状态=");
// DO 为 LOW 判为下雨;若你的模块相反,把 == LOW 改成 == HIGH
Serial.println(wet == LOW ? "下雨/湿" : "干燥");
delay(500);
}
analogSetPinAttenuation(..., ADC_11db) 这句不能漏。ESP32 ADC 默认衰减下满量程只到约 1.1V,传感器输出可能到 2~3V,不加衰减会发现 AO 早早顶到 4095 一动不动。加上 11db 衰减,0~3.3V 才都落进可测范围。
你应该看到什么
烧录后打开串口监视器(115200),做几个动作对照:
- 板面干燥:AO 是一个偏高的基线(比如 3000 以上),状态显示"干燥"。
- 手指蘸点水、滴一两滴到板面:AO 明显往下掉(比如掉到 1500 上下),覆水越多掉得越狠;DO 在跨过阈值的瞬间翻转,状态变成"下雨/湿"。
- 擦干板面:AO 慢慢回升到基线,DO 翻回"干燥"。
只要滴水时 AO 朝一个方向明显变化、DO 能干脆翻转,传感器和接线就没问题。纹丝不动就往下看故障排查。
读数解读 / 阈值
AO 给的是相对值:干燥时一个基线,板面变湿时数值往一个方向走(多数模块是越湿越低)。不同模块、不同水质、覆水多少,具体数字都不一样,别照搬别人的值,自己滴水测一遍看朝哪个方向变、变多少,心里有数即可。
DO 的"干/湿"分界由模块上那个蓝色电位器决定:
- 用小螺丝刀拧电位器,能改变比较器的触发阈值——拧一个方向更灵敏(沾一点水就报湿),拧另一个方向更迟钝(要湿到一定程度才报)。
- 调法:在干燥状态下慢慢拧到 DO 刚好处在"干燥"一侧(板上通常有个指示 LED,干燥时灭),再滴点水验证它能翻成"湿"。
- 想要连续的湿度信息就别纠结 DO,直接看 AO;DO 只适合做"过线就触发"的开关逻辑。
选型 / 避坑
这类传感器只能定性——告诉你"有没有水",给不了"下了多少毫米雨"这种定量数据。选型先想清楚要哪种信息:
- 只要知道下没下雨(开关判断)→ 这块雨滴传感器够用,最便宜直接。
- 要精确雨量(多少毫米)→ 用翻斗式雨量计,靠机械翻斗记雨水次数换算降雨量,雨滴传感器做不到。
- 要测土壤含水(浇花那类)→ 用土壤湿度传感器,那是插进土里的,和测板面雨水是两回事。
① 电解腐蚀,必须省电供电:感应板是裸露的金属走线,长期暴露在外又一直通电,沾水时就成了微型电解槽,金属会被电解氧化、长绿锈、读数飘——和电阻式土壤传感器一个毛病。做长期项目时让感应板平时断电(用一个 GPIO 给模块供电),要测时才上电几秒读一下,既省电又显著延寿。 ② 只能定性,给不了雨量:它只回答"有没有水",要降雨量去用翻斗式雨量计,别指望它测毫米数。 ③ 残留水膜 / 灰尘干扰:雨停后板面常留一层水膜或水珠,会让它继续报"湿"直到蒸发干;落灰、油污也会改变导通,定期擦干净,判断逻辑里留点延时别太敏感。
故障排查
| 现象 | 可能原因 | 怎么办 |
|---|---|---|
| AO 恒定不变 / 一直 4095 | 没设 ADC 衰减,或 AO 没接对脚 | 加 analogSetPinAttenuation(pin, ADC_11db),确认 AO 接到 GPIO34 等 ADC1 输入脚 |
| DO 永远不翻转 | 阈值电位器拧到极端,或感应板线没接好 | 重新拧电位器,确认感应板两根线接牢 |
| 滴水了状态方向反 | 该模块逻辑相反 | 把代码里 wet == LOW 改成 == HIGH |
| 雨停很久还报"湿" | 板面残留水膜未干 | 属正常,加判断延时;或把板面装成稍倾斜让水流走 |
| 用一段时间读数越来越飘 | 感应板被电解腐蚀 | 改成测时才上电的省电供电;锈重了换感应板 |
| WiFi 开启后 AO 乱跳 | AO 接到了 ADC2 引脚 | 改接 ADC1(GPIO32~39) |
进阶 / 变体
把"下没下雨"接上执行器,就从"监测"变成"自动收衣架"。最直接的做法:DO 报湿时,用一个 继电器 控制电机或舵机把晾衣杆收回屋檐下;也可以接舵机带动一扇小窗关上,或接蜂鸣器响一声提醒人。
const int PIN_BUZZER = 25;
bool alerted = false;
void rainAlert() {
bool raining = (digitalRead(PIN_DO) == LOW);
if (raining && !alerted) {
digitalWrite(PIN_BUZZER, HIGH); // 下雨了,响一下提醒收衣服
delay(800);
digitalWrite(PIN_BUZZER, LOW);
alerted = true; // 已提醒,别一直响
}
if (!raining) alerted = false; // 雨停复位,下次再响
}
想更聪明,可以把 AO 湿度曲线和 DO 事件传上云端,结合天气预报做更稳的判断——比如连续几次读数都越过阈值才确认"真在下雨",避免一滴露水就误触发。这就进入了 传感器 + AI 的玩法。
典型应用
- 自动收衣架 / 关窗提醒:DO 报雨触发电机收衣或推送提醒,出门也不怕衣服淋湿。
- 智能花园:检测到下雨就暂停浇水程序,省水也省得淹根。
- 车窗雨感:检测玻璃上有没有雨水,配合做雨刮或自动升窗的逻辑原型。
- 气象小站:和温湿度、气压传感器一起,记录"是否降雨"这一项基础天气数据。
小结 · 相关
雨滴传感器把"板面有没有水"变成可读信号:感应板上交错的铜箔走线被水导通使电阻骤降,比较模块给出连续的 AO 和开关式的 DO 两路输出。记住三件事就够用:AO 接 ADC1 并设好衰减、DO 阈值靠电位器调、感应板要省电供电防电解腐蚀。再清楚它只能定性——要雨量去用翻斗式雨量计。把它和继电器、舵机、蜂鸣器串起来,自动收衣架和关窗提醒就成型了。
参数以 datasheet 为准;本页公开资料整理,接线与代码请结合实物验证。