3–5V 迷你潜水泵怎么选、怎么驱动:流量、扬程与三条开关路

Cartoon of a large cream-white cylindrical mini submersible water pump with an upright spout throwing a teal arc of water, standing in teal water with its black two-core lead showing red and black inner wires, with a red relay board, a red MOSFET module with a silver heatsink and a tiny black DRV8833 board with a loose header strip lined up smaller behind it

一颗 3–5V 的迷你潜水泵,在出水口与水面齐平时每小时能送 70–110 升水,运行电流 100–220 mA,而且绝对不能直接接到 Arduino 的引脚上。中间要放一个继电器、一块 MOSFET 模块或者一块电机驱动板,给它自己的一路 5V 电源,然后让它整颗泡在水里。

一颗 3–5V 迷你潜水泵,实际能给你什么?

这颗 5V 迷你潜水泵是一个封好的米白色小胶囊,大约 56 × 33 × 24 mm,出水嘴在顶上,进水缝在正面那一片,背后出一条黑色的两芯线。唯一要你自己准备的是水管:任何内径 6–7 mm 的软质鱼缸管或硅胶管,硬套到出水嘴上就撑住了。管子要短、要粗,因为管子每多一米、管径每细一点,被磨掉的流量跟抬高度磨掉的是同一回事。

规格 数值 对你的项目意味着什么
工作电压 3–6V DC 在 5V 电源上很舒服;3V 时转得慢、力气小
自由流量 70–110 L/hr 完全不抬高度时量出来的——见下文
运行电流 100–220 mA 是 Arduino 一个引脚设计值的五到十一倍
最大扬程(静扬程) 大约 40–110 cm 流量归零的那个高度
出水口 约 7 mm 的出水嘴 套 6–7 mm 内径的软管或鱼缸管,硬撑上去

自由流量这个数字会骗人,因为它是在出水口跟泵所站的那缸水齐平——一点高度都不抬——的条件下量的。把出水口抬起来,叶轮的压力就得拿去顶住一整柱水对抗重力:每高一厘米就吃掉一块,剩下的流量随着高度往下掉。到了最大静扬程,两边刚好打平,水停在管子里不动,流量就是零。

这个天花板因个体而异,落在 40 到 110 cm 之间,所以请照着低的那一端去规划。在两个端点之间——不抬高度时的满流量,和天花板处的零流量——一颗小型离心泵掉下去的曲线,已经接近直线到你可以直接按直线来算:算一下你的高度用掉了天花板的几分之几,流量就扣掉大约同样的比例。抬 20 cm,也就是桌上的一盆花对着地上的一个瓶子,等于保守估的 40 cm 天花板的一半,那就预计只剩自由流量的一半左右:接近 40 L/hr,也就是每分钟 0.7 升。一米高的架子已经越过这颗泵放弃的那条线了,而又长又细的水管同样会吃掉高度。

所以别信标称,自己量。把出水口放到你的项目真正需要的高度,让泵跑三十秒,水接进量杯里,再把接到的毫升数乘以 0.12——三十秒是一小时的一百二十分之一,所以这一道乘法就把你那杯水换算成了「在真正重要的那个高度上,每小时多少升」。下面那段程序会帮你计时。

如果这样还不够,要换的是泵,不是接法:这颗是循环泵,做吸程和高度都没用。R365 12V 隔膜泵是干放在水箱外面的,自吸大约 2 m,能推到大约 3 m 扬程,接口是 6 mm 的宝塔头——代价是一路 12V 电源,和两片要你自己焊线上去的插片端子。它在你的电路里也不像一块封好的模块,而是一颗真正的裸马达——有电刷、有露在外面的绕组,关断时有货真价实的感性反冲——所以它两端需要一颗续流二极管,需要继电器或者一块 L298N 去开关它,而本页上所有的电流数字,一个都搬不到它身上。

另外那几条路——按你的项目真正需要的来挑

ItemPriceQty
IRF520 MOSFET Driver Module PWM Output Power Control for Arduino Raspberry Pi DC Motor ControlIRF520 MOSFET Driver Module PWM Output Power Control for Arduino Raspberry Pi DC Motor ControlIR520AMRM4.95
DRV8833 Dual Motor Driver 2 DC Motors 1.5A Arduino Smart Car ProjectDRV8833 Dual Motor Driver 2 DC Motors 1.5A Arduino Smart Car ProjectDRV8833DRM4.20
40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-F 20CM40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-F 20CMDPWMF20RM3.20
R365 12 Water Pump Pnuematic  Diaphragm Water Pump Watering System MotorR365 12 Water Pump Pnuematic Diaphragm Water Pump Watering System Motor356PUMPRM10.95

