如今,安全系統是研究最多的領域之一,隨著安全威脅的增加,公司正在推出新的智能安全產品來應對這些威脅。物聯網是該領域的一個額外優勢,它可以在任何緊急情況下自動觸發事件,例如報警、消防隊或您的鄰居。今天我們將使用ESP32 和攝像頭構建智能 Wi-Fi 門鈴。
所需組件
ESP32-CAM
FTDI編程板
蜂鳴器
按鈕
發光二極管 (2)
電路原理圖
這款智能 Wi-Fi 門鈴的電路圖非常簡單,只需將兩個 LED、一個按鈕和一個蜂鳴器連接到 ESP32 GPIO 引腳即可。每當按下按鈕時,蜂鳴器都會發出聲音。一個 LED 用于指示電源狀態,另一個 LED 用于指示網絡狀態。如果 ESP 連接到網絡,網絡 LED 將處于高電平狀態,否則它將閃爍。
這是Wi-Fi 視頻門鈴設置在 3D 打印外殼中的外觀:
Wi-Fi 門鈴的 IFTTT 設置
IFTTT 是一項基于 Web 的免費服務,它允許用戶創建稱為“食譜”的簡單條件語句鏈,這些語句是基于對其他 Web 服務(如 Gmail、Facebook、Instagram 和 Pinterest)的更改而觸發的。 IFTTT 是“If This Then That”的縮寫。
在這個項目中,IFTTT 用于在溫度或濕度超過預定義限制時發送電子郵件。我們之前在許多基于物聯網的項目中使用 IFTTT 來發送電子郵件或 SMS 以針對特定事件發送電子郵件或 SMS,例如過度用電、高脈沖率、入侵者進入等。
首先 使用您的憑據 登錄IFTTT , 如果您沒有帳戶,請注冊。
現在搜索“Webhooks”并單擊“服務”部分中的“Webhooks”。
現在,在 Webhooks 窗口中,單擊右上角的“文檔”以獲取私鑰。
復制此密鑰。它將在程序中使用。
獲得私鑰后,現在我們將使用 Webhooks 和電子郵件服務創建一個小程序。要創建小程序,請單擊您的個人資料,然后單擊“創建”。‘
現在在下一個窗口中,單擊“此”圖標。
現在在搜索部分搜索 Webhooks,然后單擊“ Webhooks”。’
現在選擇“接收 Web 請求” 觸發器,然后在下一個窗口中,輸入事件名稱為 button_pressed,然后單擊創建觸發器。
現在要完成小程序,單擊“那個”為button_pressed事件創建一個反應。
在這里,我們將在按下 IoT 門鈴按鈕時在手機上播放特定歌曲。在搜索部分中搜索“Android 設備”。
現在在 Android 設備中,選擇“播放特定歌曲”觸發器。
現在輸入按下門鈴按鈕時要播放的歌曲名稱。就我而言,我正在播放我的谷歌播放音樂中名為“123”的歌曲。您還可以使用 Spotify 或其他音樂應用程序。
之后,單擊“創建操作”,然后單擊“完成”以完成該過程。
現在創建另一個小程序,在按下門鈴按鈕時向手機發送帶有網頁鏈接的消息。
因此,要創建此小程序,請在“ this ”部分中選擇“ Webhooks ” ,在“that”部分中選擇“ Android SMS ”。
現在它會要求輸入電話號碼和消息正文。對于這個Wi-Fi 門鈴項目,我們正在發送帶有 Web 服務器鏈接的消息,以便您可以直接看到實時視頻流。
代碼說明
本文檔末尾提供了此Wi-Fi 門鈴攝像頭的完整代碼以及視頻。它也可以從這里下載。下面我們將解釋代碼的一些重要部分。
首先,包含此代碼所需的所有庫文件。
?
#include “esp_camera.h” #include
?
然后輸入 Wi-Fi 憑據。
?
const char* ssid = "Wi-Fi 名稱"; const char* 密碼 = "Wi-Fi 密碼";
?
之后,輸入您從 IFTTT 網站復制的 IFTTT 主機名和私鑰。
?
const char *host = "maker.ifttt.com"; const char *privateKey = "你的私鑰";
?
定義您在此項目中使用的所有引腳。我正在使用 GPIO 2、14 和 15 引腳來連接按鈕、LED 和蜂鳴器。
?
常量 int buttonPin = 2; 常量 int led1 = 14; 常量 int 蜂鳴器 = 15;
?
在void setup循環內,將按鈕引腳定義為輸入,將 LED 和蜂鳴器引腳定義為輸出。
?
無效設置(){ pinMode(buttonPin,輸入); pinMode(led1,輸出); pinMode(蜂鳴器,輸出);
?
它將嘗試使用給定的憑據連接到 Wi-Fi,并且當連接到網絡時,LED 狀態將從低變為高。
?
WiFi.begin(ssid, 密碼); int led = 低; 而(WiFi.status()!= WL_CONNECTED){ 延遲(500); Serial.print("."); 數字寫入(led1,led); 領導=!領導; } 序列號.println(""); Serial.println("WiFi 連接"); 數字寫入(led1,高);
?
與網絡斷開連接時,ESP32 將重新啟動,直到它連接到網絡。
?
而(WiFi.status()== WL_DISCONNECTED){ ESP.restart(); 數字寫入(led1,低); Serial.print("連接丟失");
?
ESP32 會讀取按鍵狀態,如果按鍵處于 LOW 狀態(拉高),即有按鍵被按下,則發送事件并打開蜂鳴器 3 秒。
?
int 閱讀 = digitalRead(buttonPin); 如果(按鈕狀態 == 低){ send_event("button_pressed"); Serial.print("按下按鈕"); 數字寫入(蜂鳴器,高); 延遲(3000); 數字寫入(蜂鳴器,低);
?
用于智能 Wi-Fi 門鈴的 3D 打印外殼
在這里,我為這款無線門鈴攝像頭設計了一個 3D 打印外殼。為此,我使用游標卡尺測量了 ESP32 板、按鈕、蜂鳴器和 LED 的尺寸,設計完成后如下圖所示。
之后,我將其導出為 STL 文件,根據打印機設置對其進行切片,最后打印出來。STL 文件可從Thingiverse下載,您可以使用它打印自己的外殼。
打印完外殼后,我將電路組裝到外殼中,一切都非常合適,正如您在此處看到的那樣。
如果您想了解更多關于 3D 打印機及其工作原理的信息,您可以閱讀這篇關于 3D 打印入門指南的文章,也可以查看我們使用3D 打印外殼的其他項目,例如Biped Robot、Robotic Arm等。
測試智能 Wi-Fi 門鈴
組裝電路后,使用交流插座為門鈴供電。現在,只要按下 IoT 門鈴按鈕,智能手機就會開始播放一首名為“123”的歌曲,并會收到一條消息,其中包含如下所示的網頁鏈接,其中可以看到實時視頻源。
此智能 Wi-Fi 門鈴的完整代碼和工作視頻可在文檔末尾找到,或者您可以從此處下載代碼。如果您對此項目有任何疑問,請將其留在評論部分。
代碼
#include “esp_camera.h”
#include 《WiFi.h》
//
// 警告!!!確保您選擇了 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”
void send_event(const char *event);
const char* ssid = “銀河-M20”;
const char* 密碼 = “ac312124”;
const char *host = “maker.ifttt.com”;
const char *privateKey = “
常量 int buttonPin = 2;
int 按鈕狀態;// 來自輸入引腳的當前讀數
int lastButtonState = LOW; // 輸入引腳的先前讀數
const int led1 = 14;
常量 int 蜂鳴器 = 15;
上次去抖時間 = 0; // 最后一次切換輸出引腳
long debounceDelay = 50; // 去抖時間;如果輸出閃爍則增加
void startCameraServer();
無效設置(){
pinMode(buttonPin,輸入);
pinMode(led1,輸出);
pinMode(蜂鳴器,輸出);
序列號。開始(115200);
Serial.setDebugOutput(true);
序列號.println();
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;
//用高規格初始化以預分配更大的緩沖區
if(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);
#endif
// 攝像頭初始化
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf(”Camera init failed with error 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);
#if 定義(CAMERA_MODEL_M5STACK_WIDE)
s-》set_vflip(s, 1);
s-》set_hmirror(s, 1);
#endif
WiFi.begin(ssid, 密碼);
int led = 低;
而(WiFi.status()!= WL_CONNECTED){
延遲(500);
Serial.print(”。“);
數字寫入(led1,led);
領導=!領導;
}
Serial.println(”“);
Serial.println(”WiFi 連接“);
數字寫入(led1,高);
startCameraServer();
Serial.print(”相機準備好了!使用‘http://“);
Serial.print(WiFi.localIP());
Serial.println(”’要連接“);
}
void loop() {
while (WiFi.status() == WL_DISCONNECTED) {
ESP.restart();
數字寫入(led1,低);
Serial.print(”連接丟失“);
}
int 閱讀 = digitalRead(buttonPin);
如果(閱讀!= lastButtonState){
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) 》 debounceDelay)
{
// 如果按鈕狀態發生了變化:
if (reading != buttonState)
{
Serial.print(”Button now “);
Serial.println(HIGH == reading ? ”HIGH“ : ”LOW“);
按鈕狀態 = 閱讀;
// 當按鈕處于 LOW 狀態(拉高)時,按鈕已被按下,因此發送事件。
if (buttonState == LOW) {
send_event(”button_pressed“);
Serial.print(”按下按鈕“);
數字寫入(蜂鳴器,高);
延遲(3000);
數字寫入(蜂鳴器,低);
}
}
}
// 保存讀數。下一次循環,
lastButtonState = reading;
}
void send_event(const char *event)
{
Serial.print(”連接到“);
串行.println(主機);
// 使用 WiFiClient 類創建 TCP 連接
WiFiClient 客戶端;
常量 int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println(”連接失敗“);
返回;
}
// 我們現在為請求創建一個 URI
String url = ”/trigger/“;
網址 += 事件;
url += ”/with/key/“;
網址 += 私鑰;
Serial.print(”請求網址:“);
序列號.println(url);
// 這會將請求發送到服務器
client.print(String(”GET “) + url + ” HTTP/1.1\r\n“ +
”Host: “ + host + ”\r\n“ +
”Connection:關閉\r\n\r\n“);
while(client.connected())
{
if(client.available())
{
String line = client.readStringUntil(‘\r’);
串行打印(行);
} else {
// 還沒有數據,請稍等
delay(50);
};
}
Serial.println();
Serial.println(”關閉連接“);
客戶端.stop();
}
評論
查看更多