電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>車庫MC(監(jiān)視器和控制器)開源分享

車庫MC(監(jiān)視器和控制器)開源分享

2022-11-16 | zip | 1.25 MB | 次下載 | 免費(fèi)

資料介紹

描述

我建造 Garage MC 是因?yàn)槲蚁肓私飧嚓P(guān)于電子學(xué)的知識(shí)。作為獎(jiǎng)勵(lì),我想下次我出去讓車庫門開著時(shí),它會(huì)節(jié)省我的屁股。

*我在 2021 年 1 月 6 日添加了一個(gè)更新,其中包含 OTA 更新和 MQTT 到 Home Assistant(詳情如下)*

我的目標(biāo)

  • 能夠監(jiān)控車庫門的狀態(tài)(關(guān)閉/半開/打開)。
  • 能夠用我的安卓手機(jī)(我的妻子用她的蘋果手機(jī))控制(打開/關(guān)閉)車庫門。
  • 學(xué)習(xí)新東西。
  • 不花很多錢。

第 1 步:項(xiàng)目規(guī)劃

在這個(gè)項(xiàng)目之前,我從亞馬遜購買了一個(gè)兼容 Arduino 的入門套件。所以我是電子產(chǎn)品的初學(xué)者,只是學(xué)習(xí)繩索。但我確實(shí)受益于 15 年前做一些計(jì)算機(jī)編程,所以我能夠在 Arduino IDE 上快速學(xué)習(xí) C++ 編碼。

車庫開門器:首先,我必須確定我是否可以輕松地將微控制器與我的 Liftmaster 車庫開門器連接起來。幸運(yùn)的是,Liftmaster 使用兩條線在常開(認(rèn)為是打開的開關(guān))狀態(tài)下連接回壁掛式遙控器。當(dāng)按下壁掛式遙控器上的按鈕時(shí),它會(huì)通過“短路”電線并觸發(fā)門打開或關(guān)閉來短暫完成電路。哦,別忘了檢查這些電線上的電壓……Liftmaster 手冊上說這些電線大約是 20 伏(不是 120 伏),但您的設(shè)備可能會(huì)有所不同。

微控制器:接下來,我必須決定如何將 Garage MC 連接到互聯(lián)網(wǎng)。我最初考慮使用 ENC28J60 以太網(wǎng)板,雖然我更喜歡硬線連接,但將線路連接到我的路由器會(huì)比它的價(jià)值更麻煩。我研究了 wifi 板并決定使用 NodeMCU ESP8266,因?yàn)樗鼈兂杀镜颓揖哂卸鄠€(gè) GPIO 引腳。

手機(jī)應(yīng)用程序:有多種方法可以通過手機(jī)連接到 NodeMCU,包括通過 SMS 消息、將 NodeMCU 用作 Web 服務(wù)器等。對(duì)我來說,使用 Blynk 應(yīng)用程序是啟動(dòng)和運(yùn)行最簡單、最快捷的方式。

車庫門監(jiān)控:我決定使用兩個(gè)霍爾效應(yīng)傳感器來監(jiān)控車庫門的位置。可能已經(jīng)可以從 Liftmaster 單元獲取門的位置甚至行進(jìn)方向。但是,如果有人拉動(dòng)緊急釋放繩并手動(dòng)打開門,傳感器仍會(huì)通知我門已打開。

第 2 步:開發(fā)

NodeMCU:我首先將 NodeMCU 插入面包板并通過 USB 連接到我的計(jì)算機(jī)為其供電。下面的鏈接有一個(gè)很好的教程,用于在 Arduino IDE 上初始設(shè)置 NodeMCU:

Blynk :接下來,我將 NodeMCU 連接到互聯(lián)網(wǎng)和手機(jī)上的 Blynk 應(yīng)用程序。

面包板:是時(shí)候添加組件了。雖然我是在裝上所有組件后制作了 Fritzing 電路圖,但我在這里添加了它,以便更容易參考...

pYYBAGNy7hmAYpOfAAOkc328isA491.jpg
Garage MC - Fritzing 圖
?

