資料介紹
描述
我建造 Garage MC 是因為我想了解更多關于電子學的知識。作為獎勵,我想下次我出去讓車庫門開著時,它會節省我的屁股。
*我在 2021 年 1 月 6 日添加了一個更新,其中包含 OTA 更新和 MQTT 到 Home Assistant(詳情如下)*
我的目標
- 能夠監控車庫門的狀態(關閉/半開/打開)。
- 能夠用我的安卓手機(我的妻子用她的蘋果手機)控制(打開/關閉)車庫門。
- 學習新東西。
- 不花很多錢。
第 1 步:項目規劃
在這個項目之前,我從亞馬遜購買了一個兼容 Arduino 的入門套件。所以我是電子產品的初學者,只是學習繩索。但我確實受益于 15 年前做一些計算機編程,所以我能夠在 Arduino IDE 上快速學習 C++ 編碼。
車庫開門器:首先,我必須確定我是否可以輕松地將微控制器與我的 Liftmaster 車庫開門器連接起來。幸運的是,Liftmaster 使用兩條線在常開(認為是打開的開關)狀態下連接回壁掛式遙控器。當按下壁掛式遙控器上的按鈕時,它會通過“短路”電線并觸發門打開或關閉來短暫完成電路。哦,別忘了檢查這些電線上的電壓……Liftmaster 手冊上說這些電線大約是 20 伏(不是 120 伏),但您的設備可能會有所不同。
微控制器:接下來,我必須決定如何將 Garage MC 連接到互聯網。我最初考慮使用 ENC28J60 以太網板,雖然我更喜歡硬線連接,但將線路連接到我的路由器會比它的價值更麻煩。我研究了 wifi 板并決定使用 NodeMCU ESP8266,因為它們成本低且具有多個 GPIO 引腳。
手機應用程序:有多種方法可以通過手機連接到 NodeMCU,包括通過 SMS 消息、將 NodeMCU 用作 Web 服務器等。對我來說,使用 Blynk 應用程序是啟動和運行最簡單、最快捷的方式。
車庫門監控:我決定使用兩個霍爾效應傳感器來監控車庫門的位置。可能已經可以從 Liftmaster 單元獲取門的位置甚至行進方向。但是,如果有人拉動緊急釋放繩并手動打開門,傳感器仍會通知我門已打開。
第 2 步:開發
NodeMCU:我首先將 NodeMCU 插入面包板并通過 USB 連接到我的計算機為其供電。下面的鏈接有一個很好的教程,用于在 Arduino IDE 上初始設置 NodeMCU:
Blynk :接下來,我將 NodeMCU 連接到互聯網和手機上的 Blynk 應用程序。
面包板:是時候添加組件了。雖然我是在裝上所有組件后制作了 Fritzing 電路圖,但我在這里添加了它,以便更容易參考...

項目代碼:我附上了我的項目的完整代碼。我試圖評論它,但如果有什么你不明白,或者我可以改進,請告訴我。我在教程中添加了一些小代碼片段來強調一些事情,例如:
- 我使我的代碼非阻塞。這意味著它沒有“延遲()”語句(好吧,設置中有一個等待串行端口)。相反,我依賴于基于“SimpleTimer”庫的 Blynk 計時器。

首先是繼電器(控制器):我使用的繼電器是一個單通道繼電器,觸發“LOW”以激活。繼電器需要 5 伏電壓,所以我使用 NodeMCU 上的 VIN 引腳為其供電。繼電器有兩個用途。
- 首先是激活車庫門開啟器。這是通過將一根電線從車庫門開啟器連接到繼電器上的公共 (COM) 引腳來完成的。第二根線連接到繼電器上的 N/O(常開)引腳。當繼電器被觸發(300 毫秒)時,電路閉合。
- 第二個目的是保護 NodeMCU 免受車庫門開啟器的 20 伏電線的影響,因為 NodeMCU 上的數字引腳只能承受 3.3 伏電壓。
我使用了兩個函數來觸發我的繼電器,使其無阻塞。在我的 Blynk 應用程序中按下按鈕時,它會調用一個函數來激活門。請注意,“ActivateDoor()”僅在按下按鈕時(上升 = 1)很重要,而不是在釋放按鈕時,否則您將激活門兩次。ActivateDoorRelay 函數將繼電器引腳設置為“LOW”,然后設置一個 300 毫秒的計時器,而不是使用“delay()”。然后定時器觸發第二個功能將引腳重置為“HIGH”以關閉繼電器。我正在檢查該州的原因
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
}
霍爾效應傳感器(監視器):霍爾效應傳感器監控車庫門的位置。傳感器是非鎖定的并且是數字的(它可以感應或不感應磁鐵;模擬輸出傳感器將測量磁鐵的強度)。我在車庫門上使用了兩個釹磁鐵(一起使它們更堅固)來觸發傳感器。我有一些 CAT6 電纜,所以我將它從車庫天花板上的 NodeMCU 連接到每個霍爾傳感器。車庫門可以處于三種狀態之一(因為我不在乎門的移動方向):
- 關閉:門關閉位置的霍爾效應傳感器由磁鐵激活。
- 打開:門打開位置的霍爾效應傳感器由磁鐵激活。
- 半開:霍爾效應傳感器均未激活。因此,門可以在打開位置移動或停止。

