
Screen-Lock智能屏锁
简介
本项目基于ESP32C3模组构建,用于监测工作时长,休息时长,自动锁屏及指纹解锁等功能。
简介:本项目基于ESP32C3模组构建,用于监测工作时长,休息时长,自动锁屏及指纹解锁等功能。开源协议
:GPL 3.0
描述
项目简介🪄
本项目基于ESP32C3模组, 搭载 RISC-V 32 位单核处理器,并使用海凌科ZW101及LD2402模块实现智能屏锁功能,支持多项统计。适用于学习监督,员工统计,信息安全保护。
项目功能
- ✅ 蓝牙HID输入
- ✅ 离开工位时自动锁屏
- ✅ 回到工位时指纹解锁
- ✅ 统计工作时长及离开时长
- ✅ 统计休息次数
- ✅ 统计经过时的次数
- ✅ 久坐提醒
- ✅ 用眼距离过近提醒
- ✅ Web控制中心
项目参数🔮
硬件设计
主控这里选用ESP32C3芯片,借助C3的蓝牙功能通过HID实现锁屏和输入密码,借助C3的WIFI功能通过局域网搭建Web服务实现可视化数据及设备控制中心。C3芯片价格便宜且引脚IO足够。

指纹模块选用Hi-Link ZW101模块,由于该模块默认串口波特率较低,所以使用软件模拟串口进行通讯,把C3的硬件串口留给LD2402使用,这里还引出了一条T_OUT信号线,这是一条触摸信号线,你可以把他当作触摸按键使用。

人体存在模块选用HI-Link LD2402人体存在24G毫米波雷达模块,这个模块的串口波特率为115400,比较高,所以这里使用硬件串口通讯,模组带一个输出IO,用于判断是否有人存在,不过这个IO比较多余,可以去除掉,因为串口会实时发送数据告诉人体距离,如果你有扩展需求可以去掉这个IO接其他外设。

充电IC选用TP4054,价格便宜,而且体积小,很适合集成,CHRG这里也引出一条IO,可以反馈电池充电状态。
(务必接入电池后使用,不接电池主控芯片无法正常启动)




软件开发
完整源码请查看附件或wiki文档软件教程
- 软件环境: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初始化添加等待延时解决。
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;
}
借助ESP32C3的WIFI功能,实现局域网控制中心,使得数据可视化。
网页做了一些美化还有统计图,所以占用Flash比较多。
void handleRoot() {
String html = R"rawliteral(
LD2402 监控
<h1>HLK-LD2402 监控</h1>
<div>
<div id="currentDistance">当前自定义距离:0.50 米</div>
自定义距离 (米):
<input type="number" id="distanceInput" />
保存
</div>
<div>
<div>指纹验证后输入的文本:</div>
<input type="text" id="fingerprintTextInput" />
保存
</div>
<div>
10样本平均距离:<strong><span id="avg10">--</span> m</strong>
</div>
<div>
</div>
<div>
<strong>自定义距离以内累计时间:</strong><span id="inside">--</span> 秒<br />
<strong>自定义距离以外累计时间:</strong><span id="outside">--</span> 秒<br />
<strong>自定义距离内切换次数:</strong><span id="insideSwitch">--</span><br />
<strong>自定义距离外切换次数:</strong><span id="outsideSwitch">--</span><br />
<strong>经过次数:</strong><span id="pass">--</span>
</div>
)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外壳结构

| 正面 | 背面 |
|---|---|
![]() | ![]() |
| 正面 | 背面 |
|---|---|
![]() | ![]() |
| 1 | 2 |
|---|---|
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
- 屏幕多页显示
- 温湿度模块接入
- ......
- 务必接入电池后使用,否则不工作。
- 本项目使用较小封装和较小PCB尺寸,所以需要一定的焊接水平。
首次烧录提示:首次烧录连接设备时,主控可能会不断重启导致端口不稳定,这时候要先按住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会自动按照默认分区表配置分区烧录,你只需要点击烧录箭头即可自动编译,自动查找端口,自动烧录。(前提是要先搭建好开发环境)

设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。




















评论