項(xiàng)目代碼:我附上了我的項(xiàng)目的完整代碼。我試圖評(píng)論它,但如果有什么你不明白,或者我可以改進(jìn),請告訴我。我在教程中添加了一些小代碼片段來強(qiáng)調(diào)一些事情,例如:

  • 我使我的代碼非阻塞。這意味著它沒有“延遲()”語句(好吧,設(shè)置中有一個(gè)等待串行端口)。相反,我依賴于基于“SimpleTimer”庫的 Blynk 計(jì)時(shí)器。
poYBAGNy7h-AVugYAAqblz67eRE834.jpg
我的工作區(qū)
?

首先是繼電器(控制器):我使用的繼電器是一個(gè)單通道繼電器,觸發(fā)“LOW”以激活。繼電器需要 5 伏電壓,所以我使用 NodeMCU 上的 VIN 引腳為其供電。繼電器有兩個(gè)用途。

  • 首先是激活車庫門開啟器。這是通過將一根電線從車庫門開啟器連接到繼電器上的公共 (COM) 引腳來完成的。第二根線連接到繼電器上的 N/O(常開)引腳。當(dāng)繼電器被觸發(fā)(300 毫秒)時(shí),電路閉合。
  • 第二個(gè)目的是保護(hù) NodeMCU 免受車庫門開啟器的 20 伏電線的影響,因?yàn)?NodeMCU 上的數(shù)字引腳只能承受 3.3 伏電壓。

我使用了兩個(gè)函數(shù)來觸發(fā)我的繼電器,使其無阻塞。在我的 Blynk 應(yīng)用程序中按下按鈕時(shí),它會(huì)調(diào)用一個(gè)函數(shù)來激活門。請注意,“ActivateDoor()”僅在按下按鈕時(shí)(上升 = 1)很重要,而不是在釋放按鈕時(shí),否則您將激活門兩次。ActivateDoorRelay 函數(shù)將繼電器引腳設(shè)置為“LOW”,然后設(shè)置一個(gè) 300 毫秒的計(jì)時(shí)器,而不是使用“delay()”。然后定時(shí)器觸發(fā)第二個(gè)功能將引腳重置為“HIGH”以關(guān)閉繼電器。我正在檢查該州的原因

BLYNK_WRITE(V10) {
    if (param.asInt()) {  // only do it on button "rising=1"
        ActivateDoor();     // trigger the door
    }
}

void ActivateDoor() {
    activateState = garageState; // get garage state when the button was pressed
    long songLength = PlaySong(); // Play a song
    // Wait for the song to finish, then activate the relay
    myTimer.setTimeout(songLength, ActivateDoorRelay);
}

void ActivateDoorRelay() {
    // only trigger the relay if the state hasn't changed since the button press
    if (garageState == activateState) {
        digitalWrite(RELAY1_PIN, LOW); // trigger the relay to activate the door
        myTimer.setTimeout(300, ActivateDoorRelayReset);  // Wait 300ms
    }
}

void ActivateDoorRelayReset() {
    digitalWrite(RELAY1_PIN, HIGH);  // Deactivate the door relay
    Blynk.virtualWrite(V10, 0);  // Reset the Blynk app switch
}

霍爾效應(yīng)傳感器(監(jiān)視器):霍爾效應(yīng)傳感器監(jiān)控車庫門的位置。傳感器是非鎖定的并且是數(shù)字的(它可以感應(yīng)或不感應(yīng)磁鐵;模擬輸出傳感器將測量磁鐵的強(qiáng)度)。我在車庫門上使用了兩個(gè)釹磁鐵(一起使它們更堅(jiān)固)來觸發(fā)傳感器。我有一些 CAT6 電纜,所以我將它從車庫天花板上的 NodeMCU 連接到每個(gè)霍爾傳感器。車庫門可以處于三種狀態(tài)之一(因?yàn)槲也辉诤蹰T的移動(dòng)方向):

  • 關(guān)閉:門關(guān)閉位置的霍爾效應(yīng)傳感器由磁鐵激活。
  • 打開:門打開位置的霍爾效應(yīng)傳感器由磁鐵激活。
  • 半開:霍爾效應(yīng)傳感器均未激活。因此,門可以在打開位置移動(dòng)或停止。
pYYBAGNy7iOAPr5qAAOaMxMu5Gk722.jpg
霍爾效應(yīng)傳感器(距磁鐵約 2 厘米)
?

