风扇要照着你手上已经有的那组电源来挑,然后用三极管、驱动模块或继电器去开关它——绝对不要直接挂在 Arduino 的输出引脚上。一颗裸的 5 V 或 12 V 机箱风扇就是两条线,一通电就转。风扇模块完全是另一回事:一颗裸马达坐在一颗驱动芯片上,所以你的引脚只负责对芯片下令,马达的电流由芯片去扛。
直流散热风扇和「风扇模块」,到底差在哪里?
这颗 4010 机箱风扇是一个封好的无刷单元:黑色的 40 × 40 × 10 mm 框、一条红黑线、一个小小的白色两针插头。它只需要两条线,是因为其余的东西都住在轮毂里面——一颗驱动芯片,加一颗盯着转子、跟着转子按顺序切换线圈的霍尔传感器。它自己换相,而这也正是它出厂时转速就已经定死的原因:那两条线上没有任何控制输入,所以你对供电做的任何事,同时也做在了里面那颗驱动芯片身上。
L9110 风扇模块的做法正好反过来:一块印着「Fan Motor」的红色板子,上面的插座里坐着一颗八脚的 L9110 H 桥,一个支架下面装着一颗白色的小型有刷马达,还有一片红色螺旋桨,由你自己压到轴上去。那颗马达是裸的——有电刷和换向器,没有电子线路——所以芯片才是这件产品本身。四个标着 GND、VCC、INA 和 INB 的引脚把活交给你的板子:把其中一个 IN 拉高它就转,拉另一个它就反着转。
想把风吹进项目盒里?机箱风扇加一个开关。想要一颗程序能启动、能调速、能反转的风扇?模块。
实作范例的零件——温度触发的 5V 风扇,全程不用焊接
另外那几条路——按你的项目真正需要的来挑
这些是替代方案,不是上面那张清单的加购项。L9110 风扇模块是一体式的那条路:马达、螺旋桨和驱动全在一块板上。4010 的 12V 风扇,配上 USB 转 12V 的升压线和一条圆孔母座带线,就是 12V 那条路,母座那两个裸线头正好夹进继电器的螺丝端子。公对母杜邦线适合不用面包板的接法,而 IRF520 模块是给一颗裸风扇做真正 PWM 调速的 MOSFET 那条路。

