我花30元!做了个智能锁!
给电脑用的智能锁↓
-
离开工位时自动锁屏
-
回到工位时指纹解锁
-
统计工作时长/离开时长;休息次数;经过时的次数
-
久坐提醒
-
用眼距离过近提醒
-
Web控制中心
-
支持蓝牙HID输入
-
适用于学习监督,员工统计,信息安全保护
自动锁屏功能演示↓

控制中心↓
当然啦!如果你不想统计工作时长什么的
……
只想保留自动锁屏和指纹解锁功能
成本还可再压缩!差不多15元左右~
目前项目已全开源,并有详细的教程↓

如果你想复刻,可参考第5章指引前往开源网址学习~
本文旨在分享其软硬件设计方案!

原理图

PCB图
-
主控:Espressif ESP32C3,提供WIFI及蓝牙能力
-
指纹:Hi-Link ZW101,实现指纹解锁输入密码功能
-
人体雷达:Hi-Link LD2402,实现人体距离检测功能
-
充电IC:TP4054,实现锂电池充电功能
-
支持3V振动马达,用于提醒
-
软件环境:VSCode+PlatformIO
-
开发语言:C/C++
通过以下开源库协助本项目开发:
-
EspSoftwareSerial:软串口驱动库
-
Adafruit SSD1306:屏幕驱动库
蓝牙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);
指纹库基于Hi-Link提供的例程修改,原例程缺少一些数据位判断及适当延时,导致接收到的数据包未过滤而返回通讯失败。
通过对原库receiveResponse()函数改良,添加数据位判断,以及init初始化添加等待延时解决。
boolreceiveResponse(){uint8_t response[64];uint8_t index = 0;uint32_t startTime = millis();// 先等待包头 EF 01bool headerFound = false;while (millis() - startTime < 2000) { // 延长等待时间到2秒if (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) {// 包长度在第7和8字节uint16_t packetLen = ((uint16_t)response[7] << 8) | 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;}
借助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);}
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,
本项目提供了一个简单的智能锁屏Demo,你可以丰富软件功能,或修改硬件新增外设。建议拓展方向如下:
-
屏幕多页显示
-
温湿度模块接入
-
......
本项目已开源!
——想复刻?想给作者点赞?可复制开源网址 前往原文。