我的订单购物车(0)联系客服 帮助中心供应商合作 嘉立创产业服务群
领券中心备货找料立推专区爆款推荐TI订货PLUS会员BOM配单工业品PCB/SMT面板定制

我这辈子,不准备买智能锁了!因为这个方案,开源了……

2025-08-22 10:21:47阅读量:6953

我花30元!做了个智能锁

智能锁

给电脑用的智能锁↓

给电脑用的智能锁

 

01
它能干啥?
 
  • 离开工位时自动锁屏

  • 回到工位时指纹解锁

  • 统计工作时长/离开时长;休息次数;经过时的次数

  • 久坐提醒

  • 用眼距离过近提醒

  • Web控制中心

  • 支持蓝牙HID输入

  • 适用于学习监督,员工统计,信息安全保护

 

自动锁屏功能演示↓

自动锁屏

控制中心

控制中心
平时可以这么用
功能

当然啦!如果你不想统计工作时长什么的图片……

 

只想保留自动锁屏指纹解锁功能

成本还可再压缩!差不多15元左右~

 

 

目前项目已全开源,并有详细的教程

开源教程

如果你想复刻,可参考第5章指引前往开源网址学习~

本文旨在分享软硬件设计方案

 

 

02
硬件设计方案
 

原理图

原理图

 

PCB图

PCB图

硬件参数
 
  • 主控:Espressif ESP32C3,提供WIFI及蓝牙能力

  • 指纹:Hi-Link ZW101,实现指纹解锁输入密码功能

  • 人体雷达:Hi-Link LD2402,实现人体距离检测功能

  • 充电IC:TP4054,实现锂电池充电功能

  • 支持3V振动马达,用于提醒

03
软件设计
 

 

01 
开发环境
 
  • 软件环境:VSCode+PlatformIO

  • 开发语言:C/C++

 

02 
依赖库
 

通过以下开源库协助本项目开发:

  • EspSoftwareSerial:软串口驱动库

  • Adafruit SSD1306:屏幕驱动库

 

03 
蓝牙HID驱动
 

蓝牙HID基于BleKeyboard库修改,原库年久失修,由于安全协议问题会导致最新Windows及Android系统拒绝与其通讯

通过在原库void BleKeyboard::begin(void)中添加以下两行解决

  •  
  •  
pSecurity->setCapability(ESP_IO_CAP_NONE);//安全设置    pSecurity->setInitEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK);

 

 

04 
指纹驱动
 

指纹库基于Hi-Link提供的例程修改,原例程缺少一些数据位判断及适当延时,导致接收到的数据包未过滤而返回通讯失败。

通过对原库receiveResponse()函数改良,添加数据位判断,以及init初始化添加等待延时解决

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
boolreceiveResponse(){uint8_t response[64];uint8_t index = 0;uint32_t startTime = millis();// 先等待包头 EF 01bool headerFound = false;while (millis() - startTime &lt2000) {  // 延长等待时间到2if (fingerprintSerial.available()) {uint8_t b = fingerprintSerial.read();if (!headerFound) {if (index == 0 && b == 0xEF) {        response[index++] = b;      } elseif (index == 1 && b == 0x01) {        response[index++] = b;        headerFound = true;      } else {        index = 0// 重新开始找包头      }    } else {      response[index++] = b;if (index >= 9) {// 包长度在第78字节uint16_t packetLen = ((uint16_t)response[7] <&lt8) | response[8];if (index >= 9 + packetLen) {// 收到完整包break;        }      }    }  }}#if defined(HLK_DEBUG)Serial.println("Received response:");printResponse(response, index);#endif// 简单校验包头和确认码if (index >= 12 && response[0] == 0xEF && response[1] == 0x01 && response[9] == 0x00) {returntrue;}returnfalse;}

 

 

05 
Web网页
 

借助ESP32C3的WIFI功能,实现局域网控制中心,使得数据可视化

网页做了一些美化还有统计图,所以占用Flash比较多。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
void handleRoot() {String html = R"rawliteral(    LD2402 监控<h1>HLK-LD2402 监控</h1><div><divid="currentDistance">当前自定义距离:0.50 米</div>      自定义距离 (米): <inputtype="number"id="distanceInput" />      保存</div><div><div>指纹验证后输入的文本:</div><inputtype="text"id="fingerprintTextInput" />      保存</div><div>      10样本平均距离:<strong><spanid="avg10">--</span> m</strong></div><div></div><div><strong>自定义距离以内累计时间:</strong><spanid="inside">--</span> 秒<br /><strong>自定义距离以外累计时间:</strong><spanid="outside">--</span> 秒<br /><strong>自定义距离内切换次数:</strong><spanid="insideSwitch">--</span><br /><strong>自定义距离外切换次数:</strong><spanid="outsideSwitch">--</span><br /><strong>经过次数:</strong><spanid="pass">--</span></div>)rawliteral";server.send(200, "text/html", html);}

 

 

06 
分区表
 

ESP32C3具备4MB,但是由于默认分区还预留了OTA分区,所以可用的很少。本项目不需要OTA升级所以这里我们修改分区表进行扩容。

去除原有的OTA预留空间,合并到主分区。

  •  
  •  
  •  
  •  
  •  
# Name,     Type, SubType, Offset,    Size,      Flagsnvs,        data, nvs,     0x9000,     0x5000,factory,    app,  factory, 0x10000,    0x1C0000, spiffs,     data, spiffs, 0x1D0000,    0x220000,coredump,   data, coredump,0x3F0000,   0x10000,

 

04
欢迎魔改!
 

本项目提供了一个简单的智能锁屏Demo,你可以丰富软件功能,或修改硬件新增外设。建议拓展方向如下:

  • 屏幕多页显示

  • 温湿度模块接入

  • ......

05
开源网址
 

本项目已开源!

开源网址

——想复刻想给作者点赞复制开源网址 前往原文。

 

开源网址:https://oshwhub.com/course-examples/eda-lock