我不喜歡輪詢事件的發生。因此,霍爾傳感器使用“中斷”來指示狀態變化(例如門關閉移動)。中斷就是當霍爾傳感器發生狀態變化時,它會中斷程序代碼以立即運行一個短函數。
// 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
}
被動壓電蜂鳴器:當門被遠程激活(使用 Blynk 應用程序)時,我想提醒車庫里的任何人門即將移動。所以我加了一個蜂鳴器來播放一首短歌。我在電路中添加了一個 100 歐姆的電阻,盡管我不確定是否有必要。我還讓這首歌不阻塞。盡管這需要我獲得歌曲的長度,所以我在完成之前不會激活門。
LED :最后,我添加了兩個 LED,一個綠色和一個紅色。每個 LED 在其電路中都需要一個 220 歐姆的電阻器。綠色 LED 表示 Garage MC 已連接到 Blynk 服務器。紅色 LED 表示 Garage MC 已失去連接。
我的編程流程:如果您通常不在代碼中使用計時器,我的程序流程可能難以掌握。它基本上是這樣工作的:
- setup() 函數將計時器設置為:1。檢查互聯網connection.2。檢查車庫門的狀態 (CheckGarageState),如果門打開時間過長,它會更新 Blynk 應用程序并向 Blynk 發送通知。
- loop() 函數使計時器保持運行。
- 當車庫門的狀態發生變化(關閉到打開)時,會觸發中斷。中斷標記狀態更改,然后設置即時計時器(10 毫秒)來檢查車庫門的狀態 (CheckGarageState),從而更新 Blynk 應用程序。
第 3 組:是時候把它放在一起并連接起來了
我希望 Garage MC 看起來是半專業的,所以我決定將所有組件安裝在 Perfboard 上(帶有預鉆孔的單個銅墊)。有了這個,我必須學習如何焊接。這不一定是困難的,但可能很難做好。
案例:一臺 3D 打印機在我兒子的圣誕清單上。希望圣誕老人能通過,因為我也想使用它。事實證明,我有一個舊的 Chamberlain myQ(現在是“Merlin”),我將它拆開、切割和鉆孔,然后把它變成一個項目案例。我認為結果沒問題,即使繼電器伸出底部。
Perfboard :根據機箱的大小,我選擇了適合機箱的 perfboard,并且幾乎適合 NodeMCU。正如您在我的圖表中看到的那樣,每側的頂部引腳不適合(D0 和 A0),但無論如何我都沒有使用它們。我沒有刪除它們,它們只是沒有連接到任何東西。

