告别钥匙串:手把手教你用Arduino和旧手机/公交卡打造智能门锁(支持多用户管理)

张开发
2026/4/14 18:50:35 15 分钟阅读

分享文章

告别钥匙串:手把手教你用Arduino和旧手机/公交卡打造智能门锁(支持多用户管理)
废旧手机秒变智能钥匙ArduinoNFC多用户门禁系统实战指南每次站在门口翻找钥匙的狼狈相信合租党都深有体会。更糟的是当室友忘带钥匙时你不得不放下手头工作去开门。其实只需一个闲置的Arduino开发板、几张淘汰的公交卡或旧手机就能打造支持多人管理的智能门禁系统。本文将突破传统教程只实现基础刷卡功能的局限带你从硬件组装到软件编程实现真正的多用户动态管理——不仅能随时添加/删除授权卡还能生成临时访客通行证甚至预留蓝牙联动接口。所有代码均提供详细注释确保零基础也能轻松上手。1. 硬件选型与成本控制改造传统门锁的第一步是选择合适的执行机构。经过实测对比SG90微型舵机在价格约15元和扭矩1.6kg/cm之间取得了最佳平衡足以驱动大多数公寓门的天地锁。需要注意的是市面存在大量仿品正品SG90的特征包括黑色尼龙齿轮组工作电压范围4.8V-6V0.12秒/60°的响应速度NFC读卡器推荐使用RC522模块约12元其优势在于同时支持ISO14443A标准的MIFARE卡公交卡和手机NFC模拟。以下是核心部件清单及替代方案组件型号单价替代方案主控板Arduino Uno R325元Nano(更省电)NFC模块RC52212元PN532(支持手机)执行器SG90舵机15元MG996R(高扭矩)电源18650×20元(旧电池)5V电源适配器实战技巧废旧手机充电宝是理想的供电方案。将充电宝输出端直接连接至Arduino的Vin引脚需保持7-12V输入另用LM2596降压模块约5元为舵机提供稳定6V电源。这种双路供电设计避免了舵机工作时导致主控板重启的问题。2. 系统搭建与基础功能实现硬件连接遵循读卡→验证→执行的流程。使用杜邦线按以下方式连接RC522接线SDA → 数字引脚10SCK → 数字引脚13MOSI → 数字引脚11MISO → 数字引脚12IRQ → 不接GND → GNDRST → 数字引脚93.3V → 3.3VSG90舵机接线红色 → 降压模块6V棕色 → GND与Arduino共地橙色 → 数字引脚6核心代码逻辑分为三个部分#include SPI.h #include MFRC522.h #include Servo.h // 初始化设备对象 MFRC522 rfid(10, 9); Servo doorLock; // 预存合法卡UID示例 byte authorizedCards[][4] { {0x12, 0x34, 0x56, 0x78}, // 管理员卡 {0x9A, 0xBC, 0xDE, 0xF0} // 室友A卡 }; void setup() { Serial.begin(9600); SPI.begin(); rfid.PCD_Init(); doorLock.attach(6); doorLock.write(0); // 初始锁定位置 } void loop() { // 检测到卡片时读取UID if (rfid.PICC_IsNewCardPresent() rfid.PICC_ReadCardSerial()) { byte* uid rfid.uid.uidByte; // 遍历验证卡权限 for(int i0; isizeof(authorizedCards)/4; i) { if(memcmp(uid, authorizedCards[i], 4) 0) { unlockDoor(); break; } } rfid.PICC_HaltA(); // 停止读卡 } } void unlockDoor() { doorLock.write(90); // 开锁角度 delay(1000); // 保持1秒 doorLock.write(0); // 重新上锁 }常见问题排查若串口监视器无输出检查波特率是否设置为9600舵机抖动但不转动通常是供电不足导致读卡距离过短3cm尝试调整RC522天线匹配电容3. 多用户动态管理系统进阶静态编码的卡UID列表显然不够灵活。我们通过串口命令实现运行时管理支持以下指令格式ADD CARD:12,34,56,78 // 添加新卡 DEL CARD:12,34,56,78 // 删除卡片 LIST // 查看所有授权卡升级后的代码增加串口处理逻辑// 在loop()中添加 if(Serial.available()) { processCommand(Serial.readStringUntil(\n)); } void processCommand(String cmd) { if(cmd.startsWith(ADD CARD:)) { // 解析卡号并添加到授权列表 byte newCard[4]; sscanf(cmd.c_str()9, %hhu,%hhu,%hhu,%hhu, newCard[0], newCard[1], newCard[2], newCard[3]); // 数组扩容逻辑略 memcpy(authorizedCards[cardCount], newCard, 4); Serial.println(Card added successfully); } // 其他命令处理... }访客临时卡实现方案在程序中设置有效期时间戳通过串口发送ADD TEMP:12,34,56,78,20231231每次验证时检查当前日期是否过期安全提示临时卡UID建议通过加密算法生成避免序列号被猜测4. 系统优化与扩展可能功耗是长期运行的关键。实测发现Arduino Uno在空闲时仍有50mA左右的电流消耗。通过以下改造可实现周级续航硬件优化换用Arduino Nano空闲电流15mA添加MOSFET开关控制舵机电源采用TP4056充电管理模块软件优化#include avr/sleep.h void enterSleep() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sleep_mode(); // 进入休眠 // 被中断唤醒后继续执行 } // 在loop()末尾添加 if(millis() - lastActive 30000) { enterSleep(); // 30秒无操作进入深度休眠 }蓝牙联动方案添加HC-05模块约25元开发手机APP或微信小程序实现以下功能远程开锁查看最近开锁记录电子钥匙分享门锁改造最棘手的往往是机械部分。建议先用3D打印或激光切割制作支架原型测试无误后再永久安装。一个巧妙的解决方案是将舵机通过钢丝绳与门把手联动这样既不需要破坏原有锁体又能保留钥匙开锁的备用方案。

更多文章