这些是替代方案,不是上面那张清单的加购项。IRF520 MOSFET 模块是给 5V 逻辑用的 PWM 调速那条路。DRV8833 是 3.3V 逻辑最干净的一条路,也是你要同时驱动两颗泵时该拿的那块——它那排 12 针排针是散装的,所以这块板子用之前得先焊。公对母杜邦线配的是 IRF520 模块那种排针,不是继电器的螺丝端子。R365 12V 隔膜泵,是给那些真正需要吸程或高度的项目留的一个老实出口。

为什么迷你水泵永远不能挂在 Arduino 的输出引脚上?

Uno 兼容板上那颗 ATmega328P,对电压很大方,对电流很小气:它的数据手册把单个引脚的绝对极限写在 40 mA,并且要求你按 20 mA 去设计。这颗泵光是运行电流就已经是这个数的五到十一倍,而开机的那一下更糟:转子还没转起来,就产生不了反电动势去抵抗电源,此时限制电流的只剩绕组本身那点电阻。按马达类零件常用的「两到三倍运行电流」来估,头几十毫秒会冲到接近 0.7 A——比绝对极限高了一个数量级。

大家常挂在嘴上的另一个警告,感性反冲,在这里答案不一样。这颗泵的绕组并不长在你那两条线的末端:定子被环氧树脂灌封在胶囊干的那一半里,连着它自己的换相电路,隔着一堵实心塑料墙去转另一边那个带磁铁的叶轮转子。你的开关喂的是那块小电路板,不是一个裸线圈,而那块板子自己会吸收自己的开关尖峰。真正把引脚这条路排除掉的是电流——而换成 ESP32 也一样不行:乐鑫的数据手册给 GPIO 的规格,是驱动能力开到最大时拉源 40 mA、灌入 28 mA,而那是引脚推得动多少,不是你可以往上面挂多少。反冲在这里确实会咬人,但咬的是继电器的线圈,而那正是那块模块上早就装好的那颗二极管要干的活。

继电器、MOSFET 模块还是电机驱动板——你需要哪一个?

一路 5V 继电器模块是「只管开和关」那条路。它那两个蓝色的三位接线块都是螺丝端子——左边 NO/COM/NC,右边 DC+/DC−/IN——所以裸线头直接夹进去就行。线圈侧和触点侧不共用任何金属:IN 只负责点亮一颗光耦,光耦里那颗三极管从 DC+ 把线圈吸合,而这个线圈扳动的触点,跟前面这些完全不相连。板上的 L/H 跳线决定那颗 LED 是以 DC− 还是 DC+ 为参考,也就决定了 IN 上是高电平还是低电平让泵转起来。这颗光耦同时也是这块 5V 板子能直接吃 ESP32 的 3.3V 引脚、完全不用电平转换的原因,前提是跳线放在 L:放 L 时,LED 的阳极被接到模块自己的 5V,你的引脚只需要把另一头拉到接近零,LED 拿到的电流由那路 5V 和它的电阻决定,你的逻辑电平根本不进这道算式。放 H 时,同样这个 3.3V 引脚要去推一颗按 5V 选好的电阻,LED 有可能暗到没办法把三极管打开。不管放哪一边,DC+ 都要一路像样的 5V——ESP32 板子插着 USB 时的 5V 或 VIN 脚,不是它的 3.3V 稳压输出,因为继电器的线圈是 5V 线圈,而且要吃几十毫安。更深的接线,在我们那篇继电器模块指南里。

IRF520 MOSFET 模块是通往「调速而不只是开关」的最便宜那条路。三极管坐在泵的负极线和地之间,你的引脚只负责给它的栅极充电,这只花掉负载电流的极小一部分。要注意的是:IRF520 不是逻辑电平器件——Vishay 的数据手册给的栅极阈值是 2.0–4.0V,而导通电阻是按 10V 栅压标的。在 5V 加两百来毫安的条件下它导通得很轻松,所以这颗泵稳稳落在它做得好的那一档;但在 3.3V 下,一颗最坏情况的片子可能根本打不开,这一点我们那篇 IRF520 指南拆开讲过。

