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