手工耿分身?小伙给电脑,做了个指纹锁

发布时间:2025-08-05 09:18  浏览量:3

这天,小伙突发奇想,给电脑DIY了一个智能锁……

它DIY成本仅30元!

久坐提醒用眼距离过近提醒Web控制中心支持蓝牙HID输入适用于学习监督,员工统计,信息安全保护

自动锁屏功能演示↓

控制中心↓

平时可以这么用↓

当然啦!如果你不想统计工作时长什么的[看]

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

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

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

下滑瞅瞅看,它是怎么设计的叭!

原理图

PCB图

硬件参数

主控:Espressif ESP32C3,提供WIFI及蓝牙能力指纹:Hi-Link ZW101,实现指纹解锁输入密码功能人体雷达:Hi-Link LD2402,实现人体距离检测功能充电IC:TP4054,实现锂电池充电功能支持3V振动马达,用于提醒

1.开发环境

软件环境:VSCode+PlatformIO开发语言:C/C++

2.依赖库

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

EspSoftwareSerial:软串口驱动库Adafruit SSD1306:屏幕驱动库

3.蓝牙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 = 9) {// 包长度在第7和8字节uint16_t packetLen = ((uint16_t)response[7] = 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比较多。

number"id="distanceInput" /> 保存 10样本平均距离:自定义距离以内累计时间:-- 秒自定义距离内切换次数:--自定义距离外切换次数:--经过次数:-- )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,

目前项目已全开源。

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

屏幕多页显示温湿度模块接入......

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

【正文完】