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