站内搜索
发作品签到
专业版

Screen-Lock智能屏锁

工程标签

1.7w
0
0
79

简介

本项目基于ESP32C3模组构建,用于监测工作时长,休息时长,自动锁屏及指纹解锁等功能。

简介:本项目基于ESP32C3模组构建,用于监测工作时长,休息时长,自动锁屏及指纹解锁等功能。
复刻成本:30

开源协议

GPL 3.0

创建时间:2025-07-18 13:50:10更新时间:2025-11-19 09:35:22

描述

项目简介🪄

项目介绍

本项目基于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足够。

    image.png

指纹模块

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

    image.png

人体存在模块

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

    image.png

供电电路

供电使用LDO方案,这里选用ME6217C33M5G芯片,尺寸小巧,外围器件较少。

    image.png

充电电路

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

    image.png

屏幕
屏幕选用SSD1306,0.91寸屏,用作信息提示。

    image.png

振动马达
振动马达也是用作提醒功能使用,3.3V使用NMOS通过IO控制,我这里用的AO3400A支持5.7A,可以选便宜点的,马达额定电流只有80mA。

    image.png

    image.png

    image.png

接口部分

TypeC接口选用12P接口,如果觉得不好焊可以换8P的,不过12P好像比8P便宜。按键3.3*3.3mm尺寸,比较小,电源开关建议选柄长一点的。

    image.png

    image.png

软件开发

完整源码请查看附件或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 监控
    
    
  
  
    <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

Android16Windows11
image.pngimage.png

浏览器输入192.168.4.1进入后台
47f66654-a166-4fe2-95fd-6e20af0a86e8.jpg

配置蓝牙HID

打开蓝牙,连接蓝牙设备名为ScreenLock的设备即可

Android16Windows11
image.pngimage.png

3D外壳结构

组装图
和往期项目一样,尽可能只使用两个外壳部件,方便打样。

9989114f-dc83-46d7-bc14-b122feaa9eee.png

前壳
外壳前壳结构较多,板子之所以设计的小是为了右边给电池预留了槽位。
正面背面
3cbc57f7-bf05-4417-93dc-feda00934132.pngc57753db-4fb0-4077-a20c-b08405a6b9e2.png
后壳
后壳突出部分用于将项目固定于显示器下方,有开2mm螺丝孔,可使用螺丝或双面胶装配。
正面背面
4a66e75e-1b07-4054-a8c9-19528036dfb3.png83589354-7d7e-4180-b73f-c7ce2ad48144.png
实物图
12
e47a647c-cbdd-49da-b7ad-785fad2a4872.jpge710fb8d-8408-4859-be34-49f4b8ad1eac.jpg
c5213d74-7325-4843-affa-1ad3904a5403.jpg9ebfd243-f9fd-43e4-b4cc-4c287835d5f3.jpg
8db198c2-67ef-4a4a-a530-ed4007678910.jpgf37edbee-39f0-4f32-9b2c-39747f60ac25.jpg
拓展方向
本项目提供了一个简单的智能锁屏Demo,你可以丰富软件功能,或修改硬件新增外设。
  • 屏幕多页显示
  • 温湿度模块接入
  • ......
⚠️注意事项
  1. 务必接入电池后使用,否则不工作。
  2. 本项目使用较小封装和较小PCB尺寸,所以需要一定的焊接水平。
代码仓

Screen-Lock源码
https://gitee.com/JasonYANG170/Screen-Lock

烧录说明

首次烧录提示:首次烧录连接设备时,主控可能会不断重启导致端口不稳定,这时候要先按住BOOT键,然后再按RST键,最后松开BOOT键进入下载模式即可。

附件固件烧录
为了简化烧录,附件中提供的固件是bootloader.bin + partitions.bin + firmware.bin合并后的固件,所以如果你使用附件提供的合并固件,仅需设置烧录地址为0即可。

image.png

编译后产物烧录
如果你通过源码编译,则会在build目录下产生bootloader.bin partitions.bin firmware.bin这三个bin文件,所以在烧录时请按照下图提供的分区地址烧录。

产物名烧录地址
bootloader.bin0x00000000
partitions.bin0x00008000
firmware.bin0x00010000

image.png

源码烧录(推荐)
如果你通过源码烧录,就很简单了,不需要自己设置分区,platformio会自动按照默认分区表配置分区烧录,你只需要点击烧录箭头即可自动编译,自动查找端口,自动烧录。(前提是要先搭建好开发环境)

image.png

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
1
外壳前壳V2.STL
20
2
Screen-Lock_BT.STL
23

附件

序号文件名称下载次数
1
演示视频.mp4
98
2
ScreenLock资源包.zip
308
3
外壳前壳V2.STL
20
克隆工程
添加到专辑
0
0
分享
侵权投诉
知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

评论

全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航