为什么 5V 风扇不能直接挂在 Arduino 的输出引脚上?
Uno 兼容板上那颗 ATmega328P,对电压很大方,对电流很小气。它的数据手册把单个引脚的绝对极限写在 40 mA,但设计时要按 20 mA 来算,因为输出电压那几张表就只列到这里。超过之后,芯片不再保证一个被拉高的引脚还接近 5V:引脚的输出管子本身有电阻,你拉得越狠,它吃掉的电源就越多。引脚是先变软,不是先炸。
再看马达在通电那一瞬间要的是什么。转子还没动,所以它生不出反电动势去对抗电源,唯一限制电流的只剩绕组那点裸电阻。那一下涌流——每次叶片被卡住都会重来一次——是运行电流的好几倍,而运行电流本身,数量级上就已经不是 20 mA 该碰的东西了。一颗 40 mm 风扇就是一颗马达。比起一句经验法则,你更想要手上这颗风扇的实际数字的话,把万用表打到直流电流档串进去,趁它自由旋转时读一次;启动和堵转是这个数的好几倍,而引脚要扛的正是堵转那个数。
关于续流二极管的那套说法,在这两个零件里只对其中一个成立。有刷马达的绕组,或者继电器的线圈,是一个电感:把它的电流切断,塌下来的磁场会让线圈生出足以维持这股电流的任何电压——一个高过你电源、方向还相反的尖峰,而这正是击穿三极管的东西。在线圈两端并一颗二极管,就等于给了它一个无害的回路去消散掉,L9110 和继电器模块都在板上自带了。无刷风扇不属于这一类负载:它自己的驱动在内部就把这种切换吸收掉了。它照样不能碰引脚——为的是电流,不是那个尖峰。
开关一颗风扇,老实说有哪三条路?
MOSFET 低边开关是最便宜的一条路。三极管——MOSFET 或双极型——坐在风扇的负极线和地之间;引脚驱动它的栅极或基极,这只花掉负载电流的一小部分,而风扇的电流经三极管流到地,不再经过芯片。之所以叫低边,是因为开关坐在接地那一端,而这不是随便定的:N 沟道 MOSFET 要栅极比源极高出几伏才导通,在下面那一头源极就是地,所以一个 5V 的引脚够得着。把同一个零件搬到正极线上,源极就跟着电源浮起来,栅极得高过电源才开得了,你就掉进电荷泵或者 P 沟道器件的世界了。IRF520 模块就是这条路的成品版,它有一个失效模式被我们那篇 IRF520 指南拆开讲过:栅极从 5V 逻辑那边永远拿不到足够的电压来完全导通,于是风扇转起来又停掉。
L9110 风扇模块是唯一一条风扇和驱动一起到货的路。L9110 是单个 H 桥——一颗马达,不是两颗——每通道连续 800 mA,供电范围 2.5–12V,内建续流二极管,而且是两个控制脚而不是一个——反转就是从这里来的,我们那篇 L298N 指南演示过。
当风扇的电源和你的逻辑是两个不同的电压时,继电器才配得上位置。我们这块一路 5V 继电器模块用的是印着 10A 30VDC 的 SRD-05VDC-SL-C,它的线圈侧和触点侧不共用任何金属:IN 端子只是点亮你在红板上看得见的那颗光耦,模块自己的三极管从 DC+ 把线圈吸合,而这个线圈扳动的触点,是几片跟前面这些都不相连的金属簧片——这就是它们能去通一个对你板子一无所知的 12V 回路的原因;我们那篇继电器指南讲得更深。
| 路数 | 风扇的电流由谁扛 | 能不能调速 | 风扇电源可以跟逻辑不同吗 | 我们的零件 |
|---|---|---|---|---|
| 三极管 / MOSFET 低边开关 | 三极管,流到地 | 可以——真正的 PWM | 可以,只要把地接在一起 | IRF520 模块 |
| H 桥驱动模块 | L9110 芯片 | 可以,还能反转 | 只能在芯片的 2.5–12V 范围内 | L9110 风扇模块 |
| 继电器 | 机械触点 | 不行——只有开和关 | 可以,完全隔离 | 5V 继电器模块 |
一颗三极管在通过负载电流,用看的,不是用画的:
L9110 风扇模块要怎么接?
L9110 风扇模块只要四条线,别的都不要。GND 和 VCC 接你板子的地和 5V,而这一路 VCC 同时喂芯片的逻辑和它驱动的那颗马达——所以给模块供电的那个东西也得扛得住马达,跟风扇是同一条规矩:如果螺旋桨一启动板子就重启,就给模块自己一组电源,然后把地接在一起。INA 和 INB 接两个数字引脚,芯片是成对地读它们。
| INA | INB | 螺旋桨会怎样 |
|---|---|---|
| LOW | LOW | 停 |
| HIGH | LOW | 往一个方向转 |
| LOW | HIGH | 往另一个方向转 |
| HIGH | HIGH | 停——跟两个都 LOW 一样 |
两个输入同电平都会让马达停,而且停的方式是一样的:H 桥把马达的两个端子短接在一起,于是还在转的电枢对着自己的短路发电,变成刹车而不是滑行。调速也是从这同样两个脚来的——一个按住 LOW,对另一个下 analogWrite,绕组的电感会把这些脉冲平均成一股更小的稳定电流。在 Uno 上只有标着波浪号的那六个引脚(3、5、6、9、10 和 11)能出真正的 PWM;analogWrite 用在别的脚上,只会给你全开或者全关。
这块模块有一个要说清楚的限制:那片红色螺旋桨是你自己压到轴上去的压配件,做出来的结果是一块裸板上一片露在外面的桨叶。它能在工作台上吹动空气,也能听令反转,但它没法像方形机箱风扇那样拧进项目盒的侧壁。要给一个盒子散热,零件还是机箱风扇——模块是给一颗由你的程序说了算的风扇准备的。
为什么 PWM 会让便宜风扇嗡嗡响,或者干脆不转?
有刷马达吃 PWM 一点意见都没有。把它的供电切开,降低的是绕组上的平均电压,绕组自己的电感把脉冲抹平成一股稳稳的电流,马达就慢下来。你对 IN 脚下 analogWrite 的时候,L9110 模块干的就是这件事。
两条线的无刷机箱风扇会出状况,是因为切开它的供电,同时也把轮毂里那颗驱动芯片一起切开了。每一个关断期,那颗芯片的电源轨都会塌下来,它丢掉霍尔读数,也丢掉自己在换相顺序里的位置,然后在下一个脉冲上重新开始。低占空比的时候它永远拿不到一段够长的时间把转子带过来,于是线圈只是按 PWM 的节奏被踢了几下,风扇原地不动,用你的 PWM 频率嗡嗡叫。每一颗风扇都有一个占空比下限,低于它就不转。
踢启动才是能用的答案。先下满占空比几百毫秒,让转子动起来、让驱动拿到一段干净的时间去找到换相,然后再降到你要的那个占空比——一颗正在转的转子,需要的力矩远小于一颗停着的转子挣脱静止所需要的。把那个下限写死成你的程序允许下达的最小值:一颗被命令跑在 15%、却悄悄堵住不转的风扇,是一颗你以为它在散热的风扇。
模块上那颗有刷马达没有这些东西要对付:

该买 5V 那颗风扇,还是 12V 那颗?
4010 机箱风扇有 5V 和 12V 两个版本,该买的是你项目里已经有的那组电源的电压,不是你看上的那颗风扇。无刷风扇的驱动有一个欠压下限,低于它就换不了相,所以一颗 12V 风扇喂 5V 会抽搐、爬行,或者干脆什么都不做——而这不是故障。反过来那一边更糟:5V 的零件接 12V,不会跑得更快,它会烧。
用 USB 供电的话,4010 5V 风扇就是答案。手上有 12V 火牛,就拿 12V 风扇,板子还是走它自己的 5V;只有 USB 的话,上面那条升压线加圆孔母座带线就凑出一对 12V 的裸线头。插头尺寸和极性,是我们那篇直流电源指南的题目。
框体尺寸是另外一个决定。扫掠面积随直径的平方增长,而噪音随叶尖速度陡峭上升,所以更大的框体能更慢、更安静地送出同样的风量。孔位允许多大,就取多大。
| 框体 | 5V | 12V | 适合 |
|---|---|---|---|
| 40 × 40 × 10 mm | 4010 5V | 4010 12V | 小型项目盒、3D 打印机的电子仓、盖子很紧的机壳 |
| 60 × 60 × 10 mm | 6010 5V | 6010 12V | 比较大的机壳,多开那个孔不心疼、而且在意安静的场合 |
装风扇之前,有两条规矩值得先知道。轴流风扇从敞开的叶面把空气吸进来,从轮毂被支撑筋架着的那一面推出去——也就是贴标签的那一面——所以一颗装反了的风扇,会老老实实地把热风吹回盒子里。而一颗风扇在一个封死的盒子里什么也做不了:空气能出去多快,取决于它能进来多快,所以在另一头开第二个口,风扇在下就把这个口开高,让风扫过机壳的整个长度,而不是对着一堵关死的墙猛推。四个角孔是 ø4 mm,40 mm 框的孔距是 32 mm 见方,60 mm 框是 50 mm,依据 Sunon 的尺寸图——M3 螺丝穿过去还很宽裕,而这些就是风扇还没到货、你就可以先在面板上画好的数字。
温度触发的风扇要怎么做?
DHT11 传感器读空气温度,Uno 做判断,继电器模块切断风扇的红线。没有一处需要焊接:继电器的两个端子排都是螺丝夹,风扇那个白色插头正好吃公头杜邦针。继电器出现在这里不是为了它的隔离——传感器、板子和风扇全跑在同一组 5V——它在这里,是因为一个温控开关从头到尾只需要开或关,而螺丝端子继电器是唯一一条不用焊、也不用去算三极管尺寸就能走到的路。哪天你要的是风扇变安静而不是关掉,再换到 MOSFET 那条路。
有一个细节决定了整个布局:Uno 只有一个 5V 插孔,而这个项目需要三个地方有 5V——继电器的 DC+、传感器的 VCC,还有风扇。这就是那块迷你面包板的活。这块 SYB-170 没有电源轨,所以随便挑一条普通的五孔排当 5V,另一条当地;哪些孔是通的,我们那篇面包板指南讲过。开工前先数一遍线:5V 那排上要落四根(从 Uno 进来的、去继电器 DC+ 的、去传感器 VCC 的,还有接到继电器 COM 的),地那排也是四根,所以五个孔刚刚好,多出来一根线就没地方放了。
| 从 | 到 | 为什么 |
|---|---|---|
| Uno 的 5V | 面包板 A 排 | A 排成为共用的 5V 汇合点 |
| Uno 的 GND | 面包板 B 排 | B 排成为共用的地 |
| DHT11 的 VCC / GND / S | A 排 / B 排 / Uno 的 D2 | 三根折弯的针脚;S 是信号 |
| 继电器的 DC+ / DC− | A 排 / B 排 | 给线圈那一侧供电 |
| 继电器的 IN | Uno 的 D8 | 控制脚 |
| A 排(5V) | 继电器的 COM | 把电源送进触点 |
| 继电器的 NO | 风扇的红线 | 触点闭合 → 风扇拿到 5V |
| 风扇的黑线 | B 排(GND) | 把风扇的回路补齐 |
DHT11 装在哪里,决定了这个闭环乖不乖。它读的是它自己周围那一圈空气,不是你要冷却的那个零件,所以把它装在盒子里靠近发热处、并且避开风扇自己的风路:一颗坐在风里的传感器是第一个被吹凉的东西,几秒钟内就掉回下限之下,又立刻把风扇关掉。这种来回短周期,正是程序里那两度间隔存在的意义,而一颗位置放坏的传感器会跑赢它。DHT11 是一颗量到 50 °C 的环境空气传感器——它看的是盒子里的温度,不是拿来贴在稳压器或驱动芯片上的探头。
上电前有两项检查。继电器板下缘附近那颗跳线,选的是 IN 上的 HIGH 还是 LOW 让线圈吸合——把它设成 HIGH 吸合,或者把下面程序里 digitalWrite 的电平对调。无论哪一种,Uno 的引脚从通电那一刻起、一直到 setup() 跑起来之前都是输入、什么都不驱动,所以那一小段时间里继电器完全交给模块自己的上下拉去决定:接着风扇按一次复位看一看,让你现在就见到这个行为,而不是等盖子盖上以后才见到。还有,用 USB 时 Uno 的 5V 引脚是从主机接口经过板上那颗自恢复保险丝来的,所以风扇喝的是板子那口水:如果风扇一启动板子就重启,就给风扇自己一组电源,只把地接在一起。
手指和扎带离叶片远一点,整个项目留在低压直流里——这里没有任何一样东西该靠近市电线路。
// 温度触发的 5V 风扇:DHT11 -> Uno -> 继电器模块 -> 风扇。
// 继电器只有开和关,所以风扇不是全速转,就是完全不转。
#include <DHT.h>
const uint8_t DHT_PIN = 2; // DHT11 的 "S" 脚
const uint8_t RELAY_PIN = 8; // 继电器模块的 IN 螺丝端子
const float FAN_ON_C = 30.0; // 到了这个温度或更高就开风扇
const float FAN_OFF_C = 28.0; // 到了这个温度或更低就关风扇
// 两个数字之间那 2 degC 的间隔就是回差:没有它,一个在单一门槛
// 上下抖动的读数会让继电器一直跳。
DHT dht(DHT_PIN, DHT11);
bool fanRunning = false;
void setup() {
Serial.begin(9600);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // 释放:第一次读数之前风扇先关着
dht.begin();
}
void loop() {
float tempC = dht.readTemperature();
if (isnan(tempC)) { // 一次失败的读数不可以去动风扇
Serial.println(F("DHT11 read failed"));
delay(2000);
return;
}
if (!fanRunning && tempC >= FAN_ON_C) {
fanRunning = true;
} else if (fanRunning && tempC <= FAN_OFF_C) {
fanRunning = false;
}
digitalWrite(RELAY_PIN, fanRunning ? HIGH : LOW);
Serial.print(tempC, 1);
Serial.println(fanRunning ? F(" C fan ON") : F(" C fan OFF"));
delay(2000); // DHT11 两次读数之间大约需要 2 秒
}
它需要 IDE 的 Library Manager 里那个 DHT sensor library;想把读数放到屏幕上看,见我们那篇 DHT11 加 OLED 指南。