DRV8833 双路驱动板是 3.3V 那条干净的路。TI 的数据手册给它 2.7–10.8V 的电机供电范围、每通道 1.5 A RMS,以及 2.0V 的输入高电平门槛——睡眠脚是 2.5V——所以 ESP32 的 3.3V 引脚在这里是一个扎实的高电平,不是一个碰运气的高电平,而且限流的活由芯片内部去做。两个通道就是两颗泵;代价是那排散装的 12 针排针要自己焊。我们那篇 DRV8833 对比 L298N 指南把这两块放在一起讲过——L298N 是给 12V 泵用的,因为它的输出级会掉掉大约两伏,喂 5V 泵会把泵饿着。

开关器件 泵的电流由谁扛 能否调速 3.3V 逻辑 要不要焊
一路继电器模块 机械触点,完全隔离 不能——只有开和关 可以,跳线放 L 不用;螺丝端子
IRF520 MOSFET 模块 MOSFET,流向地 可以——PWM 勉强;栅极不是逻辑电平 不用;端子加排针
DRV8833 驱动板 驱动芯片,两个通道 可以——PWM,两颗泵 可以;2.0V 起就算高电平 要;排针散装

两条 PWM 路都有一个下限,而不是能一路平滑调到零,因为切开供电的同时,也切开了泵里面那块换相电路:大约低于三分之一到一半占空比时,转子根本转不过来,你听到的只是嗡嗡声。先用满占空比踢它几百毫秒,再降到你要的速度。在 Uno 上,就是在支持 PWM 的引脚——3、5、6、9、10 或 11——上写 analogWrite(pin, 255),维持两三百毫秒,然后 analogWrite(pin, 160),或者你自己那杯水量出来、转子还转得过来的那个值。

卡通对比图:两颗一模一样的米白色迷你潜水泵,各自泡在装着青色水的玻璃罐里——左边一条短短的透明软管把一股粗水流倒进装满的白色量杯,右边一条高高的软管里水柱停在半路不动,只有三滴水落进几乎空着的量杯
同一颗泵,两个高度。把出水口抬起来,叶轮的压力就从「推水走」变成了「把水柱顶住」;到了这颗泵的最大扬程,水停在管子里不动,什么都出不来。

为什么潜水泵必须一直泡在水里?

潜水在这里不是一个加分项,而是这颗泵唯一能工作的方式。转子转在一个普通的塑料滑动轴承里,靠被泵的水来润滑和降温,而灌封起来的定子也是把热量倒进同一缸水里。让它在空气里跑,这两件事同时停摆——轴承会咬死,热量无处可去,几分钟就能把泵送走。它也不自吸,因为离心叶轮在空气里转什么都送不动,所以它就该坐在水箱底部,让进水缝整片没在水下。

这也就把水位变成了你电路的一部分,而那正是我们那篇水位继电器控制器指南整篇在讲的事。

卡通剖面图:一颗米白色迷你潜水泵被一堵实心墙分成两半——右边干的那一侧是灌在灰色环氧树脂里的铜线圈和一颗小芯片,左边青色的水里是一圈浅色磁环和米白色叶轮,青色箭头穿过那堵墙、扫过进水缝再从出水嘴出去,整颗泵都在青色水线以下
它为什么必须泡在水里,以及为什么里面没有任何东西可以保养:线圈和它们的驱动被灌封在干的那一半,隔着一堵实心墙直接转动叶轮上的磁铁。叶轮推走的那些水,同时也是润滑它轴承、带走定子热量的那些水。

水泵怎么通过继电器接到 Arduino 上,电源又该怎么选?