我不喜歡輪詢事件的發(fā)生。因此,霍爾傳感器使用“中斷”來指示狀態(tài)變化(例如門關(guān)閉移動(dòng))。中斷就是當(dāng)霍爾傳感器發(fā)生狀態(tài)變化時(shí),它會(huì)中斷程序代碼以立即運(yùn)行一個(gè)短函數(shù)。

// Interrupt Declarations
// ESP boards need ICACHE_RAM_ATTR included
void ICACHE_RAM_ATTR InterruptDoorClosed();
void ICACHE_RAM_ATTR InterruptDoorOpen();

// this is only a snippet from the "setup" function
void setup() {
  // Interrupts set for the two hall sensors activated on a CHANGE of state
  // the Hall sensors require a pullup resistor, I used the internal pullup
  pinMode(HALL_CLOSED_PIN,INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(HALL_CLOSED_PIN), InterruptDoorClosed, CHANGE);
  pinMode(HALL_OPEN_PIN,INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(HALL_OPEN_PIN), InterruptDoorOpen, CHANGE);
}

// Interrupt for the Hall Sensor at the Door CLOSED point
// activated on CHANGE and Sets a timer to immediately CheckGarageState
void InterruptDoorClosed() {
    hallClosedState = digitalRead(HALL_CLOSED_PIN); // get the sensor state
    myTimer.setTimeout(10, GarageStateChanged); // run the function in 10ms
}
// Interrupt for the Hall Sensor at the Door OPEN point
// activated on CHANGE and Sets a timer to immediately CheckGarageState
void InterruptDoorOpen() {
    hallOpenState = digitalRead(HALL_OPEN_PIN); // get the sensor state
    myTimer.setTimeout(10, GarageStateChanged); // run the function in 10ms
}

被動(dòng)壓電蜂鳴器:當(dāng)門被遠(yuǎn)程激活(使用 Blynk 應(yīng)用程序)時(shí),我想提醒車庫里的任何人門即將移動(dòng)。所以我加了一個(gè)蜂鳴器來播放一首短歌。我在電路中添加了一個(gè) 100 歐姆的電阻,盡管我不確定是否有必要。我還讓這首歌不阻塞。盡管這需要我獲得歌曲的長度,所以我在完成之前不會(huì)激活門。

LED :最后,我添加了兩個(gè) LED,一個(gè)綠色和一個(gè)紅色。每個(gè) LED 在其電路中都需要一個(gè) 220 歐姆的電阻器。綠色 LED 表示 Garage MC 已連接到 Blynk 服務(wù)器。紅色 LED 表示 Garage MC 已失去連接。

我的編程流程:如果您通常不在代碼中使用計(jì)時(shí)器,我的程序流程可能難以掌握。它基本上是這樣工作的:

  • setup() 函數(shù)將計(jì)時(shí)器設(shè)置為:1。檢查互聯(lián)網(wǎng)connection.2。檢查車庫門的狀態(tài) (CheckGarageState),如果門打開時(shí)間過長,它會(huì)更新 Blynk 應(yīng)用程序并向 Blynk 發(fā)送通知。
  • loop() 函數(shù)使計(jì)時(shí)器保持運(yùn)行。
  • 當(dāng)車庫門的狀態(tài)發(fā)生變化(關(guān)閉到打開)時(shí),會(huì)觸發(fā)中斷。中斷標(biāo)記狀態(tài)更改,然后設(shè)置即時(shí)計(jì)時(shí)器(10 毫秒)來檢查車庫門的狀態(tài) (CheckGarageState),從而更新 Blynk 應(yīng)用程序。

第 3 組:是時(shí)候把它放在一起并連接起來了

我希望 Garage MC 看起來是半專業(yè)的,所以我決定將所有組件安裝在 Perfboard 上(帶有預(yù)鉆孔的單個(gè)銅墊)。有了這個(gè),我必須學(xué)習(xí)如何焊接。這不一定是困難的,但可能很難做好。

案例:一臺(tái) 3D 打印機(jī)我兒子的圣誕清單上。希望圣誕老人能通過,因?yàn)槲乙蚕胧褂盟?/font>事實(shí)證明,我有一個(gè)舊的 Chamberlain myQ(現(xiàn)在是“Merlin”),我將它拆開、切割和鉆孔,然后把它變成一個(gè)項(xiàng)目案例。我認(rèn)為結(jié)果沒問題,即使繼電器伸出底部。

