# 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 监控

HLK-LD2402 监控

当前自定义距离:0.50 米
自定义距离 (米): 保存
指纹验证后输入的文本:
保存
10样本平均距离:-- m
自定义距离以内累计时间:-- 秒
自定义距离以外累计时间:-- 秒
自定义距离内切换次数:--
自定义距离外切换次数:--
经过次数:--
)rawliteral"; server.send(200, "text/html", html); } 分区表 ESP32C3具备4MB,但是由于默认分区还预留了OTA分区,所以可用的很少。本项目不需要OTA升级所以这里我们修改分区表进行扩容。 去除原有的OTA预留空间,合并到主分区 # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, factory, app, factory, 0x10000, 0x1C0000, spiffs, data, spiffs, 0x1D0000, 0x220000, coredump, data, coredump,0x3F0000, 0x10000, 使用说明 配网 配置后台 打开WIFI,连接设备名为ScreenLock的设备,输入密码12345678 Android16 Windows11 浏览器输入192.168.4.1进入后台 配置蓝牙HID 打开蓝牙,连接蓝牙设备名为ScreenLock的设备即可 Android16 Windows11 3D外壳结构 组装图 和往期项目一样,尽可能只使用两个外壳部件,方便打样。 前壳 外壳前壳结构较多,板子之所以设计的小是为了右边给电池预留了槽位。 正面 背面 后壳 后壳突出部分用于将项目固定于显示器下方,有开2mm螺丝孔,可使用螺丝或双面胶装配。 正面 背面 实物图 1 2 开发文档及教程 嘉立创EDA-教育与开源文档中心 拓展方向 本项目提供了一个简单的智能锁屏Demo,你可以丰富软件功能,或修改硬件新增外设。 屏幕多页显示 温湿度模块接入 ...... ⚠️注意事项 务必接入电池后使用,否则不工作。 本项目使用较小封装和较小PCB尺寸,所以需要一定的焊接水平。 代码仓 Screen-Lock源码 https://gitee.com/JasonYANG170/Screen-Lock 烧录说明 首次烧录提示:首次烧录连接设备时,主控可能会不断重启导致端口不稳定,这时候要先按住BOOT键,然后再按RST键,最后松开BOOT键进入下载模式即可。 附件固件烧录 为了简化烧录,附件中提供的固件是bootloader.bin + partitions.bin + firmware.bin合并后的固件,所以如果你使用附件提供的合并固件,仅需设置烧录地址为0即可。 编译后产物烧录 如果你通过源码编译,则会在build目录下产生bootloader.bin partitions.bin firmware.bin这三个bin文件,所以在烧录时请按照下图提供的分区地址烧录。 产物名 烧录地址 bootloader.bin 0x00000000 partitions.bin 0x00008000 firmware.bin 0x00010000 源码烧录(推荐) 如果你通过源码烧录,就很简单了,不需要自己设置分区,platformio会自动按照默认分区表配置分区烧录,你只需要点击烧录箭头即可自动编译,自动查找端口,自动烧录。(前提是要先搭建好开发环境)