云计算百科
云计算领域专业知识百科平台

继电器模块——让 Arduino 控制 220V 电器

        前面我们学了舵机、超声波、红外遥控、OLED 显示屏、温湿度传感器,Arduino 已经能"动"、能"看"、能"遥控"、能"显示"、能"感知环境"了。但有一个领域我们一直没碰——控制强电。

        到目前为止,Arduino 只能控制 LED、蜂鸣器、舵机这些小功率元件。如果你想用它控制一盏台灯、一个风扇、一个加热器,该怎么办?

        今天这篇,我们要学习继电器模块——它是 Arduino 和 220V 电器之间的"桥梁",让 Arduino 能够安全地开关交流电器,实现智能家居的雏形。

        学完这篇,你会完成三个项目:

  • 基础控制:用 Arduino 控制继电器开关
  • 定时开关:实现定时自动开关灯
  • 综合项目:智能温控风扇:DHT11 检测温度,超过阈值自动开启风扇

️ 安全警告:本篇涉及 220V 交流电,操作不当有触电危险。请务必在断电状态下接线,通电后不要触摸裸露的导线和继电器端子。初学者建议在有人指导的情况下操作,或使用低压直流负载(如 12V 灯带)代替 220V 进行练习。


一、继电器是什么?

        继电器本质上是一个电子开关。它用一个小电流(Arduino 的 5V 信号)去控制一个大电流(220V 交流电)的通断。

工作原理

        继电器内部有一个电磁铁和一组触点:

  • Arduino 给继电器的线圈通电(小电流)
  • 电磁铁产生磁力,吸合触点
  • 触点闭合,大电流电路导通
  • Arduino 断开信号,电磁铁失磁,触点弹开,大电流电路断开
  •         简单说: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 继电器模块)
    继电器模块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 发出声音,播放旋律和警报音。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 继电器模块——让 Arduino 控制 220V 电器
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!