安全是当今每个人最关心的问题,无论是数据安全还是自己家的安全。随着技术的进步和物联网的日益普及,如今数字门锁已变得非常普遍。数字锁不需要任何物理钥匙,但它使用RFID、指纹、Face ID、pin、密码等来控制门锁。过去,我们使用这些不同的技术开发了许多数字门锁应用程序。在本教程中,我们使用 ESP32-CAM 构建了一个人脸 ID 控制的数字门锁系统。
所需组件
ESP32 凸轮
FTDI 董事会
继电器模块
电磁锁
跳线
电磁锁
电磁锁在电子机械锁定机构上工作。这种类型的锁有一个带有倾斜切口的嵌条和一个良好的安装支架。通电时,直流电会产生磁场,将塞子移入内部并使门保持在解锁位置。弹头将保持其位置,直到断电。当电源断开时,蛞蝓移动到外面并锁上门。它在锁定状态下不使用任何电源。要驱动电磁锁,您需要一个可以提供 12V @ 500mA 的电源。
我们之前使用电磁锁来构建基于Arduino 的 RFID 门锁。
电路原理图
ESP32-CAM人脸识别门锁系统电路图如下:
上面的电路与 FTDI 板、继电器模块和电磁锁相结合。FTDI 板用于将代码刷入 ESP32-CAM,因为它没有 USB 连接器,而继电器模块用于打开或关闭电磁锁。FTDI 板和 Relay 模块的 VCC 和 GND 引脚连接到 ESP32-CAM 的 Vcc 和 GND 引脚。FTDI 板的 TX 和 RX 连接到 ESP32 的 RX 和 TX,继电器模块的 IN 引脚连接到 ESP32-CAM 的 IO4。
注意:在上传代码之前,将 IO0 接地。IO0 决定 ESP32 是否处于闪烁模式。当 GPIO 0 连接到 GND 时,ESP32 处于闪烁模式。
根据电路图连接硬件后,它应该如下所示:
在 Arduino IDE 上安装 ESP32 Board
这里使用 Arduino IDE 对 ESP32-CAM 进行编程。为此,首先,在 Arduino IDE 上安装 ESP32 插件。
要在您的 Arduino IDE 中安装 ESP32 板,请转到File》 Preferences。
现在复制下面的链接并将其粘贴到“AddiTIonal Board Manager URLs”字段中,如下图所示。然后,单击“确定”按钮:
https://dl.espressif.com/dl/package_esp32_index.json
现在转到工具》董事会》董事会经理
在 Board Manager 中,搜索 ESP32 并安装“ESP32 by Espressif Systems”。
代码说明
我们在上一篇文章中解释了使用 ESP32 进行人脸识别;在这里,我们将修改相同的代码来控制电磁门锁。完整的代码分为四个部分。一个是摄像头和继电器模块的主代码,ESP32 根据人脸识别锁定或解锁门,另外三个代码是网页、摄像头索引和摄像头引脚。本页末尾给出了完整的代码。在这里,我们将解释代码的一些重要部分。
通过包含所有库文件来启动程序。
#include “esp_camera.h” #include#include “camera_pins.h”
在下一行中,取消注释您与 ESP32 一起使用的摄像头模块。在代码中,定义了五种不同的相机模型。在这种情况下,我们使用的是 AI-THINKER 模型。
//#define CAMERA_MODEL_WROVER_KIT //#define CAMERA_MODEL_ESP_EYE //#define CAMERA_MODEL_M5STACK_PSRAM//#define CAMERA_MODEL_M5STACK_WIDE #define CAMERA_MODEL_AI_THINKER
之后,将您的网络凭据插入以下变量:
const char* ssid = "Wi-Fi 名称"; const char* password = "Wi-Fi 密码";
然后定义连接继电器模块的引脚。在定义的时间间隔内解锁后,我们将使用millis()函数锁定门,这里是 5 秒。
#定义继电器4 长 prevMillis = 0; 整数间隔 = 5000;
在setup()函数中,以 115200 的波特率初始化串行监视器以进行调试。然后在接下来的几行中,定义继电器模块的引脚模式,并将继电器初始设置为低位。
无效设置(){ 序列号.开始(115200); pinMode(继电器,输出); 数字写入(继电器,低);
在loop()函数中,检查人脸是否与注册的人脸匹配。如果是,则解锁门 5 秒,5 秒后再次锁门。
无效循环(){ if (matchFace == true && activeRelay == false){ 主动继电器=真; 数字写入(继电器,高); 上一页Millis = millis(); } if(activeRelay == true && millis()- prevMillis > 间隔){ 主动继电器 = 假; 匹配面=假; 数字写入(继电器,低); }
测试ESP32-CAM 人脸识别门锁系统
最后上传代码,将 FDTI 板连接到您的笔记本电脑,然后选择“ESP32 Wrover Module”作为您的板。此外,更改其他设置,如下图所示:
在上传代码之前不要忘记将 IO0 引脚连接到 GND,并按下 ESP32 重置按钮,然后单击上传按钮。
注意:如果您在上传代码时遇到错误,请检查 IO0 是否连接到 GND,并且您在工具菜单中选择了正确的设置。
上传代码后,移除 IO0 和 GND 引脚。然后打开串口监视器并将波特率更改为115200。然后,按下ESP32重置按钮,它将打印ESP IP地址和端口号。在串行监视器上。
现在导航到浏览器并输入从串行监视器复制的 ESP IP 地址以访问摄像机流。它将带您到流媒体页面。要开始视频流,请单击页面底部的“开始流”按钮。
要使用 ESP32-CAM 识别人脸,首先,我们必须注册人脸。为此,请从设置中打开人脸识别和检测功能,然后单击“注册人脸”按钮。需要多次尝试才能保住面子。保存人脸后,它将人脸检测为主体 0,其中零是人脸编号。
注册人脸后,如果视频中识别到人脸,ESP32 会将继电器模块设为高电平以解锁门。
#include “esp_camera.h”
#include
//
// 警告!!!确保您选择了 ESP32 Wrover 模块,
// 或另一个启用了 PSRAM 的板
//
// 选择相机型号
//#define CAMERA_MODEL_WROVER_KIT
//#define CAMERA_MODEL_ESP_EYE
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE
#define CAMERA_MODEL_AI_THINKER
#include “camera_pins.h”
const char* ssid = "银河-M20";
const char* 密码 = "ac312124";
#define LED_BUILTIN 4
#定义继电器4
#定义蜂鸣器2
布尔匹配面 = 假;
boolean acTIveRelay = false;
长 prevMillis = 0;
整数间隔 = 5000;
无效 startCameraServer();
无效设置(){
序列号.开始(115200);
Serial.setDebugOutput(true);
序列号.println();
pinMode(继电器,输出);
pinMode(蜂鸣器,输出);
pinMode(LED_BUILTIN,输出);
数字写入(LED_BUILTIN,低);
数字写入(继电器,低);
数字写入(蜂鸣器,低);
camera_config_t 配置;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
//用高规格初始化以预分配更大的缓冲区
如果(psramFound()){
config.frame_size = FRAMESIZE_UXGA;
config.jpeg_quality = 10;
config.fb_count = 2;
} 别的 {
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 12;
config.fb_count = 1;
}
#如果定义(CAMERA_MODEL_ESP_EYE)
pinMode(13,INPUT_PULLUP);
pinMode(14, INPUT_PULLUP);
#万一
// 相机初始化
esp_err_t err = esp_camera_init(&config);
如果(错误!= ESP_OK){
Serial.printf("相机初始化失败,错误 0x%x", err);
返回;
}
sensor_t * s = esp_camera_sensor_get();
//初始传感器垂直翻转,颜色有点饱和
if (s->id.PID == OV3660_PID) {
s->set_vflip(s, 1);//翻转回来
s->set_brightness(s, 1);//稍微提高亮度
s->set_saturation(s, -2);//降低饱和度
}
//降低帧大小以获得更高的初始帧速率
s->set_framesize(s, FRAMESIZE_QVGA);
#如果定义(CAMERA_MODEL_M5STACK_WIDE)
s->set_vflip(s, 1);
s->set_hmirror(s, 1);
#万一
WiFi.begin(ssid, 密码);
而(WiFi.status()!= WL_CONNECTED){
延迟(500);
Serial.print(".");
}
序列号.println("");
Serial.println("WiFi 连接");
startCameraServer();
Serial.print("相机准备好了!使用'http://");
Serial.print(WiFi.localIP());
Serial.println("'要连接");
}
无效循环(){
if (matchFace == true && activeRelay == false){
主动继电器=真;
数字写入(继电器,高);
digitalWrite(蜂鸣器,高);
延迟(800);
digitalWrite(蜂鸣器,低);
上一页Millis = millis();
}
if(activeRelay == true && millis()- prevMillis > 间隔){
主动继电器 = 假;
匹配面=假;
数字写入(继电器,低);
}
}