继电器模块接Arduino教程:隔离驱动与电器控制实操

想让Arduino去点个台灯、开个小水泵,很快就会撞上同一堵墙:板子引脚那几十毫安的输出,连个像样的负载都带不动。这时候就该继电器上场了。最近把两份英文教程前后啃了一遍,Random Nerd Tutorials的继电器模块指南,和How To Mechatronics那份用继电器控制高压电器的实操帖,把新手最容易卡住的几个点理成了这篇。

先把口径说清楚:这篇只写低压直流这一侧怎么接、怎么驱动,市电强电只讲安全注意事项,不劝任何人上手就去动插座里的线。接线、参数和例程代码都取自上面两份教程,代码原样搬运,一个字符没改。

Arduino与两路继电器模块

继电器就是一个电控开关

原理一点不玄:继电器里面是个电磁铁。给线圈通上电,铁芯吸合,带动触点接通或断开另一路电路。说白了,就是一个"用小电流指挥大电流"的闸刀,两边电路在物理上可以完全不挨着,这就是"隔离"二字的来处。

常见的蓝色方块模块,一个方块就是一路。教程里用的这款是两路,5V供电,正好配Arduino;也有3.3V的版本,适合ESP32、ESP8266这类板子,买的时候看清线圈电压就行。触点容量也别忽视,How To Mechatronics用的那款HL-52S标称10A,交流250V和125V,直流30V和28V。数字看着挺富余,但那是端子螺丝压紧、散热正常的理想状态,真要带电机这类感性负载,还得再往下留余量。

负载侧的端子每路一组共三个:COM是公共端,NC是常闭,NO是常开。NC默认导通,给信号才断开;NO默认断开,给信号才接通。偶尔点个灯、开个泵这种"来信号才动作"的用法,用NO更合理,RNT指南也是这个建议。

两路继电器模块引脚图

对照引脚图看更直观:左边一列蓝色端子是NO、COM、NC,右边两排针脚是控制侧。下面那颗蓝色跳线帽后面单独说,它是整个模块里最有门道的东西。

JD-VCC跳线帽:隔离的门道全在这

控制侧有两排针。一排四针,是VCC、GND、IN1、IN2,负责给模块供电和接收控制信号;另一排三针,是GND、VCC、JD-VCC。JD-VCC这路专门给继电器的电磁铁线圈供电,和模块逻辑供电是分开的两条路。

出厂状态跳线帽插在VCC和JD-VCC之间,线圈直接吃Arduino的5V。How To Mechatronics的电路图把这层关系画得很直白:这种接法下,光耦虽然坐在那里,但两边电源是连通的,谈不上真正的隔离;万一继电器侧出问题,单片机有可能跟着遭殃。

HL-52S两路继电器模块实物

想要真隔离,就把跳线帽拔掉,给JD-VCC和GND单独接一路5V电源,教程里用的是个5V适配器,正极进JD-VCC,负极回到三针那一排的GND。这样Arduino和继电器之间只剩光耦里的LED在"隔空喊话",靠光信号触发,物理连接彻底断开。光耦隔离的好处就在这:光传信息不传电流,线圈那边哪怕有干扰甚至损坏,也烧不到单片机的引脚上。

继电器模块隔离供电电路图

照着这两份教程,新手最容易卡的就是这里:很多人以为跳线帽是个装饰件,随手一插完事。实际上它决定"隔离"这两个字到底成不成立。单路驱动小负载、图省事,插着跳线帽问题不大;要驱动正经电器、长期跑,建议老老实实拔帽独立供电。

低压侧接线:记住是反逻辑

接线本身三根线的事,对应关系一张表看完:

模块引脚接到哪作用
VCCArduino 5V模块逻辑供电
GNDArduino GND共地
IN1数字脚(例程用D7或D8)控制第一路继电器
IN2不用就悬空控制第二路继电器
JD-VCC拔跳线后接独立5V线圈供电,实现隔离

重点来了:这个模块的输入是反逻辑。RNT指南写得很明确,输入端电压低于2V左右时继电器吸合——给LOW是开,给HIGH是关。原因在于,输入拉低时VCC才有电流流过光耦的LED,LED一亮,光耦触发继电器吸合;输入是HIGH时没有压差,LED不亮,继电器不动作。

反逻辑这事不记住,调试时会很懵:程序里写HIGH让灯亮,结果灯偏偏灭了,很多人第一反应是模块坏了,其实是自己站在正逻辑的直觉里没出来。两份教程都专门花段落讲这一点,可见栽过的人不少。搞清楚机制之后,你甚至可以把代码里的高低电平反过来写,逻辑一样跑得通,只是读代码的人得知道这份"反着来"的约定。

这也是为什么后面例程的setup()里都先来一句digitalWrite(relay, HIGH):上电默认写高,保证继电器初始是断开的,不会一上电就误吸合。这个小习惯值得抄走。

两个上手例程:从三秒开关到PIR感应灯

例程一:三秒一开关的最小程序

先来最简单的验证程序,出自How To Mechatronics的教程:用D7控制IN1,每三秒切换一次状态,专门用来听响、看灯,确认低压侧驱动没问题。

int in1 = 7;

void setup() {
  pinMode(in1, OUTPUT);
  digitalWrite(in1, HIGH);
}