Perfboard :根據(jù)機(jī)箱的大小,我選擇了適合機(jī)箱的 perfboard,并且?guī)缀踹m合 NodeMCU。正如您在我的圖表中看到的那樣,每側(cè)的頂部引腳不適合(D0 和 A0),但無論如何我都沒有使用它們。我沒有刪除它們,它們只是沒有連接到任何東西。

poYBAGNy7iqANR9jAAI9QIxLka0609.jpg
穿孔板布局
?

我在 Perfboard 上焊接了兩個(gè)插頭引腳(16 個(gè)引腳長,但 NodeMCU 每側(cè)有 15 個(gè)引腳)。因此,NodeMCU 位于底部的 15 個(gè)引腳上。我主要在 Perfboard 底部焊接連接線(有幾個(gè)例外)和頂部的組件。長話短說……

并將其安裝在車庫門開啟器上方的車庫中(黃色 CAT6 電纜通過門軌連接到霍爾傳感器)..

電源:天花板上有一個(gè)用于 Liftmaster 開啟器的電源插座。所以我決定讓事情變得簡單。我插入了舊的黑莓手機(jī)充電器并使用舊的 USB 電纜為 Garage MC 供電。

我會(huì)做些什么不同的事情?

我實(shí)際上對(duì)我的最終結(jié)果很滿意。但是我會(huì)做一些改變:

  • 我將霍爾效應(yīng)傳感器的螺絲連接器彼此相對(duì)放置,認(rèn)為我很聰明并且節(jié)省空間。這使得將 CAT6 電纜的電線完美彎曲到位變得困難。下次我肯定會(huì)采取直接的方法,并將連接器并排放置。
  • 完成 - 我正在考慮添加通過無線 (OTA) 更新我的代碼的功能,這樣我就不必拿出我的梯子來進(jìn)行更改。

V1.1 更新

在 Covid 呆在家里的圣誕假期期間,我開始學(xué)習(xí)和設(shè)置 Home Assistant。因此,我決定讓 Garage MC 報(bào)告回來并由 Home Assistant 控制。因此,我決定對(duì)我的代碼進(jìn)行以下更改:添加 OTA 更新,并添加 MQTT 以與 Home Assistant 通信。

OTA 更新

這是我自 10 月以來對(duì) Garage MC 所做的第一次更新,因?yàn)樘孤实卣f,它不需要更新。但是,爬梯子進(jìn)行更新很痛苦,所以我實(shí)施了 OTA 更新。

poYBAGNy7jiAH2OSAAC6hFMSydc445.png
Blynk 應(yīng)用程序的小更新以打開/關(guān)閉 OTA 更新
?

我在我的 Blynk 應(yīng)用程序中添加了一個(gè)開關(guān),以便打開和關(guān)閉 OTA 更新,因?yàn)槲也幌M恢边\(yùn)行。接下來,我添加了#include 庫。

我添加了一個(gè) MD5 散列密碼,一個(gè)超時(shí)(關(guān)閉更新過程以防我忘記),并讓 LED 閃爍,這樣我就知道 GarageMC 處于“更新模式”。全局變量如下:

// OTA variables
#define CLIENT_NAME   "GarageMC"  // For MQTT topics, MQTT Client ID, and ArduinoOTA
const char ota_pass[]           = SECRET_OTA_PWD;
const unsigned long OTA_TIMEOUT = 600000;  // Turn off OTA after 10 min. if no update
unsigned long otaTimeout        = 0;        // End time for OTA = millis()+OTA_TIMEOUT
bool otaOn                      = false;    // set to "true" to turn on OTA updates
const int OTA_BLINK_DELAY       = 300;      // blink the leds while OTA is ON
unsigned long otaBlinkTimer     = 0;        // next led blink time

在 setup() 中,我按如下方式初始化 OTA:

ArduinoOTA.setHostname(CLIENT_NAME);
ArduinoOTA.setPasswordHash(ota_pass);
ArduinoOTA.onStart([]() {
    DEBUG_PRINTLN("OTA Starting update");
    digitalWrite(WIFI_ON_PIN, true);
    digitalWrite(WIFI_OFF_PIN, true);
});
ArduinoOTA.onEnd([]() {
    DEBUG_PRINTLN("OTA Finished");
});