让 Uno 继续走 USB,另外给泵配一颗自己的 5V 3A 火牛,经一条 5.5 × 2.1 mm 圆孔母座带线接出来。在这个接法里,两路电源从头到尾不碰面:继电器的触点就是一个用金属做的开关,所以泵那条回路从火牛出发、回到火牛结束,它的负极和 Uno 的地之间根本不存在任何一条线。这个「分开」,就是你买继电器买到的东西。两条 PWM 路正好相反,而这一步恰恰是大家会漏掉的——MOSFET 模块或 DRV8833 读你的引脚,读的是一个电压,而电压只有相对某个参考点量出来才有意义,所以在那两条路上,Arduino 的 GND 和泵电源的负极必须接在一起,否则输入端看到的是一个两边都不认同的电平,泵就会抽搐,或者干脆不启动。继电器的线圈可以吃 Uno 的 5V,因为线圈只是几十毫安;泵不行,原因就是那一下启动冲击。从主机的 USB 口到泵之间的每一段导体都有电阻——线材、板上的自恢复保险丝、杜邦线——将近一安培的电流流过零点几欧姆,就是从一条本来只有五伏的电源上吃掉零点几伏,于是板子就在泵启动的那一瞬间掉电重启——这跟我们那篇 SIM800L 电源指南讲的是同一套机制,只是换了个更能吃的负载。三安培不是为泵准备的,泵只要五分之一安;它是为了让那条电源几乎察觉不到开机冲击,也是为了以后项目里再加一颗泵或者一盏灯时,同一颗火牛还有余量。这颗火牛唯一不该做的事,是插进 Uno 的圆孔电源座:那条路会经过板上的稳压器,而稳压器需要的输入电压,比它输出的还要高出大约一伏。插头尺寸和「中心正极」这件事,在我们那篇圆头直流电源指南里。

为什么
Uno 5V 继电器 DC+ 给线圈侧供电
Uno GND 继电器 DC− 线圈回路
Uno D8 继电器 IN 控制脚
母座带线的红线(中心针) 继电器 COM 泵的供电送进触点
继电器 NO 泵的红色那根导线 触点闭合 → 泵拿到 5V
泵的黑色那根导线 母座带线的黑线 两个裸线头绞在一起,套热缩管或者焊起来——它闭合的是泵自己的回路,完全不会碰到 Uno

因为控制侧是螺丝端子,你要的线是公对公:一头插进 Uno 的排母,另一头压在螺丝下面。公对母是给模块排针用的——也就是 IRF520 那条路。在这一切通电之前,先把母座带线的极性定下来:红线是中心那根导体,而这颗火牛的中心针是正极,但那个注塑的插头上没有任何标记,所以拿万用表在插头上花十秒,才是让自己确定的老实做法。这一步要紧,是因为这颗泵的驱动电路被密封在泵体里面——一颗无刷泵接反了不会倒着转,它只是不转,而这不是一个你愿意让它带着电、慢慢去查为什么的状态。然后设定 L/H 跳线,第一次运行时用耳朵确认一下,因为线圈吸合会有一声清脆的「咔」,再让下面的 RELAY_ACTIVE_HIGH 跟它对上。Uno 的引脚在 setup() 跑起来之前都是悬空的输入,所以接好泵之后按一次复位,看看继电器怎么动:触发极性搞反的话,泵会在每一次上电、每一次复位、每一次上传程序的时候都开起来——在一个小水箱里,这就是桌上多一滩水、泵开始空转的由来。

整套东西请留在低压直流的范围里。继电器的触点上,那个蓝色方块上印着一个市电规格,但这里没有任何东西该靠近市电接线。这个项目确实有的那个危险很直白:桌上一罐敞开的水,后面就是一颗接着市电的火牛。把板子和火牛都放到离水箱远一点的地方,并且让泵的引线和火牛的电源线,都先低于各自的插座再往上接,这样顺着线流下来的水会从最低点滴掉,而不是顺着线钻进接插件里。

如果你想先看看这样一颗泵,怎么从两条裸线一路接到由板子来开关,这段视频讲的就是实际动手的部分:

// 3-5V 迷你潜水泵配一路继电器模块的台面测试。
// 把泵沉进水里,出水管放到你项目需要的高度,
// 从串口发任意一个字符,泵就正好跑 30 秒。
// 30 秒是一小时的一百二十分之一,所以:每小时升数 = 接到的毫升数 x 0.12。

const uint8_t RELAY_PIN = 8;          // 继电器模块的 IN 端子
const bool RELAY_ACTIVE_HIGH = true;  // L/H 跳线放在 L 的话,这里改成 false
const unsigned long RUN_MS = 30000UL; // 30 秒的计量运行

bool pumpRunning = false;
unsigned long startedAt = 0;

void setPump(bool on) {
  // 逻辑极性只在这一个地方决定,所以换跳线位置时只需要改这一处。
  digitalWrite(RELAY_PIN, (on == RELAY_ACTIVE_HIGH) ? HIGH : LOW);
  pumpRunning = on;
}

