# CreaterProject **Repository Path**: shixiak/creater-project ## Basic Information - **Project Name**: CreaterProject - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2024-05-10 - **Last Updated**: 2024-12-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 智能门锁 #### 介绍 本小组的目标是制作一个通过多种方式实现无需钥匙打开门锁的模块。该成果在生活中的使用频率较高,可以极大地提升生活体验感。 本产品使用的材料如下: * esp32c3开发板 * 1 * sg90舵机 * 1 * 4000mAh可充电锂电池组 * 1 * 3d打印的外壳 * 1 * RC522 RFID射频IC卡无线感应模块 * 1 * IC卡若干 * 杜邦线若干 * 自行绘制的电路板 #### 学习过程 ##### 3D打印 3D打印的过程中遇到许多问题, * 3D打印机出现故障导致的答应中断 * 绘制3D模型时对精度的把控不够熟练 * 3D模型部分区域悬空导致打印出来的成品瑕疵甚至不可用 打印机操作相关的问题十分感谢实验室的同学耐心指导,故障问题有李君老师维修3D打印机。有这样负责的老师和热心的同学,绝大多数的外界的阻碍的得以扫除。经过反复调整模型和实际打印验证误差,我们小组也终于打印出了差强人意的3D外壳。 ![alt text](imgs/containers.jpg) ##### NFC RC522射频芯片识别时遇见的问题 * 1. 能识别,但是无法确定什么时候不能继续识别 * 2. 能识别、但是经历了一次不是目标IC卡后,将无法继续识别其余IC卡 * 3. 完全不能识别 * 4. 断电后偶尔才能继续识别 解决方法 RC522芯片存在一个复位引脚,可以在每一次识别后将RC522重启一次,保证该芯片在每次识别前都是正常状态 ```cpp void resetRC522() { digitalWrite(RST_PIN, LOW); // 拉低复位引脚 delay(50); // 延时50毫秒 digitalWrite(RST_PIN, HIGH); // 拉高复位引脚 delay(50); // 延时50毫秒 mfrc522.PCD_Init(); // 重新初始化 MFRC522 } ``` ##### Blinker接入 为了增强模块的使用场景,不再局限于局域网才能开锁,我们调用了市面上比较成熟的软件接口Blinker,通过配置ScretKey和网络信息,使得ESP32C3开发板可以通过Blinker发送的开锁信号。 此外,由于米家的广泛兼容性,见过简单的配置就能够使用小爱同学语音操控打开门锁,进一步提升了使用体验。 Blinker相关的代码 ```cpp #define BLINKER_WIFI #define BLINKER_MIOT_OUTLET #include #include #include // WiFi 相关配置 const char* ssid = ""; const char* password = ""; WiFiServer server(80); // Blinker 相关配置 char auth[] = " "; #define BUTTON_1 "ButtonKey" BlinkerButton Button1(BUTTON_1); bool oState = false; // 设备状态 void button1_callback(const String & state) { BLINKER_LOG("get button state: ", state); if (state == BLINKER_CMD_BUTTON_TAP) { BLINKER_LOG("Button tap!"); toggleServo(); } } void miotPowerState(const String & state) { BLINKER_LOG("need set power state: ", state); if (state == BLINKER_CMD_ON) { toggleServo() ; BlinkerMIOT.powerState("on"); BlinkerMIOT.print(); oState = true; } } void miotPowerState(const String & state) { BLINKER_LOG("need set power state: ", state); if (state == BLINKER_CMD_ON) { toggleServo() ; BlinkerMIOT.powerState("on"); BlinkerMIOT.print(); oState = true; } } ``` ##### 舵机旋转的角度问题 由于sg90舵机角度旋转并不能很精准的与编程的角度对应,所以时常会导致舵机旋转角度过大或者过小的问题,这两种情况都不能很好的打开门锁。 此外,用户将产品固定在墙上之后可能会遇到角度舵机旋转角度不合适的情况。 因此为用户提供更新角度的功能是十分有必要的。 更新角度功能的实现使用了网页编程的部分内容,涉及到的部分代码如下: ```cpp // 检查是否有 WiFi 客户端连接 WiFiClient client = server.available(); if (client) { Serial.println("connecting..."); String currentLine = ""; bool isPost = false; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); if (c == '\n') { if (currentLine.length() == 0) { if (isPost) { // 读取POST数据 String postData = ""; while (client.available()) { char c = client.read(); postData += c; } // 解析POST数据 if (postData.indexOf("angle=") >= 0) { int angleStart = postData.indexOf("angle=") + 6; int angleEnd = postData.indexOf("&", angleStart); if (angleEnd == -1) { // 如果找不到&,则到行末 angleEnd = postData.length(); } String angleStr = postData.substring(angleStart, angleEnd); angle = angleStr.toInt(); Serial.print(angleStr); if (angle >= 0 && angle <= 180) { toggleServo(); } } } client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html; charset=utf-8"); client.println(); client.print("
宿舍开门


"); client.print("固定角度开门"); client.print("
"); client.print("输入角度: "); client.print(""); client.print("
"); client.println(); break; } else { if (currentLine.startsWith("POST")) { isPost = true; } if (currentLine.startsWith("GET /10")) { toggleServo(); } currentLine = ""; } } else if (c != '\r') { currentLine += c; } } } client.stop(); Serial.println("disconnected..."); } } ``` #### 使用说明 演示视频见学习通 1. 局域网内通过ip直接访问嵌入编程的html界面。界面可以开门实现开门行程的设置。 ![alt text](imgs/web_page.jpg) 2. 使用Blinker软件绑定开锁装置后即可在不同网络环境下发送开门信号 ![alt text](imgs/blinker_page.jpg) 3. 使用米家添加开锁设备之后,可以通过小爱同学语音开锁 #### 原理设计图 * 1.电路设计 添加sg90舵机的引脚 ![alt text](imgs/Sheet.png) * 2.PCB绘制 绘制电路板,使产品线材更加简洁 ![alt text](imgs/PCB_design.png) * 3.外壳3D建模 ![alt text](imgs/3d_container.png) #### 材料详情 * esp32c3开发板 * sg90舵机 * 4000mAh可充电锂电池组 * 3D打印的外壳 * RC522 RFID射频IC卡无线感应模块 * IC卡若干 * 杜邦线若干 * 自行绘制的电路板 实物全家福 ![alt text](imgs/alls.jpg)