如何使用繼電器或N-MOSFET模塊構(gòu)建迷你智能家居系統(tǒng)
一個(gè)易于遵循的迷你智能家居系統(tǒng),您可以嘗試使用CIrcuitPython, Android Studio和W5100S EVB Pico2在家中構(gòu)建
你好,這是我以前在Android應(yīng)用程序上的W5100S-EVB-Pico 2項(xiàng)目的更新。在這個(gè)項(xiàng)目中,我改進(jìn)了系統(tǒng)的設(shè)計(jì),以支持更多的硬件使用繼電器。有了這些,你也可以在你的個(gè)人項(xiàng)目中創(chuàng)建一個(gè)類(lèi)似的迷你智能家居系統(tǒng)。
本文將首先介紹新系統(tǒng)所需的組件,模塊與電路板的連接,最后介紹Android Studio和CircuitPython中的代碼
組件
為了完善這個(gè)項(xiàng)目,我增加了一個(gè)Minebea Motor的12V NMB-MAT風(fēng)扇和定制的燈箱來(lái)模擬家庭系統(tǒng)。要操作這些設(shè)備,您需要2個(gè)外部電源來(lái)使用這兩個(gè)產(chǎn)品,因?yàn)槲覀兊陌逯恢С?V和3.3V。
此外,為了允許我們的電路板為硬件供電,您將需要一個(gè)繼電器或n通道MOSFET模塊。兩者都被使用,以便通過(guò)從我們的板向模塊提供信號(hào),然后它們將允許外部電源通過(guò)各自的機(jī)制為硬件供電。
風(fēng)扇使用的電源是XY-SK35電源,因?yàn)樗试S高達(dá)24v的電壓水平,對(duì)于定制燈箱,您只需要一個(gè)microrousb到USB線和一個(gè)USB插頭作為燈箱的電源。
XY-SK35電源
on組件以及我們的Pico 2板將與繼電器模塊連接。
對(duì)于帶燈條的盒子,您將需要一個(gè)MOSFET模塊,以便在該燈條上運(yùn)行PWM。
硬件連接
對(duì)于每個(gè)硬件,我們將首先連接控制模塊(繼電器/MOSFET),電源和硬件,然后我們將完成的電路連接回電路板。
在我的研究中,我遇到了這個(gè)視頻,教我如何連接繼電器與硬件,以及如何控制它與Pico板。
要連接風(fēng)扇、繼電器和電源,您需要執(zhí)行以下操作。
1. 確定要使用的電路。
如果您希望硬件在電路板提供低信號(hào)時(shí)工作,則需要使用繼電器的NC端口,這意味著當(dāng)電路板上的各自引腳輸出低信號(hào)時(shí),電源到風(fēng)扇電路保持關(guān)閉,表明風(fēng)扇僅在信號(hào)為低時(shí)運(yùn)行。
如果您希望硬件僅在電路板提供高信號(hào)時(shí)工作,則需要繼電器的NO端口,這意味著電源到風(fēng)扇電路在引腳為L(zhǎng)OW時(shí)保持打開(kāi),表明風(fēng)扇在信號(hào)為L(zhǎng)OW時(shí)不會(huì)操作。
2. 將風(fēng)扇的正極連接到電源的正極。您可能需要使用剝線鉗允許銅線連接到電源的正極。我剪斷電線的塑料涂層,繞在電源的正極上。(藍(lán)色線為風(fēng)機(jī)正極線)
3. 將風(fēng)扇的接地線與風(fēng)扇的接地口連接到繼電器的COM口。
4. 最后,將電源的負(fù)極連接到步驟1 (NO/NC)中選擇的端口。對(duì)于這個(gè)項(xiàng)目,我希望風(fēng)扇僅在我的板發(fā)送高信號(hào)時(shí)運(yùn)行,這意味著我將使用NO端口
完成電源-風(fēng)扇電路。
要連接到電路板,只需將接地,電壓和信號(hào)引腳連接到各自的引腳,信號(hào)應(yīng)在CircuirPython中的DigitalInOut引腳中
接下來(lái),對(duì)于燈箱,您需要執(zhí)行以下步驟。
1. 切割并去除microrousb轉(zhuǎn)usb線的塑料涂層。暴露一些銅線以便電通過(guò)?,F(xiàn)在您應(yīng)該有兩段導(dǎo)線,我將它們稱(chēng)為microUSB導(dǎo)線和USB導(dǎo)線。
2. 在N-MOS模塊中,您將發(fā)現(xiàn)4個(gè)端口,分別是V輸入+/-和V輸出+/-。將微型rousb線的正極和負(fù)極分別接在電壓輸出正、負(fù)端口上。對(duì)于電壓輸入,我們相應(yīng)地連接USB線。
3. 您應(yīng)該會(huì)發(fā)現(xiàn)模塊的另一側(cè)有6個(gè)端口。頂部的三個(gè)端口都用于PWM,其余的都接地。
然后我們需要將這些端口連接到電路板的引腳。我使用GP12作為這個(gè)模塊的引腳。
這就完成了兩個(gè)硬件的連接。
CircuitPython代碼
在編寫(xiě)代碼之前,在Adafruit IO上為風(fēng)扇和PWM燈創(chuàng)建兩個(gè)饋送,以便您可以在Adafruit模式下讀取或?qū)懭脒@些值
為了允許我們的應(yīng)用打開(kāi)/關(guān)閉風(fēng)扇/盒子燈,你需要為這兩個(gè)硬件設(shè)置一個(gè)新的端點(diǎn)。
要使用風(fēng)扇,我將Gp9引腳綁定為DigitalInOut引腳,當(dāng)該引腳值為1時(shí),風(fēng)扇將打開(kāi),如果不是,則風(fēng)扇將關(guān)閉。
我還增加了一個(gè)自動(dòng)版本,如果SFA30的溫度超過(guò)一定值,風(fēng)扇將自動(dòng)打開(kāi)。
由于現(xiàn)在我們希望SFA30自動(dòng)記錄變量,而不是僅在調(diào)用SFA30端點(diǎn)時(shí)執(zhí)行計(jì)算,因此我們將SFA30端點(diǎn)中負(fù)責(zé)檢索數(shù)據(jù)的代碼移到一個(gè)函數(shù)中,當(dāng)服務(wù)器在線時(shí),我們將在該函數(shù)中調(diào)用每個(gè)循環(huán)。
我們將在新版本中返回風(fēng)扇值以及這些數(shù)據(jù)供應(yīng)用程序使用,我將在稍后解釋。
本地模式下的舊版本:
本地模式的當(dāng)前版本:
在Adafruit模式中,您需要為風(fēng)扇值添加一個(gè)新的提要,訂閱它,并在計(jì)算后將該值發(fā)布到Adafruit IO。
在第一次迭代中,當(dāng)達(dá)到溫度閾值時(shí),我們需要首先將當(dāng)前風(fēng)扇值發(fā)送給Adafruit IO(這里的代碼為25)。
在while循環(huán)內(nèi)部,為了避免達(dá)到Adafruit IO的節(jié)流錯(cuò)誤,最好只在風(fēng)扇狀態(tài)發(fā)生變化時(shí)才發(fā)布風(fēng)扇值。增加油門(mén)時(shí)間也有助于減少達(dá)到油門(mén)時(shí)間的可能性。
最后,如果服務(wù)器結(jié)束,則將風(fēng)扇的狀態(tài)發(fā)布回默認(rèn)狀態(tài)(關(guān)閉)。
要使用該燈,您需要使用PWMIO庫(kù)來(lái)調(diào)整亮度。
將GP12上的引腳與PWMOut功能綁定。previous_PWM變量用于在我們關(guān)閉應(yīng)用程序中的燈之前記錄PWM值。我們將其初始化為65535,因?yàn)闊舻某跏紶顟B(tài)是關(guān)閉的,如果我們切換應(yīng)用程序上的燈,占空比只能設(shè)置為65535的最大值。
在開(kāi)發(fā)本節(jié)的過(guò)程中,有一個(gè)有趣的發(fā)現(xiàn)發(fā)生在我收到一個(gè)使用All計(jì)時(shí)器的錯(cuò)誤時(shí)。經(jīng)過(guò)一番研究,我發(fā)現(xiàn)發(fā)生這種情況是因?yàn)槲沂褂昧讼嗤琍WM輸出片的第二個(gè)通道。正如在前面的代碼中,我使用PWM輸出來(lái)播放聲音,如果連接,這是在引腳26,我不小心使用了相同PWM片的另一個(gè)通道的光,這是引腳11。您可以閱讀此網(wǎng)站以獲得有關(guān)Pico 2板的PWM通道的簡(jiǎn)短解釋?zhuān)蛘吣梢詤⒖糝P2350數(shù)據(jù)表。
PWM通道圖片來(lái)自RP2350 Datasheet
由于這兩種硬件的工作方式不同,最簡(jiǎn)單的解決方案是將我的光更改為PWM輸出的另一片,即引腳GP12。
接下來(lái),我們修改切換光端點(diǎn),使用我們自定義的燈箱而不是led模塊。
如果當(dāng)前狀態(tài)為0,我們將其打開(kāi)到先前存儲(chǔ)的PWM值作為亮度。
如果電流狀態(tài)非零,我們關(guān)閉它。
我們還應(yīng)該添加另一條路由來(lái)改變光的PWM值。
當(dāng)Android從0-100縮放時(shí),我們通過(guò)以下方式將這些值映射到0-65535,并將計(jì)算結(jié)果存儲(chǔ)回previous_PWM變量。
接下來(lái),對(duì)于Adafruit模式,創(chuàng)建boxlight提要并在連接的MQTT函數(shù)中訂閱它。
我們還需要修改消息功能。應(yīng)用程序仍然會(huì)調(diào)用LED端點(diǎn)來(lái)打開(kāi)/關(guān)閉燈,但應(yīng)用程序現(xiàn)在可能會(huì)將滑塊值發(fā)送到PWM端點(diǎn)以調(diào)整亮度。
如果應(yīng)用程序被發(fā)布到光源,我們的箱燈將改變亮度到以前存儲(chǔ)的狀態(tài),如果它是打開(kāi)的,如果它是關(guān)閉的0。
如果應(yīng)用程序發(fā)送到箱燈饋送,我們首先用這個(gè)公式設(shè)置應(yīng)用程序的值相應(yīng)的占空比,并將當(dāng)前占空比值存儲(chǔ)到previous_PWM變量中,這樣如果我們重新打開(kāi)燈,亮度就處于先前存儲(chǔ)的狀態(tài)。
如果我們從本地模式切換到Adafruit模式,我們還需要發(fā)布當(dāng)前的亮度。
最后,將占空比的默認(rèn)值發(fā)布給Adafruit IO,該值為0
這就完成了CircuirPython代碼。
Android Studio代碼
在Android應(yīng)用程序中,你需要添加一個(gè)按鈕圖像來(lái)存儲(chǔ)風(fēng)扇的當(dāng)前狀態(tài),并添加一個(gè)按鈕,負(fù)責(zé)切換燈的亮度,旁邊是一個(gè)滑塊,組成PWM值。
和之前的版本一樣,我使用了ImageButton組件作為風(fēng)扇,我允許它通過(guò)按下這個(gè)按鈕來(lái)打開(kāi)或關(guān)閉風(fēng)扇。在未來(lái),我可能會(huì)包括一個(gè)自動(dòng)/手動(dòng)切換,這樣如果它是自動(dòng)風(fēng)扇模式,它就可以作為靜態(tài)圖像組件,但如果它是手動(dòng)模式,我們可以按下這個(gè)按鈕來(lái)打開(kāi)和關(guān)閉。
風(fēng)扇打開(kāi)和關(guān)閉的圖像是由ChatGPT生成的。你可以制作自己的版本,并將其重命名為fan_on, fan_off并將其存儲(chǔ)到/res/drawable文件夾中。
這是我的代碼在activity_main xml。
接下來(lái),讓我們轉(zhuǎn)到這些組件背后的邏輯。
設(shè)置滑塊和按鈕如下。當(dāng)SeekBar改變時(shí),我們將把改變的結(jié)果存儲(chǔ)到一個(gè)滑塊值變量中,當(dāng)我們決定按下負(fù)責(zé)亮度的Apply按鈕時(shí),該變量將用于發(fā)送到電路板。
我還將fan_button設(shè)置為false,因?yàn)槲覀兡壳安恢С质謩?dòng)更改風(fēng)扇。
創(chuàng)建Adafruit IO端點(diǎn)以發(fā)出HTTP請(qǐng)求。
由于我們?cè)贏pp中添加了一些新組件,我們需要在網(wǎng)絡(luò)斷開(kāi)時(shí)禁用這些新組件。
現(xiàn)在我們可以對(duì)滑動(dòng)按鈕進(jìn)行編碼。這個(gè)滑動(dòng)按鈕背后的大部分邏輯與其他按鈕非常相似,但我添加了一小部分,告訴用戶在按下Apply按鈕之前需要打開(kāi)燈。
接下來(lái),根據(jù)我們是否從上一篇文章中的discoveryot函數(shù)檢索IP,我們將對(duì)各自的API端點(diǎn)執(zhí)行HTTP請(qǐng)求。請(qǐng)記住,在這個(gè)Adafruit部分中,我們需要在從正確的提要(即pwmlight)獲取數(shù)據(jù)之前識(shí)別物聯(lián)網(wǎng)設(shè)備的在線狀態(tài)。
在本節(jié)中,我使用POST而不是來(lái)自之前的onClickListener的GET請(qǐng)求,因?yàn)槲覀儗⑾蛭锫?lián)網(wǎng)設(shè)備發(fā)布數(shù)字?jǐn)?shù)據(jù)。
完成滑塊按鈕后,我們現(xiàn)在可以修改SFA30功能,我們將在SFA30數(shù)據(jù)的同時(shí)檢索風(fēng)扇狀態(tài)。
繼上一篇關(guān)于get_data_job函數(shù)的文章之后,我們首先修改本地模式中的代碼。
當(dāng)我們決定返回一個(gè)帶有SFA30數(shù)據(jù)和來(lái)自SFA30端點(diǎn)的風(fēng)扇數(shù)據(jù)的JSON對(duì)象時(shí),我們可以簡(jiǎn)單地檢查“fan”鍵的值是真還是假,然后相應(yīng)地更改風(fēng)扇照片。
這里是本地模式的代碼
對(duì)于Adafruit模式,您需要為向粉絲提要的http請(qǐng)求創(chuàng)建另一個(gè)async await函數(shù),并相應(yīng)地更改圖片。但是,如果服務(wù)器不在線,則需要將照片設(shè)置為默認(rèn)值。
這就完成了Android應(yīng)用程序的Kotlin代碼。
結(jié)論
這就是使用Kotlin和CircuitPython對(duì)迷你智能家居系統(tǒng)的更新。我希望通過(guò)這個(gè)項(xiàng)目,您可以學(xué)習(xí)如何使用繼電器或N-MOSFET模塊與我們的Pico板連接來(lái)操作現(xiàn)實(shí)生活中的硬件,并為您的個(gè)人項(xiàng)目提供一些靈感。也可能有新的更新到這個(gè)系統(tǒng),使它作為一個(gè)更全面的家庭系統(tǒng)項(xiàng)目。希望你能從這篇文章中學(xué)到一些新的東西!
本文編譯自hackster.io