void setup() {
  Serial.begin(9600);
  setPump(false);              // 先把电平定在安全侧,此时引脚还是输入:在一块
  pinMode(RELAY_PIN, OUTPUT);  // 低电平有效的板子上,这一次写入会打开引脚的上拉,
  setPump(false);              // 于是 IN 在整个 pinMode 期间都被拉高,继电器就不会
                               // 在程序还在启动的时候吸合,把泵开起来。
  Serial.println(F("Pump under water? Send any character to run it for 30 s."));
}

void loop() {
  if (!pumpRunning && Serial.available()) {
    while (Serial.available()) {
      Serial.read();            // 顺手把行尾也读掉
    }
    startedAt = millis();
    setPump(true);
    Serial.println(F("Running..."));
  }

  if (pumpRunning && (millis() - startedAt >= RUN_MS)) {
    setPump(false);
    Serial.println(F("Stopped. Measure the millilitres you collected,"));
    Serial.println(F("then multiply by 0.12 for litres per hour at that height."));
  }
}

不用装任何库。真正会把这两个数字花出去的项目,是我们那篇自动浇花系统指南,和那篇迷你鱼菜共生系统

卡通图:搭好的台面测试装置——一块蓝色单片机板,一块红色继电器板,上面有一颗蓝色方块继电器和蓝色螺丝端子,由一颗黑色火牛经一条黑色圆孔母座带线供电,旁边一个装着青色水的玻璃罐里放着一颗米白色潜水泵,它的透明软管正把水倒进白色量杯
台面测试装好的样子:Uno 走 USB,泵走自己那颗 5V 火牛、经继电器的触点通断,两路电源被触点隔开,量杯在真正重要的那个高度接住三十秒的水。

我们从真实客户身上看到的常见错误

把「5V」读成「引脚可以直接带」。电压是泵需要的东西,电流是它向开关它的那个器件索取的东西。5V 的泵接在 5V 的引脚上,依然是一颗马达挂在 20 mA 上。

在空气里试泵,看它坏没坏。它会响几秒钟,听起来完全正常,而你已经花掉了它的一部分寿命。要试,就在一罐水里试。

照着自由流量那个数字买。那是零扬程下的数字。水要送多高,才决定了到底有没有流量真的送到。

让水箱见了底。几乎没有人是故意让这种泵空转的。他们只是写了一段定时浇水的程序,从一个第三天就会空掉的瓶子里抽水,然后泵就在空气里待完了剩下的一整个星期。如果程序看不见水,那就要么把每一次运行都限制在一个水箱肯定还供得起的水量上,要么给它一个浮球开关或者一根水位探头,让它能自己问。

明明是进水口的问题,却怪到泵头上。泥土、藻类和须根会糊在正面那一片进水缝上,而第一个症状是:泵听起来完全正常,出水却只剩一丝。把它拿出来,冲干净那些缝,然后让它站在一小块垫高的东西上,而不是泡在水箱底部的淤泥里。

FAQ

5V 水泵可以直接接到 Arduino 引脚上吗?

不行。它运行时要 100–220 mA,启动瞬间接近 0.7 A,而引脚是按 20 mA 设计的。中间要放一个继电器、一块 MOSFET 模块或者一块驱动板,并且让它走自己的电源。用 MOSFET 模块或驱动板时,要把它的地和板子的地接在一起;用继电器的触点则完全不需要共地。

迷你潜水泵能把水送多高?

静扬程大约在 40 到 110 cm 之间,因个体而异——而在那个高度上流量是零,不是「小一点」。请按低的那一端规划,然后拿量杯自己量一遍手上这颗。

迷你水泵可以用 PWM 调速吗?

可以,通过 MOSFET 模块或者 DRV8833,但没办法一路调到零。切开供电的同时也切开了泵自己那块换相电路,所以大约低于三分之一到一半占空比时,它只会嗡嗡响,不会转。

我的迷你水泵为什么跑了几分钟就不动了?

最常见的原因是它空转过。它的轴承靠所泵的水来润滑,灌封的定子也是把热倒进同一缸水里,所以在空气里这两件事几分钟内就会一起失效。它也不自吸。

小水泵该用继电器还是 MOSFET?

只需要开和关,或者泵的电源和逻辑是两个不同电压,就用继电器。要 PWM 调速,就用 MOSFET 模块或 DRV8833——3.3V 的板子选 DRV8833。

最后更新:2026 年 9 月。有问题?WhatsApp 联系我们

Leave a Reply

Your email address will not be published. Required fields are marked *