通用的基于物聯(lián)網(wǎng)的AC遙控器,可以使用谷歌助手控制您的AC
掃描二維碼
隨時(shí)隨地手機(jī)看文章
每個(gè)漫威粉絲都會(huì)羨慕有一個(gè)像賈維斯這樣的私人助理,用他們的語(yǔ)音命令來(lái)完成事情。但是,我們還遠(yuǎn)沒(méi)有達(dá)到那樣的智能,我們今天擁有的最接近的東西是谷歌Assistant、Siri、Cortana等語(yǔ)音助手。今天,市場(chǎng)上有幾十種基于物聯(lián)網(wǎng)的智能設(shè)備,可以使用這些語(yǔ)音助手進(jìn)行控制,但繼續(xù)更換我們家中的每個(gè)電子設(shè)備以使其適合家庭自動(dòng)化是不公平的。這就是為什么,在這個(gè)項(xiàng)目中,我們將建立一個(gè)通用紅外遙控器,可以控制每一個(gè)電子設(shè)備,在紅外遙控器操作。基本上,我們將使用NodeMCU復(fù)制原始遠(yuǎn)程信號(hào),以便我們可以在需要時(shí)從互聯(lián)網(wǎng)觸發(fā)這些信號(hào)。這個(gè)項(xiàng)目中的電路將特別集中在建立通用交流遙控器來(lái)打開(kāi)/關(guān)閉任何交流,但其他電器的程序也非常相似。
這款基于物聯(lián)網(wǎng)的通用遙控器將分兩步操作,第一步,它允許用戶從AC遙控器輸入原始紅外信號(hào),然后允許用戶在需要時(shí)通過(guò)谷歌助手的語(yǔ)音命令復(fù)制這些信號(hào)。為了從遠(yuǎn)程捕獲這些命令,我們將使用一個(gè)TOP1738 IC,它是一個(gè)紅外接收器。為了通過(guò)紅外發(fā)送這些信號(hào),我們使用了紅外發(fā)射器,這是一個(gè)紅外LED。
組件的要求
?NodeMCU
?TSOP1738 -紅外接收器
?紅外光束
?按鈕
?發(fā)光二極管
?電阻
?連接電線
紅外信號(hào)發(fā)射機(jī)
紅外遙控器通過(guò)調(diào)制(開(kāi)關(guān))紅外炮(紅外LED)來(lái)操作。當(dāng)你看到遙控器上的紅外LED發(fā)光時(shí)(使用沒(méi)有紅外濾光片的相機(jī)),這意味著LED每秒打開(kāi)和關(guān)閉數(shù)千次。用我們的肉眼是不可能跟隨LED的開(kāi)關(guān)的。紅外LED打開(kāi)和關(guān)閉的頻率稱為載波頻率。數(shù)據(jù)被放置在載波上,并使用不同的調(diào)制技術(shù)發(fā)送。調(diào)制技術(shù)的一個(gè)例子是PWM。在這種調(diào)制中,紅外LED的開(kāi)和關(guān)持續(xù)時(shí)間是變化的。這些調(diào)制信號(hào)由紅外接收器接收,并使用單片機(jī)解碼。
TSOP1738(紅外接收器)
TSOP1738就像一個(gè)傳感器,對(duì)紅外信號(hào)很敏感。因此,我們可以使用TSOP1738作為紅外接收器。傳感器的工作電壓為5V,功耗為5mA。TSOP1738 IC有3個(gè)引腳,其中中心引腳(引腳2)是VCC,靠近中心引腳的引腳是接地引腳(引腳1)。剩余的引腳(引腳3)是信號(hào)引腳,連接到微控制器解碼接收到的信號(hào)。IC的引腳如下所示。
集成電路包含光電探測(cè)器和前置放大器在一個(gè)單一的封裝與內(nèi)部濾波器的PCM頻率。IC的內(nèi)部框圖如下所示。
請(qǐng)記住,TSOP-1738將只接收38Khz紅外信號(hào),并且與我們的項(xiàng)目兼容,因?yàn)橛《人械倪b控器都工作在38Khz。請(qǐng)確認(rèn)在你的國(guó)家是否相同,如果不是,然后更改相應(yīng)的IC。
紅外信號(hào)的編碼與解碼
解碼電視遙控器是一個(gè)簡(jiǎn)單的任務(wù),因?yàn)榇蠖鄶?shù)時(shí)候他們只發(fā)送一個(gè)值。當(dāng)涉及到交流遙控器時(shí),它們會(huì)同時(shí)發(fā)送多個(gè)參數(shù)。除此之外,每個(gè)AC都有不同的協(xié)議,這取決于制造商。遙控器和帶有接收器的設(shè)備之間的通信遵循不同的協(xié)議,如索尼、NEC等。根據(jù)制造商選擇的協(xié)議,數(shù)據(jù)被轉(zhuǎn)換為Pronto Hex格式,然后根據(jù)它定義代碼。
利用NodeMCU進(jìn)行紅外信號(hào)解碼
我們將以這樣一種方式設(shè)計(jì)我們的代碼,即用戶必須首先從原始數(shù)據(jù)中從遠(yuǎn)程捕獲每個(gè)指令的信號(hào)(在這個(gè)項(xiàng)目中,我們將處理打開(kāi)和關(guān)閉AC),然后通過(guò)模擬捕獲的數(shù)據(jù),我們將通過(guò)谷歌助手控制AC,這是在手機(jī)上存在的。要使用NodeMCU解碼原始數(shù)據(jù)中的傳入紅外信號(hào),我們必須下載以下庫(kù)。
下載文件后,您必須對(duì)庫(kù)文件執(zhí)行一個(gè)小編輯以執(zhí)行我們的代碼。打開(kāi)src文件夾,找到IRutils.CPP文件。在記事本中打開(kāi)該文件并查找在名為resultToHumanReadableBasic的函數(shù)名中編寫的代碼。復(fù)制粘貼下面給出的代碼來(lái)代替該代碼。
現(xiàn)在,查找函數(shù)名為resultToSourceCode的代碼,并將下面的代碼粘貼到該代碼的位置。在下面給出的代碼中,我們所做的只是對(duì)不必要的命令進(jìn)行注釋,這將有助于區(qū)分噪聲和數(shù)據(jù)信號(hào)。關(guān)于這一點(diǎn)的更多信息將在代碼解釋部分中進(jìn)一步解釋。
語(yǔ)音控制交流電路圖
我們使用一個(gè)簡(jiǎn)單的紅外led作為紅外爆破器,其陽(yáng)極連接到NodeMCU的D2引腳,陰極端子連接到GND。為了顯示按鈕是否被按下,我對(duì)每個(gè)按鈕都使用了LED。在按鈕和led之間,我使用了一個(gè)100歐姆的電阻。物聯(lián)網(wǎng)控制的交流遙控器的完整電路圖如下所示。
兩個(gè)led的正極分別連接到NodeMCU的D7和D8引腳上。我使用了1Kohm電阻作為NodeMCU的每個(gè)引腳的下拉電阻。我在D4的引腳上連接了一個(gè)綠色的LED作為指示燈,以指示運(yùn)行時(shí)程序中的各個(gè)程序。NodeMCU的D5引腳連接tsop1738 IR接收器,中心引腳連接Vcc,剩余引腳連接GND。在紅外接收器的GND和VCC上并聯(lián)一個(gè)10uf的電容,以防止噪聲。模塊從nodeMCU獲得供電,nodeMCU從USB電纜獲得電源。
語(yǔ)音控制交流的Adafruit IO設(shè)置
這個(gè)設(shè)置是關(guān)于android和NodeMCU之間的通信。Adafruit IO通過(guò)谷歌Assistant接收來(lái)自我們手機(jī)的指令,然后使用IFTT與NodeMCU通信。使用Adafruit IO,您的數(shù)據(jù)可以在互聯(lián)網(wǎng)上上傳,顯示和監(jiān)控,您可以制作自己的物聯(lián)網(wǎng)項(xiàng)目。我們之前還構(gòu)建了許多其他有趣的Arafruit IO項(xiàng)目。使用Adafruit IO的步驟如下:
第一步:你需要做的第一件事就是注冊(cè)Adafruit IO。點(diǎn)擊屏幕右上角的“免費(fèi)入門”。
步驟2:將彈出一個(gè)窗口,您必須在其中填寫詳細(xì)信息。填寫您的詳細(xì)信息,如姓名,郵件id,用戶名等,點(diǎn)擊保存設(shè)置,并創(chuàng)建您的帳戶。
步驟3:現(xiàn)在,您需要在編碼中使用您的AIO密鑰。要獲得您的AIO密鑰,請(qǐng)單擊“AIO密鑰”,這是目前在頁(yè)面的右上角。
步驟4:彈出一個(gè)窗口,顯示您的AIO用戶名和活動(dòng)密鑰。復(fù)制這些,你將需要在下一個(gè)過(guò)程中。
步驟5:獲得AIO密鑰后,現(xiàn)在必須創(chuàng)建一個(gè)New Feed。選擇Feeds >查看全部。一個(gè)新的頁(yè)面將被加載,在那里你可以看到你過(guò)去的訂閱。由于您是新手,因此只能看到Default。
現(xiàn)在,選擇Action > Create New Feed。
將彈出一個(gè)窗口,詢問(wèn)您的姓名和描述。我把它命名為VoiceAC,并做了一些描述。在給出詳細(xì)信息后,選擇“創(chuàng)建”并完成。至此,您已經(jīng)創(chuàng)建了New Feed。
IFTTT設(shè)置語(yǔ)音控制AC使用谷歌助理
IFTTT (If This Then That)是一個(gè)基于web的服務(wù),用于創(chuàng)建條件語(yǔ)句,稱為applet。使用IFTTT,我們可以為某些動(dòng)作創(chuàng)建觸發(fā)器。對(duì)于我們的項(xiàng)目,我們將創(chuàng)建一個(gè)applet,當(dāng)我們使用google assistant說(shuō)出特定的一行時(shí),它將觸發(fā)。首先,我們需要在IFTT上創(chuàng)建一個(gè)帳戶。
注意:在IFTTT上創(chuàng)建一個(gè)帳戶,使用與在Adafruit IO中創(chuàng)建帳戶相同的電子郵件ID。
要在IFTTT上創(chuàng)建帳戶,請(qǐng)導(dǎo)航到IFTTT網(wǎng)站并點(diǎn)擊注冊(cè)。然后填寫所需的詳細(xì)信息,如電子郵件、密碼等。創(chuàng)建并注冊(cè)您的帳戶后,點(diǎn)擊個(gè)人資料,然后點(diǎn)擊“創(chuàng)建”。
點(diǎn)擊“創(chuàng)建”后,將加載一個(gè)頁(yè)面,上面寫著“創(chuàng)建您自己的If This Then That”。這里的“This”是服務(wù)名稱,它將充當(dāng)條件的輸入,而“That”是操作,它將根據(jù)輸入觸發(fā)。所以在我們的項(xiàng)目中,輸入將是b谷歌Assistant,動(dòng)作將發(fā)生在Adafruit IO上?,F(xiàn)在要?jiǎng)?chuàng)建一個(gè)applet,單擊“This”圖標(biāo)。搜索Google assistant。
在步驟2中選擇Google Assistant后,點(diǎn)擊“Say a simple phrase”。
在下一個(gè)窗口中,將彈出一個(gè)窗口,說(shuō)“完成觸發(fā)字段”,即短語(yǔ)(ON AC),你想說(shuō)你的谷歌助理,這將觸發(fā)一個(gè)行動(dòng)。也有一些可選的短語(yǔ),你可以添加。填寫字段后,點(diǎn)擊“創(chuàng)建觸發(fā)器”。輸入部分完成了。
現(xiàn)在,我們必須設(shè)置“That”(動(dòng)作)部分。點(diǎn)擊“That”。
在動(dòng)作服務(wù)搜索欄中搜索Adafruit。
現(xiàn)在,選擇Send data to Adafruit IO。
將加載一個(gè)窗口,您必須在其中選擇要為其創(chuàng)建觸發(fā)器的提要名稱(VoiceAC)。在下一個(gè)字段中,輸入在說(shuō)出指定短語(yǔ)時(shí)希望輸入提要的數(shù)據(jù)(ON)。
之后,點(diǎn)擊“Create action”。單擊finish按鈕,applet就可以使用了。
到目前為止,我們創(chuàng)建了一個(gè)applet,當(dāng)我們對(duì)谷歌助手說(shuō)ON AC時(shí),它就會(huì)觸發(fā)。現(xiàn)在,我們將創(chuàng)建一個(gè)applet,當(dāng)我們對(duì)谷歌助手說(shuō)OFF AC時(shí),它將觸發(fā)。從上面繼續(xù)相同的過(guò)程,唯一的區(qū)別是步驟2和步驟5。在第2步的字段中,我們要寫OFF AC短語(yǔ),而不是寫ON AC。
在步驟5中,提要名稱將與前面相同,但是用于保存字段的Data將更改為OFF。
通過(guò)點(diǎn)擊“Create action”,您已經(jīng)成功創(chuàng)建了另一個(gè)applet,它將由短語(yǔ)“OFF AC”觸發(fā)。
代碼解釋語(yǔ)音控制AC使用谷歌助理
我們要編寫的代碼要記住,首先當(dāng)我們按下按鈕1或按鈕2時(shí),它必須捕獲傳入信號(hào)。捕獲傳入信號(hào)后,我們需要編寫處理與谷歌助手和NodeMCU通信的代碼,然后通過(guò)IR blaster模擬這些信號(hào)。本文最后給出了我們項(xiàng)目的主代碼。這里我要解釋一下我們的代碼。
隨著你使用上面的鏈接下載的庫(kù),你必須下載Adafruit MQTT庫(kù)由Adafruit使用庫(kù)管理器。定義NodeMCU的引腳D7和D8為ON_B和OFF_B。這些引腳用于進(jìn)入用于捕獲紅外信號(hào)的環(huán)路。這些引腳默認(rèn)為L(zhǎng)OW,如果這些引腳為高,則回路將被激活。
下面給出的代碼為地址、名稱、端口號(hào)、密碼、SSID和wifi密碼定義了一個(gè)變量。服務(wù)器地址和端口號(hào)可以保持原樣,但是必須更改AIO密鑰中獲得的MQTT NAME和MQTT PASS。
我們將引腳4(D2)和引腳14(D5)分配給klrLed和kRecvPin變量,并使用D2引腳發(fā)送紅外數(shù)據(jù),而D5引腳用于接收紅外數(shù)據(jù)
在void設(shè)置中,我們初始化波特率,并且必須等待微控制器形成串行連接。串行通信用于調(diào)試目的。建立連接后,我們將引腳D7(ON_B)和D8(OFF_B)設(shè)置為輸入引腳,D4引腳設(shè)置為輸出。引腳D7和D8用于查找連接到這些引腳的開(kāi)關(guān)是否處于ON狀態(tài)或OFF狀態(tài)。引腳D4用于連接LED, LED進(jìn)一步用作指示燈。將這些引腳配置為輸入和輸出引腳后,我們就建立了與家庭網(wǎng)絡(luò)的連接。建立連接后,我們通過(guò)MQTT協(xié)議訂閱VoiceAC饋線,并通過(guò)irsend.begin初始化發(fā)送函數(shù)。
下面給出的代碼處理MQTT連接。MQTT連接的主程序編寫在一個(gè)單獨(dú)的函數(shù)中,該函數(shù)名為MQTT_connect()。使用MQTT_connect()函數(shù)調(diào)用MQTT程序,該函數(shù)存在于void循環(huán)中。
下面給出的代碼包含兩個(gè)主要的if條件。如果ON_B引腳高,第一個(gè)“If”條件將被激活,并且代碼將在第一個(gè)“If”循環(huán)中編寫。如果OFF_B引腳高,第二個(gè)‘ If ’條件將被激活,并且代碼寫入第二個(gè)‘ If ’循環(huán)將運(yùn)行。
如果ON_B引腳高,代碼將進(jìn)入循環(huán)。D4引腳將發(fā)光高,表明程序已進(jìn)入循環(huán)并等待用戶使用交流遙控器初始化ON IR數(shù)據(jù)。
代碼將處于無(wú)限循環(huán)中,直到用戶通過(guò)紅外遙控器給出正確的紅外代碼。如果數(shù)據(jù)由于噪聲而損壞,函數(shù)resultToHumanReadableBasic(&results)返回“UNKNOWN”。如果resultToHumanReadableBasic(&results)返回除“UNKNOWN”以外的任何字符串,則意味著數(shù)據(jù)是正確的并且沒(méi)有噪聲。這將使程序退出while循環(huán)并繼續(xù)執(zhí)行下一條指令。
連接到D4引腳的指示燈LED熄滅,表示用戶已將正確的紅外數(shù)據(jù)發(fā)送到MCU。
下面給出的代碼用于將resultToSourceCode(&results)函數(shù)返回的字符串值轉(zhuǎn)換為uint_16類型。我首先將結(jié)果(resultToSourceCode(&results))存儲(chǔ)在x變量中,這是一個(gè)字符串類型。每個(gè)數(shù)據(jù)都用逗號(hào)分隔,所以我繼續(xù)使用while循環(huán)檢查變量x中的每個(gè)字符。如果x變量?jī)?nèi)的字符不是逗號(hào)“,”,則將該字符添加到名為convert的字符串變量中。直到出現(xiàn)“,”為止。如果有字符“,”,則表示數(shù)據(jù)已經(jīng)完成了在字符串變量convert中的存儲(chǔ)。存儲(chǔ)在轉(zhuǎn)換變量中的第一個(gè)數(shù)據(jù)始終是數(shù)據(jù)的大小。首先,我把數(shù)據(jù)存儲(chǔ)在size1變量中,它是int型。在第一個(gè)變量存儲(chǔ)在size1變量中之后,我們必須為下一個(gè)進(jìn)程清空“convert”變量,并使其準(zhǔn)備好再次存儲(chǔ)新數(shù)據(jù)。當(dāng)程序感覺(jué)到第二個(gè)“,”時(shí),我們知道這是我們需要通過(guò)IR Blaster發(fā)送的數(shù)據(jù)。
因此,我們以這樣一種方式編寫程序,即第一個(gè)傳入數(shù)據(jù)將存儲(chǔ)在size1變量中,其余數(shù)據(jù)將存儲(chǔ)在變量“rawData1”中。我們使用convert. toint()將字符串轉(zhuǎn)換為int型,然后將該數(shù)據(jù)存儲(chǔ)在變量中。這個(gè)過(guò)程一直進(jìn)行,直到x變量中的每個(gè)數(shù)據(jù)都完全存儲(chǔ)在“rawData”變量中。
這個(gè)“if”條件檢查OFF_B引腳是HIGH還是Low。如果是HIGH,程序進(jìn)入循環(huán)。“if”條件內(nèi)的代碼與上面相同,但所使用的變量略有變化。在上面的代碼中,我們使用了變量rawData1和size1,但是在這個(gè)循環(huán)中,我們將使用變量rawData2和size2。
下面的代碼處理MCU和Adafruit IO服務(wù)器之間的通信。if條件if (!strcmp((char*) voiceAC。lastread, "ON"))只有當(dāng)用戶通過(guò)google assistant使用指定的短語(yǔ)時(shí)才為真。函數(shù)irsend.sendRaw()用于在匹配短語(yǔ)時(shí)以38KHz頻率發(fā)送指定大小的原始數(shù)據(jù)。
基于物聯(lián)網(wǎng)的通用交流遙控器的工作原理
我們以這樣一種方式編寫程序:首先,我們必須捕獲從AC遙控器發(fā)出的數(shù)據(jù)。我們通過(guò)使用TSOP1738紅外接收器來(lái)做到這一點(diǎn)。捕獲信號(hào)后,我們將把數(shù)據(jù)存儲(chǔ)在一個(gè)變量中,并在需要時(shí)使用紅外爆破器模擬這些信號(hào)。
當(dāng)我們打開(kāi)電源時(shí),我們會(huì)注意到指示燈LED(綠色LED)會(huì)閃爍。這表示模塊正在等待wifi連接。指示燈停止閃爍,表示nodeMCU已連接wifi網(wǎng)絡(luò)。在建立網(wǎng)絡(luò)連接后,要捕獲紅外數(shù)據(jù),請(qǐng)持續(xù)按下連接到D7或D8的按鈕(ON_B或OFF_B),直到指示燈LED開(kāi)始發(fā)光。指示燈LED發(fā)光,表示nodeMCU準(zhǔn)備采集紅外數(shù)據(jù)。使用您的AC遙控器發(fā)送紅外信號(hào)到我們的TSOP如下所示。如果紅外數(shù)據(jù)正確且無(wú)噪聲,則指示燈滅亮,表示NodeMCU成功捕獲紅外數(shù)據(jù),可以重新模擬數(shù)據(jù)。
對(duì)另一個(gè)剩余的按鈕執(zhí)行相同的過(guò)程。如前所述,我們將只處理AC的ON或OFF開(kāi)關(guān)。ON_B按鈕用于捕獲AC開(kāi)關(guān)ON所需的數(shù)據(jù),OFF_B按鈕用于捕獲AC開(kāi)關(guān)OFF所需的數(shù)據(jù)。捕獲兩個(gè)數(shù)據(jù)后,將模塊放在AC前面。
在這之后,你可以坐下來(lái),命令你的谷歌助手打開(kāi)或關(guān)閉交流。如果你愿意,你甚至可以升級(jí)這個(gè)模塊來(lái)捕捉溫度或風(fēng)扇模式等,并控制這些參數(shù)。
本文編譯自iotdesignpro