安全是當今每個人最關心的問題,無論是數據安全還是自己家的安全。隨著技術的進步和物聯網的日益普及,如今數字門鎖已變得非常普遍。數字鎖不需要任何物理鑰匙,但它使用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 > 間隔){
主動繼電器 = 假;
匹配面=假;
數字寫入(繼電器,低);
}
}
評論
查看更多