去年改造书房照明时,我厌倦了每次都要起身开关台灯的麻烦,于是用ESP8266+继电器搭建了一套可通过手机远程控制的LED灯系统。这个方案的核心价值在于:用不到50元的硬件成本,实现了传统灯具的智能化改造,而且完全自主可控,不依赖任何第三方云服务。
整套系统的工作流程非常直观:ESP8266作为主控芯片,通过GPIO引脚控制继电器模块的开关状态,继电器则直接管理LED灯的电源通断。所有控制指令都通过MQTT协议传输,这意味着你可以在任何有网络的地方用手机App控制灯光,甚至设置自动化规则(比如定时开关或联动其他传感器)。
ESP8266开发板:推荐使用NodeMCU或Wemos D1 mini,它们内置USB转串口芯片,开发调试更方便。我实测下来,Wemos D1 mini的尺寸更小巧(34.2mm x 25.6mm),适合空间受限的场景。
继电器模块:选择5V供电、带光耦隔离的单路继电器模块。注意查看继电器的负载能力——常见的SRD-05VDC-SL-C型号可支持10A/250VAC,驱动LED灯绰绰有余。
LED灯具:建议从现有台灯或吸顶灯改造入手,优先选择AC 220V供电的灯具(国内通用)。如果DIY经验不足,可以先从低压DC 12V的LED灯带开始尝试。
其他材料:杜邦线(公对公、公对母各若干)、micro USB数据线、可选配的电源适配器(如果不用电脑USB口供电)
警告:操作220V强电电路存在触电风险!务必断电操作,建议有电工基础或请专业人士协助
继电器模块的接线要点:
实测案例:我用的是欧普22W LED吸顶灯,将原有开关线路拆除后,火线接入继电器COM口,再从NO口引出线接灯具。这样改造后,既保留了原有墙面开关的功能(需保持常开),又能通过手机远程控制。
Arduino IDE设置:
http://arduino.esp8266.com/stable/package_esp8266com_index.json必备库安装:
arduino复制// 示例库包含语句
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
推荐以下三种方案:
bash复制sudo apt-get install mosquitto mosquitto-clients
我最终选择了阿里云IoT平台的MQTT服务,因为:
arduino复制const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* mqtt_server = "broker.emqx.io";
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
void reconnect() {
while (!client.connected()) {
if (client.connect("ESP8266Client")) {
client.subscribe("home/livingroom/light/cmd");
} else {
delay(5000);
}
}
}
arduino复制#define RELAY_PIN D1
void callback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i=0;i<length;i++) {
message += (char)payload[i];
}
if(message == "ON") {
digitalWrite(RELAY_PIN, HIGH);
client.publish("home/livingroom/light/status", "ON");
} else if(message == "OFF") {
digitalWrite(RELAY_PIN, LOW);
client.publish("home/livingroom/light/status", "OFF");
}
}
void setup() {
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
为方便后期维护,强烈建议添加OTA功能:
arduino复制#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
void setup() {
// ...其他初始化代码
ArduinoOTA.setHostname("esp8266-light-controller");
ArduinoOTA.begin();
}
void loop() {
ArduinoOTA.handle();
// ...主循环代码
}
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| MQTT Dash | 界面美观,支持图表 | 付费(约40元) | 重度用户 |
| IoT MQTT Panel | 完全免费 | 功能较基础 | 简单控制 |
| 自行开发(Flutter) | 完全自定义 | 需要编程能力 | 特定需求 |
我最终选择了MQTT Dash,配置步骤如下:
用Node-RED可以快速搭建控制面板:
javascript复制[{"id":"switch","type":"ui_switch","label":"客厅灯","group":"group1","order":1,"width":0,"height":0,"passthru":false,"topic":"home/livingroom/light/cmd","style":"","onvalue":"ON","ontext":"开","offvalue":"OFF","offtext":"关"}]
解决断电后状态丢失问题:
arduino复制#include <EEPROM.h>
#define EEPROM_SIZE 1
void saveState(bool state) {
EEPROM.begin(EEPROM_SIZE);
EEPROM.write(0, state);
EEPROM.commit();
}
bool loadState() {
EEPROM.begin(EEPROM_SIZE);
return EEPROM.read(0);
}
通过MQTT实现日出自动关灯:
arduino复制void checkSunrise() {
if(isSunrise() && digitalRead(RELAY_PIN) == HIGH) {
client.publish("home/livingroom/light/cmd", "OFF");
}
}
现象:继电器切换时发出"滋滋"声
解决方案:
优化策略:
arduino复制// 增加心跳间隔
client.setKeepAlive(60);
// 修改socket超时
client.setSocketTimeout(30);
实测有效的配置:
arduino复制WiFi.setSleepMode(WIFI_NONE_SLEEP); // 禁用睡眠
WiFi.setOutputPower(20.5); // 最大功率
arduino复制client.connect("clientId", "username", "password");
device/${clientId}/statusdevice/${clientId}/cmdbash复制openssl rand -hex 32 > firmware.key
esptool.py --encrypt-key-file firmware.key write_flash 0x10000 firmware.bin
这个项目最让我惊喜的是它的扩展性——后来我陆续添加了光敏传感器实现自动调光,通过Home Assistant接入语音控制,甚至用多个继电器模块改造了全屋照明。每次朋友来家里看到手机控制灯光的演示,都会感叹原来物联网开发可以如此平易近人。