步驟1:Google Assistant控制的家庭自動(dòng)化項(xiàng)目概述
我正在使用Arduino UNO微控制器端和用于連接互聯(lián)網(wǎng)的ESP8266模塊。老實(shí)說(shuō),還有很多其他方法可以解決這個(gè)問(wèn)題。您可以將功能更強(qiáng)大的處理器(如Raspberry Pi或其他SOC)與內(nèi)置Wi-Fi(如ESP12E或ESP32)結(jié)合使用。但是我決定使用老式的Arduino和ESP8266板來(lái)降低成本,并且不要過(guò)度設(shè)計(jì)任何東西。
對(duì)于這個(gè)項(xiàng)目,我們還將使用ESP8266貼身地構(gòu)建一個(gè)Arduino WiFi防護(hù)罩在Arduino UNO板上。此屏蔽可用于通過(guò)AT命令或直接使用Arduino IDE對(duì)ESP8266進(jìn)行編程。它還具有將FTDI模塊直接連接到ESP8226的選項(xiàng),這允許將ESP8266編程為無(wú)需Arduino的獨(dú)立設(shè)備,并且還可以根據(jù)需要將新固件刷新到ESP8266模塊中。因此,該防護(hù)罩可用于許多其他需要互聯(lián)網(wǎng)連接的創(chuàng)意Arduino項(xiàng)目。
為了在手機(jī)上與Google助手通信,我們使用了IFTTT服務(wù),該服務(wù)將助手配置為偵聽(tīng)特定命令并在收到命令時(shí)觸發(fā)鏈接。現(xiàn)在,您可能已經(jīng)知道ESP8266僅可以通過(guò)API調(diào)用從Internet讀取信息,因此我們需要一個(gè)可以為我們提供此API選項(xiàng)的平臺(tái),這就是ThingSpeak所在的位置。基本上,提供給Google Assistant的語(yǔ)音命令會(huì)更改此值相應(yīng)地在ThingSpeak頻道中的字段。 ESP8266使用API調(diào)用定期檢查此字段的值,然后使用串行通信將此值發(fā)送給Arduino。 Arduino然后執(zhí)行所需的操作,例如根據(jù)接收到的值切換繼電器。
步驟2:使用ESP8266的Arduino Uno Wi-Fi Shield
讓我們開(kāi)始將Arduino UNO板與ESP8266 Wi-Fi模塊連接。 ESP8266是一個(gè)棘手的模塊。它需要自己的電源和特定的連接設(shè)置才能與Arduino通信。如果您是絕對(duì)的初學(xué)者,則強(qiáng)烈建議您閱讀ESP8266入門(mén)教程,然后再繼續(xù)進(jìn)行操作。
請(qǐng)記住,ESP8266購(gòu)買(mǎi)時(shí)隨附帶有可與AT通訊的默認(rèn)固件。命令。但是,如果模塊是直接用Arduino編程的,則默認(rèn)固件將被刪除,如果要使用AT命令,則必須再次刷新。
我們將使用LM317作為3.3V穩(wěn)壓器。該3.3V用于為ESP8266模塊供電,因?yàn)閬?lái)自Arduino UNO的3.3V將無(wú)法為ESP模塊提供足夠的電流。 LM317輸入引腳可以由Arduino UNO板Vin引腳的DC輸入桶式插孔供電。
ESP模塊的GPIO0引腳連接到跳線引腳,該跳線可以切換為將該引腳接地。這允許用戶(hù)將ESP模塊設(shè)置為在AT命令模式或編程模式(Arduino IDE)下工作。 GPIO0和GPIO2都連接到外部連接器,因此這些GPIO引腳也可以使用。
最后在Arduino方面,我們將ESP8266模塊的Rx和Tx引腳連接到Arduino的12和13引腳。我們沒(méi)有使用硬件串行(引腳0和1)來(lái)簡(jiǎn)化調(diào)試。您還可以注意到,還提供了連接16x2 LCD的選項(xiàng),因此可以將其直接安裝在屏蔽層的頂部。 LCD由Arduino的5V引腳供電。
步驟3:使用EasyEDA為ESP8266 Wi-Fi模塊制作PCB
為Arduino板設(shè)計(jì)屏蔽層時(shí),一個(gè)具有挑戰(zhàn)性的部分就是要正確地占用空間。如果尺寸錯(cuò)誤,那么屏蔽將無(wú)法正確地安裝在Arduino UNO板上。但是,幸運(yùn)的是,EasyEDA幾乎可以為市場(chǎng)上的所有組件提供封裝。這是由于其龐大的用戶(hù)社區(qū),用戶(hù)可以在其中創(chuàng)建足跡并使其可供公眾使用以用于其項(xiàng)目。
EasyEDA是一種在線EDA工具,我以前使用過(guò)很多次,發(fā)現(xiàn)它非常方便可以使用,因?yàn)樗哂辛己玫母采w范圍并且是開(kāi)源的。設(shè)計(jì)完P(guān)CB之后,我們可以通過(guò)低成本的PCB制造服務(wù)訂購(gòu)PCB樣品。他們還提供元件采購(gòu)服務(wù),其中有大量的電子元件庫(kù)存,用戶(hù)可以與PCB訂單一起訂購(gòu)所需的元件。
在設(shè)計(jì)電路和PCB時(shí),您還可以公開(kāi)電路和PCB設(shè)計(jì),以便其他用戶(hù)可以復(fù)制或編輯它們并從您的工作中受益,我們還制作了整個(gè)電路和PCB此電路的公共布局,請(qǐng)查看以下鏈接:
https://easyeda.com/CircuitDigest/Arduino-WiFi-sh 。..
您可以查看任何層(頂部,“底部”,“底部絲綢”,“底部絲綢”等),方法是從“層”窗口中選擇層。除此之外,它們還提供PCB在制造后的外觀的3D模型視圖。 Wi-Fi防護(hù)層的頂層和底層的快照看起來(lái)像這樣
第4步:使用EasyEDA在線計(jì)算和訂購(gòu)PCB樣品
完成此設(shè)計(jì)之后Arduino Uno Wi-Fi模塊,您可以通過(guò)JLCPCB.com訂購(gòu)PCB。要從JLCPCB訂購(gòu)PCB,您需要Gerber File。要下載PCB的Gerber文件,只需單擊EasyEDA編輯器頁(yè)面上的Generate Fabrication File按鈕,然后從那里下載Gerber文件,或者您可以單擊JLCPCB上的訂購(gòu),如上圖所示。這會(huì)將您重定向到JLCPCB.com,您可以在其中選擇要訂購(gòu)的PCB數(shù)量,所需的銅層數(shù)量,PCB厚度,銅重量以及甚至是PCB顏色,如上面的快照所示。
在JLCPCB按鈕上單擊訂購(gòu)后,它將帶您到JLCPCB網(wǎng)站,在此您可以以非常低的價(jià)格訂購(gòu)PCB,即2美元。他們的構(gòu)建時(shí)間也非常短,只需DHL交付3-5天即可交付48小時(shí),基本上您可以在訂購(gòu)一周后得到PCB。
訂購(gòu)PCB后,您可以檢查生產(chǎn)進(jìn)度日期和時(shí)間對(duì)您的PCB的影響。您可以通過(guò)在“帳戶(hù)”頁(yè)面上進(jìn)行檢查,然后單擊PCB下方的“生產(chǎn)進(jìn)度”鏈接,如上圖所示。
訂購(gòu)PCB幾天后,我得到了包裝精美的PCB樣品,如下圖所示以上圖片。
確保軌道和足跡正確無(wú)誤。我開(kāi)始組裝PCB,我使用了母頭來(lái)放置Arduino Nano和LCD,以便以后在其他項(xiàng)目中需要時(shí)可以將它們卸下。完全焊接的電路板看起來(lái)像上面的
步驟5:Arduino Wi-Fi Shield編程模式和AT模式
當(dāng)使用Arduino IDE直接對(duì)ESP8266進(jìn)行編程或?qū)ζ溥M(jìn)行閃爍時(shí),應(yīng)在每次上傳之前將GPIO 0引腳接地,并且每次都要將Reset引腳暫時(shí)接地。同樣,當(dāng)ESP8266使用AT指令時(shí),應(yīng)將GPIO引腳留空,然后再次將Reset引腳暫時(shí)接地以將其復(fù)位。
為了簡(jiǎn)化設(shè)計(jì),我們?cè)O(shè)計(jì)了Wi-Fi屏蔽具有一個(gè)可在編程模式和AT命令模式之間切換的撥動(dòng)引腳,如上圖所示。同樣,在每次上傳代碼之前,只要每次按下復(fù)位按鈕(紅色),就可以將Reset引腳接地。
開(kāi)發(fā)板上還可以選擇將FTDI模塊直接連接到ESP,這對(duì)于刷新ESP8266模塊要進(jìn)行閃爍,請(qǐng)連接FTDI模塊,然后將引腳設(shè)置為編程模式,如上所示。然后從給定的鏈接下載ESP8266_Flasher軟件和固件bin文件。然后打開(kāi)軟件并使用Bin按鈕瀏覽到bin文件,然后鍵入右側(cè)的COM端口并將默認(rèn)地址保留為0x00000。最后單擊下載按鈕以刷新ESP8266模塊。該軟件也顯示在上圖中,但請(qǐng)記住,只有在ESP8266上的默認(rèn)固件被覆蓋后,您才需要刷新它。
步驟6:為Google助手設(shè)置ThingSpeak頻道
我們?cè)赥hingSpeak中需要一個(gè)通道,該通道將存儲(chǔ)來(lái)自Google助手的數(shù)據(jù),并允許ESP8266使用API調(diào)用來(lái)檢索這些數(shù)據(jù)。如果您不熟悉ThingSpeak,請(qǐng)通過(guò)在Thingspeak.com上注冊(cè)并單擊新頻道來(lái)設(shè)置帳戶(hù),還請(qǐng)查看我們之前的項(xiàng)目,以了解有關(guān)將ThingSpeak與Arduino結(jié)合使用的更多信息。您可以為您的頻道選擇任何名稱(chēng)并提供描述。由于我們僅切換一個(gè)光源,因此我僅使用了一個(gè)字段并將其命名為L(zhǎng)ight,但同樣可以使用任意多個(gè)字段。我的頻道設(shè)置看起來(lái)像這樣,記下我的情況下的頻道ID(683739)和我的情況下的字段號(hào)(1),以后我們將需要它。
下一步單擊API密鑰標(biāo)簽,此處將為您提供兩個(gè)API密鑰,一個(gè)用于寫(xiě)入功能,另一個(gè)用于讀取功能。您只能分別使用這些鍵將值讀取或?qū)懭胱侄巍C總€(gè)鍵都是唯一的,上面顯示的我的鍵肯定會(huì)有所不同。切勿共享您的密鑰,因?yàn)樗梢允谟鑼?duì)您的頻道進(jìn)行寫(xiě)入或讀取的權(quán)限。上面顯示的這些鍵在使用后已銷(xiāo)毀。
現(xiàn)在讓我們看一下API GET調(diào)用,通過(guò)這些調(diào)用我們可以向剛創(chuàng)建的字段寫(xiě)入和讀取數(shù)據(jù)。
從中讀取事物字段:
api.thingspeak.com/channels/683739/fields/1/last.json?api_key=7EK8DHQDV3M0EJ6S&results=2
寫(xiě)入事物字段:
api。 Thingspeak.com/update?api_key=UEI3D4YTWX9OQQ4B&field1=7
這些是我的API,您必須用鍵替換鍵值,并根據(jù)ThingSpeak通道更改通道ID。如果您選擇了如圖中所示的第一個(gè)字段,則無(wú)需更改字段值。
您還可以嘗試在您的瀏覽器上加載這些API調(diào)用,并檢查其工作方式。在上面的“寫(xiě)物”字段中,我們將7(最后添加)寫(xiě)入通道。您可以在瀏覽器中加載它,并檢查該值是否反映在您的ThingSpeak帳戶(hù)中。同樣,加載到瀏覽器中時(shí)從Thing Field API調(diào)用中讀取的內(nèi)容應(yīng)為您以前發(fā)送給Field的值,在這種情況下為7。
步驟7:設(shè)置IFTTT小程序
h2》
現(xiàn)在我們知道如何從該字段發(fā)送和讀取值,接下來(lái)我們必須在IFTTT帳戶(hù)中設(shè)置兩個(gè)applet。如果您不熟悉IFTTT,只需注冊(cè)并鏈接您的Gmail帳戶(hù),則該Gmail帳戶(hù)應(yīng)采用與您使用Google語(yǔ)音助手相同的一種形式。兩個(gè)小程序中的兩個(gè)都將通過(guò)上述鏈接用于將值寫(xiě)入字段。但是,使用上面的API調(diào)用,一個(gè)會(huì)監(jiān)聽(tīng)“打開(kāi)閱讀燈”并將其寫(xiě)入“ 1”,而另一個(gè)小程序會(huì)監(jiān)聽(tīng)“關(guān)閉閱讀燈”并寫(xiě)入“ 0”。
要?jiǎng)?chuàng)建小程序,請(qǐng)進(jìn)入我的小程序,然后單擊“新小程序”。然后在“此”部分中選擇Google語(yǔ)音助手,并在“那”部分中選擇Webhooks服務(wù)。這與我們對(duì)基于物聯(lián)網(wǎng)的門(mén)安全項(xiàng)目所做的工作非常相似。如果您對(duì)如何操作感到困惑,請(qǐng)參閱本文,下面的圖像也將為您提供幫助。
步驟8:為Google Assistant Home Automation編程Arduino
現(xiàn)在應(yīng)該同時(shí)設(shè)置IFTTT和ThingSpeak帳戶(hù)。因此,根據(jù)向Google助手發(fā)送的命令,IFTTT將向我們的ThingSpeak帳戶(hù)發(fā)送一個(gè)值(0或1)。現(xiàn)在,在Arduino方面,我們必須編寫(xiě)一個(gè)程序來(lái)檢查field的值是0還是1。如果0,則必須關(guān)閉燈,如果1,則必須打開(kāi)燈。
最后,給出了完成此操作的完整程序,我將程序分成有意義的代碼片段,并在上面進(jìn)行了解釋。我們首先定義將ESP和LCD連接到Arduino的引腳。您可以參考電路圖進(jìn)行驗(yàn)證。
SoftwareSerial ESP(12,13); //ESP is connected to 12 and 13 pin of Arduino
const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2; //Mention the pin number for LCD connection
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
然后,我們必須輸入一些關(guān)鍵參數(shù),例如ESP應(yīng)該連接到其密碼的Wi-Fi名稱(chēng),最后是我們從中獲得的API調(diào)用請(qǐng)求我們的話(huà)語(yǔ)。確保已根據(jù)您的應(yīng)用程序更改了這些憑據(jù)。驗(yàn)證API密鑰并將其加載到瀏覽器中以確保。
String WiFi_SSID = “Oneplus”;
String WiFi_Pass = “nightfury”;
String sendData = “GET /channels/683739/fields/1/last.json?api_key=7EK8DHQDV3M0EJ6S&results=2”;
String output = “”; //Initialize a null string variable
在設(shè)置功能中,我們將引腳10聲明為輸出,這是我們通過(guò)繼電器連接負(fù)載的地方。然后,我們?cè)贚CD上顯示一小段介紹文字,并使用上述代碼行初始化串行監(jiān)視器。
pinMode(10,OUTPUT);
lcd.begin(16, 2); //Initialise 16*2 LCD
lcd.print(“ Arduino WiFi”); //Intro Message line 1
lcd.setCursor(0, 1);
lcd.print(“ Shield ”); //Intro Message line 2
delay(2000);
Serial.begin (9600);
默認(rèn)情況下,ESP的波特率為115200,但Arduino并非如此足夠快的速度以如此高的速度從ESP讀取數(shù)據(jù)。它確實(shí)讀取數(shù)據(jù),但是我個(gè)人很多次發(fā)現(xiàn)很多垃圾值。因此,我決定使用AT + CIOBAUD = 9600將ESP更改為以9600波特率工作,如上所示。更改波特率后,我們可以重新初始化軟件序列以使用9600波特率。
ESP.begin(115200);
ESP.println(“AT+CIOBAUD=9600”);
delay(100);
ESP.begin(9600);
接下來(lái),我們有一系列AT命令,這些命令只需要發(fā)送到模塊一次。它們包括關(guān)閉Echo選項(xiàng)(ATE0),然后將ESP設(shè)置為在站模式下工作(AT + CWMODE = 1),然后使用(AT + CWJAP)等將其連接到路由器。一旦執(zhí)行,ESP就會(huì)記住這些詳細(xì)信息,并在每次開(kāi)機(jī)時(shí)將其作為站點(diǎn)連接到我們的路由器。因此,您可以在第一次使用后注釋這些行(不過(guò)是可選的)。
ESP_talk(“ATE0”, 1000); //Turn off Echo
ESP_talk(“AT+CWMODE=1”, 1000); //Set ESP as station
ESP_talk(“AT+CWJAP=”“+ WiFi_SSID +”“,”“+ WiFi_Pass +”“”, 5000); //Connect to WiFi
delay(1000);
ESP_talk(“AT+CIPMUX=1”,1000);
delay(1000);
在主循環(huán)函數(shù)中,我們必須連接到ThingSpeak API。這可以通過(guò)首先使用以下命令啟動(dòng)與ThingSpeak網(wǎng)絡(luò)的TCP連接來(lái)完成。
ESP_talk(“AT+CIPSTART=”TCP“,”api.thingspeak.com“,80”,1000);
然后我們必須知道使用AT + CIPSEND將多少個(gè)字符發(fā)送給該連接。在我的情況下是76。因?yàn)槲覀儗l(fā)送上述命令,所以我們有74個(gè)字符,并且必須在“/n”中添加2個(gè)字符,從而得到76。
GET /channels/683739/fields/1/last.json?api_key=7EK8DHQDV3M0EJ6S&results=2
然后我們實(shí)際上發(fā)送了上面存儲(chǔ)在變量sendData中的數(shù)據(jù)。為了穩(wěn)定起見(jiàn),這些命令以100ms的延遲發(fā)送,但這不是強(qiáng)制性的。上面顯示了相同的程序。
ESP_talk(“AT+CIPSTART=”TCP“,”api.thingspeak.com“,80”,1000);//AT+CIPSTART=“TCP”,“api.thingspeak.com”,80
delay(100);
ESP_talk(“AT+CIPSEND=76”,1000);
delay(100);
ESP_talk(sendData,1000); delay(100);
上面的代碼將從ThingSpeak網(wǎng)站上以字符串值的形式獲取字段數(shù)據(jù),并將其存儲(chǔ)在變量“ output”中,看起來(lái)像像這樣。
+IPD,64:{“created_at”:“2019-01-22T12:13:32Z”,“entry_id”:15,“field1”:“0”}CLOSED
如您所見(jiàn),在整個(gè)字符串值上,我們只需要檢查field1值是0還是1。因此我們?cè)贏rduino中使用charAT函數(shù)來(lái)獲取特定的char值構(gòu)成整個(gè)字符串。該值的位置比上一個(gè)值落后11步。因此,代碼看起來(lái)像
int light_value = int (output.charAt(output.length()-11))-48;
的最后一步是將該值與0和1進(jìn)行比較。然后,如果為1,則將燈打開(kāi),如果為0,則將其關(guān)閉。還會(huì)根據(jù)字段值使LCD顯示結(jié)果。
lcd.clear();
lcd.print(“Listning.。..”); //Intro Message line 1
lcd.setCursor(0, 1);
if (light_value == 0) //light should be off
{
lcd.print(“Light is OFF :-(” );
digitalWrite(10,LOW);
}
if (light_value == 1) //light should be off
{
lcd.print(“:-) Light is ON”);
digitalWrite(10,HIGH);
}
您會(huì)注意到ESP_talk函數(shù)在整個(gè)程序中得到了廣泛使用。該功能基本上有兩個(gè)參數(shù),一個(gè)是發(fā)送到ESP模塊的實(shí)際命令,另一個(gè)是ESP應(yīng)該在該超時(shí)值之內(nèi)響應(yīng)發(fā)送的命令。 ESP的響應(yīng)然后存儲(chǔ)在變量輸出中。在調(diào)試ESP模塊時(shí),這非常方便。功能定義如下所示。
void ESP_talk(String AT_cmd, const int timeout)
{
Serial.print(“Sent: ”);
Serial.print(AT_cmd);
ESP.println(AT_cmd); //print to ESP through software serial
Serial.println(“”);//Move to next line
long int time = millis();
output=“”; //clear the string
while ( (time + timeout) 》 millis())
{
while (ESP.available())
{
char i = ESP.read(); // read one char
output +=i;//Combine char to string
}
}
Serial.print(“Received: ”);
Serial.print(output);
}
使用Google Assistant切換燈光
因此,我們都準(zhǔn)備使用Arduino ESP8266 Wi-Fi模塊通過(guò)Google Assistant在任何地方控制家用電器。如前所述,以上程序用于切換引腳10。因此,您可以在引腳10上添加一個(gè)繼電器,并根據(jù)需要連接繼電器額定值范圍內(nèi)的任何交流負(fù)載。上面顯示了我使用Relay和帶Wi-Fi屏蔽的Arduino板的設(shè)置。
我已經(jīng)使用了一個(gè)小閱讀燈作為演示負(fù)載,但是您可以選擇使用任何東西。啟動(dòng)設(shè)置并向您的Google助手說(shuō)出命令,您應(yīng)該會(huì)看到Light得到相應(yīng)的控制。當(dāng)您向Google助手發(fā)出命令時(shí),您還可以看到ThingSpeak頻道值正在更改。為了進(jìn)行調(diào)試,您可以打開(kāi)串行監(jiān)視器以檢查是否一切正常。如果是,則您的串行監(jiān)視器應(yīng)顯示類(lèi)似這樣的內(nèi)容。
您可以觀看上面的視頻以檢查項(xiàng)目的完整工作,還可以檢查我們的其他Arduino家庭自動(dòng)化項(xiàng)目。希望您喜歡該項(xiàng)目并喜歡構(gòu)建它。如果您有任何問(wèn)題,請(qǐng)隨時(shí)將它們留在上面的評(píng)論部分中,我會(huì)盡力解決。您也可以將論壇用于其他技術(shù)問(wèn)題。
責(zé)任編輯:wv
-
Arduino
+關(guān)注
關(guān)注
188文章
6472瀏覽量
187349 -
ESP8266
+關(guān)注
關(guān)注
50文章
962瀏覽量
45137
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論