基于 Arduino 与 ESP8266 的 WiFi 智能门锁:手机扫码解锁
项目简介
本教程将指导你制作一个基于 Arduino 和 ESP8266 的智能门锁系统。授权人员只需用手机扫描门上的二维码,即可打开网页输入密码,验证通过后电磁锁解锁。无需键盘、指纹模块等复杂机械结构,成本低、部署灵活,适合家庭、办公室、实验室等场景。
核心原理
- ESP8266 连接本地 WiFi,启动 Web 服务器,提供登录页面。
- 用户扫描门上贴纸上的二维码(编码 ESP8266 局域网 IP),打开登录页。
- 输入密码提交,ESP8266 通过串口将密码发送给 Arduino。
- Arduino 验证密码,正确则驾驶达林顿管/继电器驱动电磁锁(电磁阀)动作 300ms 解锁。
所需硬件清单
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino Uno R3 | 1 | 主控制器,验证密码并驱动锁 |
| ESP8266 WiFi 模块 (ESP-01 或 NodeMCU) | 1 | 提供 WiFi 与 Web 服务 |
| 达林顿大功率晶体管 (如 TIP120) 或继电器模块 | 1 | 驱动电磁锁,隔离强弱电 |
| 电磁锁 / 电磁阀 (12V/24V) | 1 | 门锁执行机构 |
| 12V/24V 电源适配器 | 1 | 为电磁锁供电 |
| 5V 电源 (USB 或稳压模块) | 1 | 为 Arduino 和 ESP8266 供电 |
| 二极管 1N4007 | 1 | 电磁锁线圈反向续流保护 |
| 杜邦线、面包板/万用板、电阻等 | 若干 | 按原理图连接 |
电路连接要点
ESP8266 与 Arduino 串口通信
- ESP8266 TX → Arduino RX (Pin 0) (需分压至 3.3V→5V 或使用电平转换)
- ESP8266 RX ← Arduino TX (Pin 1) (ESP8266 耐 3.3V,建议串联 1k/2k 分压)
- 共地 (GND 相连)
电磁锁驱动电路
- Arduino Pin 9 → 达林顿管基极 (串联 1kΩ 电阻)
- 达林顿管集电极 → 电磁锁一端,另一端接电源正极
- 达林顿管发射极接地
- 二极管 1N4007 并联在电磁锁两端(阴极接电源正极),吸收反向电动势
固件代码
Arduino 端代码 (上传至 Arduino Uno)
String inputString = ""; // 接收缓冲区
bool stringComplete = false; // 接收完成标志
const int lockPin = 9; // 控制电磁锁引脚
const String validPassword = "your_password"; // 在这里修改你的开锁密码
void setup() {
Serial.begin(115200);
inputString.reserve(200);
pinMode(lockPin, OUTPUT);
digitalWrite(lockPin, LOW);
}
void loop() {
if (stringComplete) {
if (inputString == validPassword) {
digitalWrite(lockPin, HIGH); // 解锁
delay(300); // 保持 300ms
digitalWrite(lockPin, LOW); // 上锁
Serial.println("Access granted");
} else {
Serial.println("Access denied: " + inputString);
}
inputString = "";
stringComplete = false;
}
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '\n') stringComplete = true;
}
}
ESP8266 端代码 (使用 Arduino IDE 上传,需先安装 ESP8266 开发板包)
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
// ===== 修改为你的 WiFi 凭据 =====
const char* ssid = "YourSSID";
const char* password = "YourPASSWORD";
ESP8266WebServer server(80);
void handleRoot() {
String html = R"rawliteral(
智能门锁验证
请输入访问密码
)rawliteral";
server.send(200, "text/html", html);
}
void handleSave() {
if (server.hasArg("pass") && server.arg("pass") != "") {
Serial.println(server.arg("pass")); // 发送密码给 Arduino
}
server.send(200, "text/plain", "ok");
}
void setup() {
Serial.begin(115200);
delay(10);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); // 记下这个 IP,用于生成二维码
server.on("/", handleRoot);
server.on("/save", handleSave);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
}
部署与测试步骤
- 先上传 Arduino 代码,打开串口监视器确认波特率 115200。
- 在 Arduino IDE 安装 ESP8266 开发板包:
文件 > 首选项 > 附加开发板管理器网址添加https://arduino.esp8266.com/stable/package_esp8266com_index.json
工具 > 开发板 > 开发板管理器搜索并安装 esp8266。 - 选择 "Generic ESP8266 Module",使用 USB-TTL 下载器烧录 ESP8266 代码。
- 烧录成功后,打开 ESP8266 串口监视器,记下显示的 IP 地址 (如 192.168.1.45)。
- 在浏览器访问该 IP,应看到登录页面。输入正确密码,Arduino 串口监视器应打印 "Access granted",电磁锁动作一次。
- 使用在线二维码生成器(如 qr-code-generator.com)将 IP 生成二维码,打印贴在门边。
- 实际使用:连接同一 WiFi → 扫码 → 输入密码 → 门锁打开。
安全性与扩展建议
- 密码安全:当前方案明文传输,建议在局域网内使用,或升级为 HTTPS + 哈希验证。
- 多用户/权限分级:在 Arduino 端维护密码列表,或引入 JSON Web Token (JWT) 由 ESP8266 验签。
- 开锁日志:ESP8266 可将时间、IP、结果写入 SPIFFS 或发送至 MQTT 服务器。
- 断电保护:电磁锁选用"通电上锁/断电开锁"或"断电上锁/通电开锁"取决于安全需求,配合电池备份。
- 专业外壳:3D 打印或激光切割外壳,防尘防水,固定电路板。
原理图与资源
原理图请参考项目附件图片,展示了 ESP8266、Arduino、达林顿管、电磁锁、二极管、电源的完整连接。
更多教程请访问 ElectroPeak 官网。
制造工艺
- 银行金库内幕:历史、设计与安全未来
- 用 Python 构建 Wi-Fi 控制的树莓派机器人:分步指南
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- 打造安全的 Arduino RFID 门锁——分步指南
- 智能窗帘:基于Arduino与太阳能的自动光控系统
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- 基于 Arduino 与 MAX30100 的实时物联网心率监测系统
- 智能物联网罐:ESP8266 + Arduino + 超声波传感器实时监测罐内物位
- Arduino Uno WiFi 网页服务器:通过浏览器控制 LED 开关
- DIY 智能 Arduino 机械臂:主从控制与动作记忆教程
- 使用 Arduino Nano 和 RDA8057M 制作紧凑型 FM 收音机
- 基于 Arduino 与 ESP8266 的 WiFi 智能门锁:手机扫码解锁