我的主循環(huán)已更新,因此如果打開 OTA 更新,其他一切都會(huì)停止(我發(fā)現(xiàn)如果 Blynk 仍在運(yùn)行,更新會(huì)很慢或失?。?。

if (otaOn) {
    ArduinoOTA.handle();
    if (millis() > otaTimeout) {  // timeout if no upload, then restart
        ESP.restart();
    }
    // blink the red and green leds while OTA is on
    if (millis() > otaBlinkTimer) {
        SetWifiLeds(!digitalRead(WIFI_ON_PIN));
        otaBlinkTimer = millis() + OTA_BLINK_DELAY;
    }
} else {
    if (Blynk.connected()) {Blynk.run();} // run Blynk if it's connected
    myTimer.run();                        // Blynk Events Timer (run either way)
    // MQTT - loop or reconnect if needed
    mqttLoop();
}

最后,當(dāng)我在 Blynk 應(yīng)用程序中撥動(dòng)開關(guān)時(shí),它會(huì)向虛擬引腳 V0 發(fā)送一條消息(off=1 和 on =2,但我希望它是一個(gè)布爾值):

BLYNK_WRITE(V0) {
    otaOn = param.asInt() - 1;
    DEBUG_PRINTLN((String)"V0: " + otaOn);
    if (otaOn) {                            // OTA turned ON
        otaTimeout = millis() + OTA_TIMEOUT;  // Timeout end time
        ArduinoOTA.begin();                   // Start the OTA service
    } else {                                // OTA turned OFF
        ESP.restart();              // Restart to turn stop ArduinoOTA service
    }
}

從 Arduino IDE 處理 OTA 更新所需的一切。我喜歡這樣一個(gè)事實(shí),除非我通過撥動(dòng) Blynk 中的開關(guān)來采取行動(dòng),否則它不會(huì)運(yùn)行。

MQTT 到家庭助理

我不會(huì)進(jìn)入家庭助理,因?yàn)槲抑皇窃趯W(xué)習(xí)它。但我建議在 YouTube 上搜索 JuanMTech。而且我只是幾乎不了解 MQTT,所以在那里也不會(huì)有太大幫助。我使用了流行的#include 庫。詳細(xì)信息可以在我的完整代碼中找到。但基本上,作為客戶端,您連接到 Home Assistant 上的 MQTT 代理。您將更新“發(fā)布”到 MQTT 代理,并“訂閱”您希望通過“回調(diào)”函數(shù)接收更新的主題。

最簡單的方法是連接到 MQTT 代理:

// subscribe to the control topic which can "activate" the garage door (open/close)
const char topicGarageControl[] = CLIENT_NAME"/control";
// publish to the state topics, the state of the door
const char topicGarageState[]   = CLIENT_NAME"/state";

WiFiClient espClient;
PubSubClient client(espClient);    // client for connection to MQTT broker
client.setServer(mqtt_server, mqtt_port);    // server to connect to
client.setCallback(callback);    // the "callback" function for subscribed topics
client.connect(mqtt_client_name, mqtt_user, mqtt_pass);    // connect to MQTT broker

// after connecting, subscribe to topics you want
client.subscribe(topicGarageControl);

當(dāng)車庫門狀態(tài)發(fā)生變化(open->ajar->closed)時(shí),我將更改發(fā)布到 Home Assistant:

// topic = CLIENT_NAME/state
// payload = door state (open/ajar/closed)
client.publish(topic.c_str(), payload.c_str(), retain);

到目前為止,一切都很好。現(xiàn)在我只需要找出 Home Assistant 來處理數(shù)據(jù)!

最后的評(píng)論

我故意沒有詳細(xì)介紹設(shè)置 Blynk 應(yīng)用程序和控件的具體細(xì)節(jié)。雖然我添加了原理圖,但我也沒有詳細(xì)介紹我的生產(chǎn)布線等。我相信我們自己嘗試會(huì)學(xué)到更多。話雖如此,如果您遇到困難或需要幫助才能使項(xiàng)目正常運(yùn)行(或想知道我為什么要做某事),請給我發(fā)消息,我很樂意提供幫助。

?


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)