我们从真实客户身上看到的常见错误
把「才 5V 而已」当成「引脚接得起」。电压是风扇需要的东西;电流是它向开关它的那个东西索取的东西。一颗 5V 风扇接在 5V 引脚上,还是一颗马达挂在 20 mA 上。
指望机箱风扇能反转。把红线和黑线对调不会让它倒着转;里面那颗驱动认定了一个极性。反转是 H 桥的活。
指望继电器能调速。它的触点要么碰上,要么没碰上。想要风扇变安静而不是关掉,那是 MOSFET 或者模块那条路。
FAQ
小型 5V 直流风扇可以直接接到 Arduino 引脚上吗?
不行。ATmega328P 的引脚是按 20 mA 定规格的,绝对极限 40 mA,而马达的启动和堵转电流是运行电流的好几倍,运行电流本身在数量级上就已经不对了。中间要放一颗三极管、一块驱动模块,或者一个继电器。
为什么我用 analogWrite 的时候,5V 风扇只是嗡嗡响却不转?
因为切开供电的同时,也切开了风扇轮毂里面那颗驱动芯片。它在每一个关断期都会丢掉自己的换相状态,然后在每个脉冲上重新开始,所以低占空比时转子根本转不过来,你听到的就是 PWM 频率本身。先用满占空比踢它几百毫秒,再降到你要的转速。
直流散热风扇和风扇模块差在哪里?
散热风扇是一个封好的无刷单元,驱动在轮毂里面,外面出两条线;它只会转。风扇模块是一颗裸的有刷马达加一片螺旋桨,装在一块 L9110 H 桥板上,所以单片机可以启动它、停住它、调它的速度,还能让它反转。
无刷机箱风扇需要并一颗续流二极管吗?
不需要,而这正是那套常见说法会误导人的地方。续流二极管保护的,是你的开关不被一个裸线圈塌陷的磁场打穿——有刷马达或者继电器线圈。无刷风扇自己的驱动在内部就处理掉了。排除引脚这条路的是电流,不是那个尖峰。
12V 风扇可以用 5V 来跑吗?
跑不出什么名堂。无刷风扇里面那颗驱动有一个欠压下限,所以在 5V 上,一颗 12V 风扇会抽搐、爬行,或者干脆不动——那是风扇行为正常,不是零件坏了。买 5V 版本,或者用一条升压线加一条圆孔母座带线,把你的 5V 抬到 12V。反过来绝对不行:5V 风扇接 12V 不会转得更快,它会过热。
最后更新:2026 年 9 月。有问题?WhatsApp 联系我们。



