# Screen-Lock智能屏锁 文档:https://wiki.yang17.top/products/oshwhub/oshw-847af8a1198540049e620b8e1627d776/ 项目来源:https://oshwhub.com/course-examples/eda-lock 分类:硬件项目 更新时间:2025-11-19T01:33:15.941Z 本项目基于ESP32C3模组构建,用于监测工作时长,休息时长,自动锁屏及指纹解锁等功能。 资料超详细 👇 项目介绍 硬件设计 软件设计 3D结构 附件下载 硬件工程 项目简介🪄 项目介绍 本项目基于ESP32C3模组, 搭载 RISC-V 32 位单核处理器,并使用海凌科ZW101及LD2402模块实现智能屏锁功能,支持多项统计。适用于学习监督,员工统计,信息安全保护。 项目功能 固件功能 ✅ 蓝牙HID输入 ✅ 离开工位时自动锁屏 ✅ 回到工位时指纹解锁 ✅ 统计工作时长及离开时长 ✅ 统计休息次数 ✅ 统计经过时的次数 ✅ 久坐提醒 ✅ 用眼距离过近提醒 ✅ Web控制中心 项目参数🔮 采用Espressif ESP32C3模组作为本项目主控,提供WIFI及蓝牙能力 采用Hi-Link ZW101指纹模组,实现指纹解锁输入密码功能 采用Hi-Link LD2402人体雷达,实现人体距离检测功能 采用TP4054充电IC,实现锂电池充电功能 支持3V振动马达,用于提醒 硬件设计 主控电路 主控这里选用ESP32C3芯片,借助C3的蓝牙功能通过HID实现锁屏和输入密码,借助C3的WIFI功能通过局域网搭建Web服务实现可视化数据及设备控制中心。C3芯片价格便宜且引脚IO足够。 查看数据手册 前往立创商城 指纹模块 指纹模块选用Hi-Link ZW101模块,由于该模块默认串口波特率较低,所以使用软件模拟串口进行通讯,把C3的硬件串口留给LD2402使用,这里还引出了一条T_OUT信号线,这是一条触摸信号线,你可以把他当作触摸按键使用。 人体存在模块 人体存在模块选用HI-Link LD2402人体存在24G毫米波雷达模块,这个模块的串口波特率为115400,比较高,所以这里使用硬件串口通讯,模组带一个输出IO,用于判断是否有人存在,不过这个IO比较多余,可以去除掉,因为串口会实时发送数据告诉人体距离,如果你有扩展需求可以去掉这个IO接其他外设。 查看数据手册 前往立创商城 供电电路 供电使用LDO方案,这里选用ME6217C33M5G芯片,尺寸小巧,外围器件较少。 查看数据手册 前往立创商城 充电电路 充电IC选用TP4054,价格便宜,而且体积小,很适合集成,CHRG这里也引出一条IO,可以反馈电池充电状态。 (务必接入电池后使用,不接电池主控芯片无法正常启动) 查看数据手册 前往立创商城 屏幕 屏幕选用SSD1306,0.91寸屏,用作信息提示。 查看数据手册 前往立创商城 振动马达 振动马达也是用作提醒功能使用,3.3V使用NMOS通过IO控制,我这里用的AO3400A支持5.7A,可以选便宜点的,马达额定电流只有80mA。 查看数据手册 前往立创商城 查看数据手册 前往立创商城 接口部分 TypeC接口选用12P接口,如果觉得不好焊可以换8P的,不过12P好像比8P便宜。按键3.3*3.3mm尺寸,比较小,电源开关建议选柄长一点的。 查看数据手册 前往立创商城 软件开发 完整源码请查看附件或wiki文档软件教程 开发环境 软件环境:VSCode+PlatformIO 开发语言:C/C++ 依赖库 通过以下开源库协助本项目开发 EspSoftwareSerial:软串口驱动库 Adafruit SSD1306:屏幕驱动库 蓝牙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); 指纹驱动 指纹库基于Hi-Link提供的例程修改,原例程缺少一些数据位判断及适当延时,导致接收到的数据包未过滤而返回通讯失败。 通过对原库receiveResponse()函数改良,添加数据位判断,以及init初始化添加等待延时解决。 bool receiveResponse() { uint8_t response[64]; uint8_t index = 0; uint32_t startTime = millis(); // 先等待包头 EF 01 bool 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; } else if (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) { return true; } return false; } Web网页 借助ESP32C3的WIFI功能,实现局域网控制中心,使得数据可视化。 网页做了一些美化还有统计图,所以占用Flash比较多。 void handleRoot() { String html = R"rawliteral( LD2402 监控