void loop() {
  digitalWrite(in1, LOW);
  delay(3000);
  digitalWrite(in1, HIGH);
  delay(3000);
}

烧进去之后,每三秒能听到一声"咔嗒",模块上的指示灯跟着切换,就说明驱动这一侧已经通了。为什么要先跑这种空载程序?把变量拆开:程序和低压驱动先验证完,负载侧才有资格接上去。真出了问题,你至少知道该往哪一头查。再带一句RNT原文的忠告:别在继电器接着负载的时候烧录程序,先断开再操作。

例程二:PIR感应灯,人来亮十秒

第二个例程来自RNT,是个实用的小组合:PIR人体感应模块接D2,用中断方式触发;继电器的IN1接D8,灯用NO配置接在负载侧。检测到有人,灯亮十秒,人走后自动熄灭。

PIR感应灯接线原理图

代码原样搬运,可以直接抄进Arduino IDE:

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com  
*********/

// Relay pin is controlled with D8. The active wire is connected to Normally Closed and common
int relay = 8;
volatile byte relayState = LOW;

// PIR Motion Sensor is connected to D2.
int PIRInterrupt = 2;

// Timer Variables
long lastDebounceTime = 0;  
long debounceDelay = 10000;

void setup() {
  // Pin for relay module set as output
  pinMode(relay, OUTPUT);
  digitalWrite(relay, HIGH);
  // PIR motion sensor set as an input
  pinMode(PIRInterrupt, INPUT);
  // Triggers detectMotion function on rising mode to turn the relay on, if the condition is met
  attachInterrupt(digitalPinToInterrupt(PIRInterrupt), detectMotion, RISING);
  // Serial communication for debugging purposes
  Serial.begin(9600);
}

void loop() {
  // If 10 seconds have passed, the relay is turned off
  if((millis() - lastDebounceTime) > debounceDelay && relayState == HIGH){
    digitalWrite(relay, HIGH);
    relayState = LOW;
    Serial.println("OFF");
  }
  delay(50);
}

void detectMotion() {
  Serial.println("Motion");
  if(relayState == LOW){
    digitalWrite(relay, LOW);
  }
  relayState = HIGH;  
  Serial.println("ON");
  lastDebounceTime = millis();
}

逻辑不复杂:detectMotion()是中断回调,PIR来信号就把继电器拉低吸合,同时用millis()记下时间戳;loop()里发现距上次触发超过10000毫秒,就把继电器拉高断开。想亮更久,改debounceDelay这一个数就行。用中断而不是在loop里轮询PIR,好处是人在灯亮的期间程序还能干别的活,不会因为delay卡住漏掉下一次触发。

继电器PIR感应灯演示效果

实物就是照片里这套:Arduino UNO加面包板,PIR探头朝外,继电器模块控制那盏灯。人一走近灯亮,十秒没动静就灭,当成楼道灯的逻辑原型正合适。两份教程的例程到这里就算跑通了整条链路:引脚输出、光耦隔离、触点开关、负载动作,一环不少。

市电侧安全注意,一条都别省

两份教程讲到强电时口吻都非常重,这里把要点合在一起,一条一条过:

  • 不确定自己在干什么,就别碰市电侧。RNT原话是"如果不是百分百确定,别动任何东西,去找懂的人"。
  • 上电前把继电器端子上的螺丝逐个拧紧,虚接会发热打火。
  • 改插头线缆时,黄绿双色线是地线,绝不能当火线或零线接,How To Mechatronics在文里专门标了这一点。
  • 线路先用万用表通断挡验证,或者先接低压小灯把逻辑跑通,再考虑下一步。
  • 任何状态下都不要带电触碰市电侧的线头和端子。

最后划一下重点。继电器做的是开关量隔离驱动:引脚给个HIGH或LOW,负载侧通或断,就这么干净。它和L298N那类电机驱动不是一回事——后者管连续调压调速,继电器只管通断。所以自动浇花、感应灯、远程控制水泵这类"开或关"的需求,继电器模块依然是最省心也最便宜的答案。低压侧玩明白了,市电那一步什么时候迈、要不要迈,主动权在自己手里。


作者:隔壁老王的教程
链接:https://www.aiddithome.com/p/f2fc5cb913ba1.html
本作版权归作者所有,未经允许请勿转载。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
5条评论
好说好说
1楼 · 11分钟前

黄绿地线不能当火线零线用这条必须顶,见过有人为了省一根线这么干,吓人。

胶佬憨憨
2楼 · 11分钟前

求一篇拔帽之后独立供电怎么选电源的展开,手头只有手机充电头,5V1A够不够带动线圈这种。

入门没多久的新手
3楼 · 11分钟前

咔嗒声才是灵魂,没听到响就先别碰负载侧,这个排查思路太对了。

第三次终于亮了
4楼 · 12分钟前

反逻辑那个坑真实,第一次玩继电器写HIGH以为会吸合,结果一上电全反着来,查了半天才明白是拉低触发。

电烙铁爱好者
5楼 · 12分钟前

那颗JD-VCC跳线帽我当年也栽过,两路继电器插着帽接ESP32,隔三差五莫名重启,后来照着电路图把帽一拔、单独给一路5V,立马安生。这篇文章把光耦隔离讲得比原教程还直白,光传信号不传电这句记住就值了。