Arduino Uno Compatible SMD UNO R3 with Type B Cable - ATMEGA328P with CH340G-Microcontroller Project
DC Cooling Fan 5V/12V Brushless Small Fan for 3D Printer DIY Projects Electronics Cooling - 4010 FAN (5V)
Relay Module 3.3V 5V 12V 1/2/4/8 Ways Optocoupler Trigger Relay Module 1 2 4 8 Channel Relay Module - 5V RELAY MODULE(1WAY)
DHT 11 DHT 22 Temperature and Humidity Sensor DHT22 High Sensitivity Sensor DHT11 For Aduino IOT - DHT11 SENSOR
MB102 Breadboard 170 400 830 Holes Breadboard Donut Board Arduino Prototype Multi Color - MINI BREADBOARD 170 HOLES (WHITE)
40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-M 20CM
DIY Fan Module DC Small Motor Fan for Fire Fighting Project L9110
DC Cooling Fan 5V/12V Brushless Small Fan for 3D Printer DIY Projects Electronics Cooling - 4010 FAN (12V)
USB To 9V DC Jack Cable 5.5 x 2.1 mm 5V 9V DC Power USB Cable Connector Jack - USB TO 12V DC JACK
5.5x2.1mm DC Power Male Connector Plug Jack Adapter for Arduino DIY Electronics Projects - 5.5x2.1 DC CONNECTOR (F)
40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-F 20CM
IRF520 MOSFET Driver Module PWM Output Power Control for Arduino Raspberry Pi DC Motor Control