前面我们学了舵机、超声波、红外遥控、OLED 显示屏、温湿度传感器,Arduino 已经能"动"、能"看"、能"遥控"、能"显示"、能"感知环境"了。但有一个领域我们一直没碰——控制强电。
到目前为止,Arduino 只能控制 LED、蜂鸣器、舵机这些小功率元件。如果你想用它控制一盏台灯、一个风扇、一个加热器,该怎么办?
今天这篇,我们要学习继电器模块——它是 Arduino 和 220V 电器之间的"桥梁",让 Arduino 能够安全地开关交流电器,实现智能家居的雏形。
学完这篇,你会完成三个项目:
- 基础控制:用 Arduino 控制继电器开关
- 定时开关:实现定时自动开关灯
- 综合项目:智能温控风扇:DHT11 检测温度,超过阈值自动开启风扇
️ 安全警告:本篇涉及 220V 交流电,操作不当有触电危险。请务必在断电状态下接线,通电后不要触摸裸露的导线和继电器端子。初学者建议在有人指导的情况下操作,或使用低压直流负载(如 12V 灯带)代替 220V 进行练习。
一、继电器是什么?
继电器本质上是一个电子开关。它用一个小电流(Arduino 的 5V 信号)去控制一个大电流(220V 交流电)的通断。
工作原理
继电器内部有一个电磁铁和一组触点:
简单说:Arduino 的 5V 信号 → 控制电磁铁 → 电磁铁控制 220V 电路的通断。
继电器的关键参数
| 控制电压 | 5V(Arduino 可直接驱动) |
| 触点额定电流 | 通常 10A |
| 触点额定电压 | 250V AC / 30V DC |
| 触点类型 | 常开(NO)、常闭(NC)、公共端(COM) |
常开与常闭
- 常开(NO):继电器未通电时,NO 和 COM 之间是断开的;通电后闭合
- 常闭(NC):继电器未通电时,NC 和 COM 之间是导通的;通电后断开
- 公共端(COM):公共端,和 NO 或 NC 配合使用
大多数情况下我们使用 COM + NO 组合——默认断开,Arduino 给信号后接通。
二、继电器模块
我们使用的是 5V 单路继电器模块,它已经集成了驱动电路,Arduino 可以直接控制。
模块引脚
| VCC | 5V | 模块供电 |
| GND | GND | 接地 |
| IN | D7 | 控制信号(HIGH 或 LOW 触发,取决于模块) |
模块上的输出端子
| COM | 公共端 |
| NO | 常开端 |
| NC | 常闭端 |
不同模块的触发方式可能不同:有的是 低电平触发(IN 接 LOW 时继电器吸合),有的是 高电平触发。购买前请确认,或查看模块上的标注。本篇以低电平触发为例。
三、硬件清单
| Arduino Uno | 1块 | 主控板 |
| 5V 继电器模块 | 1个 | 控制强电 |
| LED 或台灯 | 1个 | 被控负载(初学建议用 LED) |
| 杜邦线 | 若干 | 连接元件 |
| 220V 电源线和插座 | 1套 | 综合项目用(注意安全) |
四、电路接线
控制端接线(Arduino 继电器模块)
| VCC | 5V |
| GND | GND |
| IN | D7 |
负载端接线(继电器 负载)
安全练习版(推荐初学者):用 LED 代替 220V 负载
- COM → 接 LED 正极(长脚)
- NO → 接 5V(通过限流电阻)
- LED 负极 → 接 GND(通过限流电阻)
220V 实战版(注意安全!):控制台灯
- 将台灯的电源线剪断(或拆开插头)
- 其中一根线(火线)断开,两端分别接 COM 和 NO
- 另一根线(零线)保持连通
- 台灯插头插入 220V 插座
️ 再次强调:220V 接线必须在断电状态下操作!接线完成后仔细检查,确认无误后再通电。不要触摸裸露的金属部分。
五、实验一:基础控制
用 Arduino 控制继电器,每隔 2 秒开关一次。
#define RELAY_PIN 7
void setup() {
Serial.begin(9600);
pinMode(RELAY_PIN, OUTPUT);
// 初始状态:断开(低电平触发模块,HIGH 表示断开)
digitalWrite(RELAY_PIN, HIGH);
Serial.println("继电器控制测试");
}
void loop() {
// 闭合继电器(低电平触发)
digitalWrite(RELAY_PIN, LOW);
Serial.println("继电器 ON");
delay(2000);
// 断开继电器
digitalWrite(RELAY_PIN, HIGH);
Serial.println("继电器 OFF");
delay(2000);
}
代码解读
- digitalWrite(RELAY_PIN, LOW):低电平触发,继电器吸合,COM 和 NO 导通
- digitalWrite(RELAY_PIN, HIGH):高电平,继电器释放,COM 和 NO 断开
如果你的模块是高电平触发,把 LOW 和 HIGH 对调即可。
效果
- 每 2 秒,你会听到继电器"咔嗒"一声,模块上的指示灯亮起,负载通电
- 再过 2 秒,"咔嗒"一声,指示灯灭,负载断电
六、实验二:定时开关灯
让 Arduino 在每天的特定时间段自动开关灯(用 millis 模拟时间)。
#define RELAY_PIN 7
unsigned long lastCheck = 0;
bool isOn = false;
// 模拟时间(单位:秒,从 0 开始计数)
unsigned long simulatedTime = 0;
// 设定开关时间(秒)
const unsigned long turnOnTime = 10; // 第 10 秒开灯
const unsigned long turnOffTime = 20; // 第 20 秒关灯
void setup() {
Serial.begin(9600);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // 初始断开
Serial.println("定时开关灯测试");
Serial.print("将在第 ");
Serial.print(turnOnTime);
Serial.print(" 秒开灯,第 ");
Serial.print(turnOffTime);
Serial.println(" 秒关灯");
}
void loop() {
unsigned long currentMillis = millis();
// 每 1 秒更新一次
if (currentMillis – lastCheck >= 1000) {
lastCheck = currentMillis;
simulatedTime++;
Serial.print("当前时间: ");
Serial.print(simulatedTime);
Serial.println(" 秒");
// 到达开灯时间
if (simulatedTime == turnOnTime && !isOn) {
digitalWrite(RELAY_PIN, LOW);
isOn = true;
Serial.println(">>> 开灯!");
}
// 到达关灯时间
if (simulatedTime == turnOffTime && isOn) {
digitalWrite(RELAY_PIN, HIGH);
isOn = false;
Serial.println(">>> 关灯!");
}
// 循环重置(每 30 秒一轮)
if (simulatedTime >= 30) {
simulatedTime = 0;
digitalWrite(RELAY_PIN, HIGH);
isOn = false;
Serial.println("— 新一轮开始 —");
}
}
}
效果
- 每 30 秒为一个周期
- 第 10 秒自动开灯,第 20 秒自动关灯
- 串口实时打印当前时间和状态
这个逻辑可以扩展到真实的时间控制——配合 RTC 时钟模块,就能实现真正的定时开关。
七、综合项目:智能温控风扇
把 DHT11 温湿度传感器和继电器结合起来,做一个智能温控风扇——当温度超过设定阈值时,自动开启风扇;温度降下来后自动关闭。
硬件清单
| Arduino Uno | 1块 | 主控板 |
| DHT11 温湿度传感器 | 1个 | 检测温度 |
| 5V 继电器模块 | 1个 | 控制风扇 |
| 小风扇(5V USB 风扇或 12V 风扇) | 1个 | 被控负载 |
| OLED 显示屏 | 1个 | 显示状态 |
| 面包板 + 杜邦线 | 若干 | 搭建电路 |
接线
- DHT11:DATA → D2,VCC → 5V,GND → GND
- 继电器:IN → D7,VCC → 5V,GND → GND
- OLED:SCL → A5,SDA → A4,VCC → 5V,GND → GND
- 风扇:电源线断开,火线接 COM 和 NO(如果是 5V USB 风扇,可以用继电器控制 USB 线的正极)
代码
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
// OLED 参数
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
// DHT11 参数
#define DHTPIN 2
#define DHTTYPE DHT11
// 继电器引脚
#define RELAY_PIN 7
// 温度阈值
const float TEMP_THRESHOLD = 28.0; // 超过 28°C 开启风扇
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
DHT dht(DHTPIN, DHTTYPE);
bool fanOn = false;
void setup() {
Serial.begin(9600);
// 初始化 OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED 初始化失败!");
for (;;);
}
// 初始化 DHT11
dht.begin();
// 初始化继电器
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // 初始断开
// 开机画面
display.clearDisplay();
display.setTextSize(2);
display.setCursor(5, 10);
display.println("Smart Fan");
display.setTextSize(1);
display.setCursor(5, 40);
display.print("Threshold: ");
display.print(TEMP_THRESHOLD, 1);
display.print(" C");
display.display();
delay(2000);
}
void loop() {
delay(2000);
// 读取温湿度
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(10, 25);
display.println("Sensor Error!");
display.display();
return;
}
// 判断是否需要开关风扇
if (temperature >= TEMP_THRESHOLD && !fanOn) {
digitalWrite(RELAY_PIN, LOW); // 低电平触发,开启风扇
fanOn = true;
Serial.println(">>> 温度过高,开启风扇");
} else if (temperature < TEMP_THRESHOLD – 1.0 && fanOn) {
digitalWrite(RELAY_PIN, HIGH); // 高电平,关闭风扇
fanOn = false;
Serial.println(">>> 温度正常,关闭风扇");
}
// 注意:关闭阈值比开启阈值低 1°C,防止温度在阈值附近波动时频繁开关
// 更新 OLED 显示
display.clearDisplay();
// 标题栏
display.fillRect(0, 0, 128, 14, SSD1306_WHITE);
display.setTextSize(1);
display.setTextColor(SSD1306_BLACK);
display.setCursor(20, 3);
display.println("Smart Fan Control");
// 温度显示
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(5, 18);
display.println("Temperature:");
display.setTextSize(2);
display.setCursor(5, 28);
display.print(temperature, 1);
display.setTextSize(1);
display.print(" C");
// 湿度显示
display.setCursor(70, 18);
display.println("Humidity:");
display.setTextSize(2);
display.setCursor(70, 28);
display.print(humidity, 0);
display.setTextSize(1);
display.print(" %");
// 分隔线
display.drawLine(0, 44, 128, 44, SSD1306_WHITE);
// 风扇状态
display.setTextSize(1);
display.setCursor(5, 48);
display.print("Fan: ");
if (fanOn) {
display.setTextColor(SSD1306_WHITE);
display.fillRect(40, 47, 50, 12, SSD1306_WHITE);
display.setTextColor(SSD1306_BLACK);
display.setCursor(45, 48);
display.println("ON");
} else {
display.setTextColor(SSD1306_WHITE);
display.setCursor(40, 48);
display.println("OFF");
}
// 阈值信息
display.setCursor(5, 56);
display.print("Threshold: ");
display.print(TEMP_THRESHOLD, 1);
display.print(" C");
display.display();
// 串口输出
Serial.print("T: ");
Serial.print(temperature, 1);
Serial.print("C H: ");
Serial.print(humidity, 0);
Serial.print("% Fan: ");
Serial.println(fanOn ? "ON" : "OFF");
}
效果
- 开机:显示 "Smart Fan Control" 启动画面,显示温度阈值
- 主界面:
- 温度、湿度实时显示
- 风扇状态(ON/OFF)
- 当前阈值
- 自动控制:
- 温度 ≥ 28°C:自动开启风扇
- 温度 < 27°C:自动关闭风扇(回差 1°C,防止频繁开关)
这就是一个完整的智能温控风扇了——不需要人干预,温度高了自动开,温度降了自动关。
八、继电器使用注意事项
安全事项
- 断电接线:涉及 220V 时,务必在断电状态下接线
- 绝缘保护:接线完成后用绝缘胶带包裹裸露的金属部分
- 不要超负荷:继电器的额定电流通常为 10A,不要超过
- 远离水源:继电器和 220V 电路不要放在潮湿环境中
- 初学者建议:先用低压直流负载(如 12V 灯带、5V 风扇)练习,熟练后再操作 220V
编程注意事项
- 确认触发方式:低电平触发还是高电平触发,不同模块可能不同
- 初始状态:在 setup() 中设置继电器的初始状态,避免上电时意外吸合
- 回差设计:开关阈值设置回差(如开启 28°C,关闭 27°C),防止在阈值附近频繁开关
继电器"咔嗒"声
继电器吸合和释放时会发出"咔嗒"声,这是正常的机械动作。如果需要静音控制,可以考虑使用固态继电器(SSR),它没有机械触点,完全静音。
九、本篇小结
回顾一下今天学到的核心知识:
- 继电器原理:用小电流控制大电流的电子开关
- 常开与常闭:COM + NO(默认断开)和 COM + NC(默认导通)
- 低电平触发:大多数模块用 LOW 信号吸合继电器
- 基础控制:digitalWrite() 控制继电器开关
- 定时控制:用 millis() 实现定时开关
- 综合项目:DHT11 + 继电器 = 智能温控风扇,带 OLED 显示
- 回差设计:防止在阈值附近频繁开关
继电器让 Arduino 具备了控制强电的能力,是智能家居、自动化控制的基础。下一篇,我们学习蜂鸣器模块——让 Arduino 发出声音,播放旋律和警报音。
网硕互联帮助中心






评论前必须登录!
注册