我在 Perfboard 上焊接了兩個插頭引腳(16 個引腳長,但 NodeMCU 每側有 15 個引腳)。因此,NodeMCU 位于底部的 15 個引腳上。我主要在 Perfboard 底部焊接連接線(有幾個例外)和頂部的組件。長話短說……
并將其安裝在車庫門開啟器上方的車庫中(黃色 CAT6 電纜通過門軌連接到霍爾傳感器)..
電源:天花板上有一個用于 Liftmaster 開啟器的電源插座。所以我決定讓事情變得簡單。我插入了舊的黑莓手機充電器并使用舊的 USB 電纜為 Garage MC 供電。
我會做些什么不同的事情?
我實際上對我的最終結果很滿意。但是我會做一些改變:
- 我將霍爾效應傳感器的螺絲連接器彼此相對放置,認為我很聰明并且節省空間。這使得將 CAT6 電纜的電線完美彎曲到位變得困難。下次我肯定會采取直接的方法,并將連接器并排放置。
- 完成 - 我正在考慮添加通過無線 (OTA) 更新我的代碼的功能,這樣我就不必拿出我的梯子來進行更改。
V1.1 更新
在 Covid 呆在家里的圣誕假期期間,我開始學習和設置 Home Assistant。因此,我決定讓 Garage MC 報告回來并由 Home Assistant 控制。因此,我決定對我的代碼進行以下更改:添加 OTA 更新,并添加 MQTT 以與 Home Assistant 通信。
OTA 更新
這是我自 10 月以來對 Garage MC 所做的第一次更新,因為坦率地說,它不需要更新。但是,爬梯子進行更新很痛苦,所以我實施了 OTA 更新。

我在我的 Blynk 應用程序中添加了一個開關,以便打開和關閉 OTA 更新,因為我不希望它一直運行。接下來,我添加了#include
我添加了一個 MD5 散列密碼,一個超時(關閉更新過程以防我忘記),并讓 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");
});
我的主循環已更新,因此如果打開 OTA 更新,其他一切都會停止(我發現如果 Blynk 仍在運行,更新會很慢或失敗)。
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();
}
最后,當我在 Blynk 應用程序中撥動開關時,它會向虛擬引腳 V0 發送一條消息(off=1 和 on =2,但我希望它是一個布爾值):
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 更新所需的一切。我喜歡這樣一個事實,除非我通過撥動 Blynk 中的開關來采取行動,否則它不會運行。
MQTT 到家庭助理
我不會進入家庭助理,因為我只是在學習它。但我建議在 YouTube 上搜索 JuanMTech。而且我只是幾乎不了解 MQTT,所以在那里也不會有太大幫助。我使用了流行的#include
最簡單的方法是連接到 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);
當車庫門狀態發生變化(open->ajar->closed)時,我將更改發布到 Home Assistant:
// topic = CLIENT_NAME/state
// payload = door state (open/ajar/closed)
client.publish(topic.c_str(), payload.c_str(), retain);
到目前為止,一切都很好。現在我只需要找出 Home Assistant 來處理數據!
最后的評論
我故意沒有詳細介紹設置 Blynk 應用程序和控件的具體細節。雖然我添加了原理圖,但我也沒有詳細介紹我的生產布線等。我相信我們自己嘗試會學到更多。話雖如此,如果您遇到困難或需要幫助才能使項目正常運行(或想知道我為什么要做某事),請給我發消息,我很樂意提供幫助。
?
- Pi Skype監視器開源分享
- 無線串口監視器開源分享
- 車庫門監視器開源分享
- 蜂窩連接的蜂巢監視器開源分享
- 樹莓派監視器開源項目
- 管道監視器開源設計
- CPU和RAM使用監視器開源分享
- Blynk車庫門監視器/開啟器
- 工廠監視器(傳感器到前端)開源分享
- 城市花園監視器開源分享
- 小馬駒監視器開源分享
- 健康監視器開源分享
- OctoPrint打印監視器開源分享
- 電源監視器開源項目
- 兩通道溫度監視器雙PWM自動風扇速度控制器和五GPIO集成器
- 典型電池監視器電路圖分享 814次閱讀
- 簡單的電池監視器電路圖 726次閱讀
- 如何創建自定義監視器? 656次閱讀
- 微型溫度監視器控制3速風扇 594次閱讀
- 光纖應用中的監視器校準 1082次閱讀
- 微型溫度監測器驅動3速風扇控制器 863次閱讀
- 如何通過Raspberry Pi設置CE電流監視器 2342次閱讀
- Cypress懷孕監視器CY8C38系列的性能特性及應用方案 2498次閱讀
- 基于AD603與MC34063的AGC控制器設計 4858次閱讀
- KUKA C4如何使用診斷監視器? 3877次閱讀
- 具監視器的800mA單電阻器堅固型線性穩壓器LT3089 1189次閱讀
- 揭秘液晶顯示器和液晶監視器的七大不同點 2125次閱讀
- 鋰離子電池和穩壓器監視器電路圖 1807次閱讀
- 液晶監視器的選購與保養 1077次閱讀
- 120Hz+全高清LCD監視器新技術應用解析 1403次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論