“早上好。現(xiàn)在是早上 7 點(diǎn),馬里布的天氣是 72 度……”這是 JARVIS 在漫威電影宇宙中被介紹的第一句話。大多數(shù)鋼鐵俠粉絲應(yīng)該能夠回憶起這個(gè)場景,并記得 JARVIS 能夠在早上打開一個(gè)窗口(有點(diǎn))并提供時(shí)間和天氣的更新。在電影中,窗戶眼鏡實(shí)際上是由透明觸摸顯示器制成的,因此 JARVIS 能夠使其從黑色變?yōu)橥该鳎⒃谄渖巷@示天氣統(tǒng)計(jì)數(shù)據(jù)。但是,在現(xiàn)實(shí)中,我們離透視觸摸屏還很遠(yuǎn),離我們?cè)浇木褪亲詣?dòng)控制百葉窗或約束。
因此,在這個(gè)項(xiàng)目中,我們將準(zhǔn)確地構(gòu)建它,我們將構(gòu)建一個(gè)自動(dòng)電動(dòng)百葉窗,它將在預(yù)定義的時(shí)間自動(dòng)打開和關(guān)閉。
構(gòu)建 Arduino 自動(dòng)百葉窗所需的組件
項(xiàng)目比較簡單,需要的組件也不多。只需收集下面列出的物品。
節(jié)點(diǎn)單片機(jī)
步進(jìn)電機(jī) – 28BYJ-48
步進(jìn)電機(jī)驅(qū)動(dòng)模塊
LM117-3.3V
電容器(10uf,1uf)
12V 直流適配器
性能板
焊接套件
3D打印機(jī)
使用 Arduino 控制卷簾
現(xiàn)在市場上的百葉窗種類繁多,但最常用的是一根帶有珠子的繩子(如下圖),可以拉動(dòng)以打開或關(guān)閉百葉窗。
當(dāng)我們順時(shí)針方向拉動(dòng)這條圓形繩索時(shí),百葉窗會(huì)打開,當(dāng)我們逆時(shí)針方向拉動(dòng)這條繩索時(shí),百葉窗就會(huì)關(guān)閉。因此,如果我們要使這個(gè)過程自動(dòng)化,我們所要做的就是使用電機(jī)將這條繩子順時(shí)針或逆時(shí)針方向拉動(dòng),我們就可以完成它。事實(shí)上,這就是我們?cè)谶@個(gè)項(xiàng)目中要做的;我們將使用 28BYJ-48 步進(jìn)電機(jī)和 NodeMCU 來拉珠繩。
設(shè)計(jì)和制造窗戶百葉窗齒輪
這個(gè)項(xiàng)目的電子部分相當(dāng)簡單直接,具有挑戰(zhàn)性的部分是建造可以拉珠繩的盲齒輪。所以讓我們從盲齒輪設(shè)計(jì)開始這篇文章,我不打算詳細(xì)介紹如何設(shè)計(jì)齒輪,但這個(gè)基本概念應(yīng)該對(duì)你有所幫助。下面顯示了帶有珠子的繩子的圖像。
再次,繩子有很多種類型,但最常用的繩子是每個(gè)珠子的中心距為6mm,每個(gè)珠子的直徑為4mm。使用這些信息,我們可以開始設(shè)計(jì)我們的裝備。如果您百葉窗上的繩索與討論的尺寸相同,您可以跳過此步驟并下載本文提供的 STL 文件并打印齒輪。如果你的繩子有不同的珠子排列,那么這就是你應(yīng)該重新設(shè)計(jì)盲齒輪的方法。
我決定在我的齒輪上安裝 24 顆珠子以獲得最佳的齒輪尺寸,您可以選擇任何接近此的數(shù)字來讓您的齒輪變大或變小。所以現(xiàn)在,我們知道每個(gè)珠子之間的距離是 6 毫米,我們的齒輪上需要 24 個(gè)珠子。將兩者相乘將得到齒輪的周長。有了這些數(shù)據(jù),您就可以計(jì)算出齒輪的半徑。正如您在上圖中看到的,我的齒輪直徑計(jì)算為大約 46 毫米。但請(qǐng)記住,這不是齒輪的實(shí)際直徑,因?yàn)槲覀儧]有考慮到 4mm 的珠子直徑。因此,齒輪的實(shí)際直徑為 42 毫米,我打印并測(cè)試了許多齒輪,然后才找到效果最好的齒輪。
3D打印電機(jī)支架和盲齒輪
除了齒輪,我們還需要一個(gè)可以鉆到墻上并將步進(jìn)電機(jī)固定到位的小外殼,這個(gè)項(xiàng)目中使用的外殼和齒輪如下所示。
您可以在下面給出的 Arduino Blind Control Thingiverse 頁面上找到完整的設(shè)計(jì)文件和 STL 文件。您可以下載并打印您的盲齒輪和電機(jī)箱。
Arduino百葉窗控制電路圖
一旦您準(zhǔn)備好齒輪和組件,就很容易繼續(xù)進(jìn)行電子和軟件部分。物聯(lián)網(wǎng)盲控項(xiàng)目的完整電路圖如下所示。
我們使用 12V 適配器為整個(gè)設(shè)置供電;LM1117-3.3V 穩(wěn)壓器將 12V 轉(zhuǎn)換為 3.3V,可用于為 NodeMCU 板供電。步進(jìn)電機(jī)驅(qū)動(dòng)模塊直接由 12V 適配器供電。我確實(shí)嘗試在 5V 上運(yùn)行步進(jìn)電機(jī),但它沒有提供足夠的扭矩來拉動(dòng)百葉窗,因此請(qǐng)確保您也使用 12V。
除此之外,電路非常簡單,如果您不熟悉步進(jìn)電機(jī),請(qǐng)查看步進(jìn)電機(jī)的基礎(chǔ)知識(shí)文章,了解它的工作原理以及如何與微控制器一起使用。
用于 Arduino 盲控的 Blynk 應(yīng)用程序
在我們進(jìn)入控制百葉窗的 Arduino 程序之前,讓我們打開 blynk 應(yīng)用程序并創(chuàng)建一些按鈕,我們可以使用這些按鈕打開或關(guān)閉百葉窗。稍后我們也將需要它來從 Google Home 進(jìn)行控制。
我剛剛添加了兩個(gè)按鈕來打開和關(guān)閉百葉窗,以及每天上午 10:00 開啟百葉窗的一次性計(jì)時(shí)器。您可以添加多個(gè)計(jì)時(shí)器以在一天中的不同時(shí)間間隔打開或關(guān)閉百葉窗。基本上,當(dāng)我們必須關(guān)閉百葉窗時(shí),我們必須觸發(fā)虛擬引腳 V1,而當(dāng)我們必須打開百葉窗時(shí),我們必須觸發(fā)虛擬引腳 V2。基于此處按下的按鈕控制步進(jìn)電機(jī)的程序?qū)⒕帉懺?Arduino IDE 上,下面將討論相同的內(nèi)容。
使用 Blynk 編程 NodeMCU 以控制百葉窗
此盲控項(xiàng)目的完整 ESP8266 代碼可在本頁底部找到。我們的程序必須等待來自 blynk 應(yīng)用程序的命令,并且基于該命令,我們必須以順時(shí)針方向或逆時(shí)針方向旋轉(zhuǎn)步進(jìn)電機(jī)。下面討論代碼的重要部分。
根據(jù)我們的電路圖,我們使用 nodemcu 上的數(shù)字引腳 1、2、3 和 4 來控制我們的步進(jìn)電機(jī)。因此,我們必須使用這些引腳創(chuàng)建一個(gè)名為 stepper 的實(shí)例,如下所示。請(qǐng)注意,我們按 1、3、2 和 4 的順序定義了引腳。這是故意的,不是錯(cuò)誤;我們必須交換引腳 2 和 3 才能使電機(jī)正常工作。
?
// 使用步驟和引腳創(chuàng)建步進(jìn)器類的實(shí)例 步進(jìn)步進(jìn)器(STEPS、D1、D3、D2、D4);
?
在下一步中,我們必須共享我們的 blynk 應(yīng)用程序身份驗(yàn)證令牌和我們的 IoT Blind 控制器必須連接到的 Wi-Fi 憑據(jù)。如果您不確定如何獲取此 Blynk 身份驗(yàn)證令牌,請(qǐng)參閱Blynk LED 控制項(xiàng)目以了解 blynk 應(yīng)用程序的基礎(chǔ)知識(shí)以及如何使用它。
?
// 你應(yīng)該在 Blynk App 中獲得 Auth Token。 // 轉(zhuǎn)到項(xiàng)目設(shè)置(螺母圖標(biāo))。 char auth[] = "l_b47mF1hioCc_7FzdKMJJeFnJjTxxxx"; // 您的 WiFi 憑據(jù)。 // 為開放網(wǎng)絡(luò)設(shè)置密碼為“”。 char ssid[] = "電路文摘"; char pass[] = "dummy123";
?
繼續(xù)我們的代碼,在 setup 函數(shù)之后,我們?yōu)?blynk 定義了兩個(gè)方法。如前所述,我們必須定義虛擬引腳 V1 和 V2 應(yīng)該做什么。下面給出了相同的代碼。
?
BLYNK_WRITE (V1) //關(guān)閉百葉窗 { Serial.println("關(guān)閉百葉窗"); 如果(打開==真) { for (int c_val = 0; c_val <= 130; c_val++) //逆時(shí)針旋轉(zhuǎn)關(guān)閉 { stepper.step(c_val); 屈服(); } 關(guān)閉=真; 打開=假; 禁用電機(jī)();// 使用后總是禁用步進(jìn)電機(jī)以減少功耗和發(fā)熱 } } BLYNK_WRITE(V2) // 打開百葉窗 { Serial.println("打開百葉窗"); 如果(關(guān)閉==真) { for (int cc_val = 0; cc_val >= -130; cc_val--) //順時(shí)針旋轉(zhuǎn)打開 { stepper.step(cc_val); 屈服(); } 打開=真; 關(guān)閉=假; } 禁用電機(jī)();// 使用后總是禁用步進(jìn)電機(jī)以減少功耗和發(fā)熱 }
?
如您所見,V1 用于關(guān)閉百葉窗,V2 用于打開百葉窗。for 循環(huán)用于使電機(jī)順時(shí)針或逆時(shí)針方向旋轉(zhuǎn) 130 步。我用我的百葉窗進(jìn)行了實(shí)驗(yàn),發(fā)現(xiàn)通過 130 步,我能夠完全打開和關(guān)閉我的百葉窗。您的號(hào)碼可能會(huì)有所不同。用于順時(shí)針和逆時(shí)針方向旋轉(zhuǎn)步進(jìn)電機(jī)的for 循環(huán)如下所示。
?
for (int c_val = 0; c_val <= 130; c_val++) //逆時(shí)針旋轉(zhuǎn)關(guān)閉 { stepper.step(c_val); 屈服(); } for (int cc_val = 0; cc_val >= -130; cc_val--) //順時(shí)針旋轉(zhuǎn)打開 { stepper.step(cc_val); 屈服(); }
?
您還可以在我們的程序中注意到兩個(gè)布爾變量“打開”和“關(guān)閉”。這兩個(gè)變量用于防止電機(jī)兩次打開或關(guān)閉百葉窗。意思是,百葉窗只有在之前關(guān)閉時(shí)才會(huì)打開,并且只有在之前打開時(shí)才會(huì)關(guān)閉。
28BJY-48步進(jìn)電機(jī)如何提高轉(zhuǎn)速?
使用 28BJY-48 步進(jìn)電機(jī)的一個(gè)缺點(diǎn)是速度很慢。這些電機(jī)最初是為高精度低速應(yīng)用而制造的,因此不要指望這些電機(jī)會(huì)高速旋轉(zhuǎn)。如果您想使用 Arduino 提高步進(jìn)電機(jī)的速度,您可以更改兩個(gè)參數(shù)。一個(gè)是#define STEPS 64,我發(fā)現(xiàn)當(dāng)steps定義為64時(shí),電機(jī)相對(duì)更快。另一個(gè)參數(shù)是?stepper.setSpeed(500);?我再次發(fā)現(xiàn) 500 是一個(gè)最佳值,超過這個(gè)值實(shí)際上會(huì)使步進(jìn)電機(jī)變慢。
你知道提高這些電機(jī)速度的其他方法嗎?如果是,請(qǐng)將它們留在下面的評(píng)論部分。
如何防止步進(jìn)電機(jī)過熱?
不使用時(shí)應(yīng)始終禁用步進(jìn)電機(jī),以防止過熱。禁用步進(jìn)電機(jī)非常簡單;只需將控制步進(jìn)電機(jī)的所有四個(gè) GPIO 引腳的引腳狀態(tài)更改為低電平即可。這非常重要,否則您的電機(jī)可能會(huì)在 +12V 時(shí)變得非常熱并永久損壞自身。下面給出了禁用步進(jìn)電機(jī)的程序。
?
void disable_motor() //完成后關(guān)閉電機(jī)以避免發(fā)熱 { 數(shù)字寫入(D1,低); 數(shù)字寫入(D2,低); 數(shù)字寫入(D3,低); 數(shù)字寫入(D4,低); }
?
使用 Google Assistant 控制百葉窗
我們將使用 blynk API 通過谷歌助手來控制百葉窗,它類似于我們的語音控制家庭自動(dòng)化項(xiàng)目,所以如果有興趣請(qǐng)檢查一下。
基于 Arduino 的自動(dòng)百葉窗控制 - 演示
電路和 3D 打印外殼準(zhǔn)備好后,只需在墻上鉆兩個(gè)孔即可將設(shè)備組裝在墻上。我的安裝設(shè)置如下圖所示。
之后,確保您的百葉窗處于打開狀態(tài),然后打開電路。現(xiàn)在,您可以嘗試從 blynk 應(yīng)用程序或通過 Google Assistant 關(guān)閉百葉窗,它應(yīng)該可以工作。您還可以在 blynk 應(yīng)用程序上設(shè)置計(jì)時(shí)器,以在一天中的特定時(shí)間自動(dòng)打開和關(guān)閉百葉窗。
// Arduino 程序來控制百葉窗使用步進(jìn)電機(jī)
#include
#include
#include
#define BLYNK_PRINT Serial
// 將此更改為步數(shù)在你的電機(jī)上
#define STEPS 64
//使用步驟和引腳創(chuàng)建步進(jìn)器類的實(shí)例
Stepper stepper(STEPS, D1, D3, D2, D4);
// 你應(yīng)該在 Blynk App 中獲得 Auth Token。
// 轉(zhuǎn)到項(xiàng)目設(shè)置(螺母圖標(biāo))。
char auth[] = "l_b47mF1hioCc_7FzdKMJJeFnJjTxxxx";
// 您的 WiFi 憑據(jù)。
// 為開放網(wǎng)絡(luò)設(shè)置密碼為“”。
char ssid[] = "電路文摘";
字符通[] = "
//打開百葉窗后才運(yùn)行程序
boolean closed = false;
布爾打開=真;
void disable_motor() //完成后關(guān)閉電機(jī)以避免發(fā)熱
{
digitalWrite(D1,LOW);
數(shù)字寫入(D2,低);
數(shù)字寫入(D3,低);
數(shù)字寫入(D4,低);
}
void setup()
{
pinMode(D0, OUTPUT); //板載LED作為輸出
digitalWrite(D0,HIGH); //打開這個(gè)燈
Serial.begin(9600);
stepper.setSpeed(500);
Blynk.begin(auth, ssid, pass);
// http://188.166.206.43/l_b47mF1hioCc_7FzdKMJJeFnJjxxxx_/update/V1?value=1 /
數(shù)字寫入(D0,低);//連接到 blynk 后將其關(guān)閉
}
BLYNK_WRITE(V1) //CLOSE the BLINDS
{
Serial.println("Closing Blinds");
if (opened == true)
{
for (int c_val = 0; c_val <= 130; c_val++) //逆時(shí)針旋轉(zhuǎn)關(guān)閉
{
stepper.step(c_val);
屈服();
}
關(guān)閉 = 真;
打開=假;
禁用電機(jī)();// 使用后總是禁用步進(jìn)電機(jī)以降低功耗和發(fā)熱
}
}
BLYNK_WRITE(V2) // OPEN the BLINDS
{
Serial.println("Opening Blinds");
如果(關(guān)閉==真)
{
for (int cc_val = 0; cc_val >= -130; cc_val--) //順時(shí)針旋轉(zhuǎn)打開
{
stepper.step(cc_val);
屈服();
}
打開 = 真;
關(guān)閉=假;
}
disable_motor(); // 使用后總是禁用步進(jìn)電機(jī)以降低功耗和發(fā)熱
}
void loop()
{
Blynk.run();
}
評(píng)論