本文首發(fā)于DF創(chuàng)客社區(qū) 作者:2877137721
原文鏈接:
DIY屬于你的智能家居系統(tǒng),zigbee,esp8266,51單片機
DIY家庭智能家居控制系統(tǒng)(2)51,zigbee,esp8266
相關附件于原文下方下載
【介紹】
隨著微功耗處理器以及通訊芯片的發(fā)展,以往較為耗能的有線通訊方式越來越阻礙了通訊網(wǎng)絡的發(fā)展,于是一大批的無線通訊方案應運而生,例如NBIOT,藍牙4.0,zigbee等等。同時微功耗無線處理器的流行使得傳統(tǒng)家電帶上了智能的色彩,智能家居必將是未來家庭的必備。某些高科技企業(yè)也在揶揄這塊市場,紛紛推出了自家的智能家居解決方案,比較知名的有米家方案以及阿里智能的解決方案。但是回到現(xiàn)實的使用上來說,每個家庭的條件環(huán)境其實不一樣,同樣的產(chǎn)品未必在每個家庭上都可以使用方便,所以個性化的定制產(chǎn)品才可以更好的方便我們的生活。
于是在暑假期間,萌生了DIY一套智能家居方案的想法,具有各種智能開關和傳感器等節(jié)點,并且對接物聯(lián)平臺實現(xiàn)聯(lián)網(wǎng)控制以及數(shù)據(jù)的上傳。由于家庭中將會使用到的智能設備種類繁多,所以我將采用模塊化的設計思路,即采用核心板加外圍功能部分的思路,像搭積木一樣的構(gòu)建各個智能設備。大家有同樣想制作的想法可以參考。
截至發(fā)帖前,我完成了智能網(wǎng)關,智能墻壁開關,無線遙控開關以及無線氣象站的設計制作,之后有新的設備加入的話,我會及時的更新。
【準備事項】
完成這個涉及到多方面的項目,需要的硬件設備以及開發(fā)環(huán)境較多,所以我先大概給出一個列表:
軟件篇:
- Arduino IDE:用于給ESP8266編程使用
- KEIL uVision5 :用于給51單片機編程使用
- 串口調(diào)試器:用于監(jiān)控單片機輸出數(shù)據(jù)
- lceda設計軟件:繪制電路原理圖,設計PCB電路板
硬件篇:
核心的主要控制器件在此列出,其他元器件會在制作過程中一一說明。
【制作過程】
我構(gòu)想了一張智能家庭的網(wǎng)絡拓撲圖,大家可以欣賞以下,后期圖上的設備都將加入進來:
由于涉及到多個設備的設計制作,所以本個報名貼先奉上智能家居核心板,智能網(wǎng)關以及無線氣象站的制作過程:
#制作過程之核心板篇#
>>>本項目使用zigbee網(wǎng)絡進行智能家居之間的通信。
好早之前就接觸過zigbee組網(wǎng),對于這種低成本低功耗的網(wǎng)絡還是抱有很大信心的。這里講解選擇這個網(wǎng)絡的幾大理由:
- mesh結(jié)構(gòu)的網(wǎng)絡很適合智能家居的控制結(jié)構(gòu),在入網(wǎng)的任何一個節(jié)點都可以訪問到所有節(jié)點的數(shù)據(jù),這點很適合網(wǎng)關控制各個設備。
- 低功耗使得終端設備甚至可以采用電池供電,使得所有的模組都盡量可能的無線化。
- 多跳傳輸,無線方案中最大的問題就是數(shù)據(jù)發(fā)送的不穩(wěn)定以及障礙物對信號的遮擋導致數(shù)據(jù)無法正確傳輸,而ZigBee的多跳恰好解決了這個問題,節(jié)點會自動選擇優(yōu)質(zhì)的傳輸路線多跳傳輸,保證信號質(zhì)量。
總結(jié)一下:zigbee網(wǎng)絡確實是好,但是對于我這種比較懶惰的人并不想去學習那復雜的傳輸理論以及zigbee通訊芯片的編程,于是我選擇上網(wǎng)購買ZigBee模塊,最后選擇了一種小型的串口轉(zhuǎn)zigbee模塊,比較方便單片機通訊。
說到模塊化,那么就需要核心的控制板。本質(zhì)來說就是將單片機以及購買的zigbee模塊集成到一張電路板上,并且預留各種接口,方便后期移植到各種設備上,這樣一張電路板就可以適用各種智能家居設備了。
在保證功能足夠的同時,體積也是我需要考慮的問題,如果核心板做的過大,會導致無法安裝到某些空間狹小的智能設備中,所以小體積是我所著重考慮的。
基于多方面考慮之后,stc8F2k08s2進入了我的視線,小巧的sop16封裝以及簡單的外圍電路,足夠的IO口(14個)。這款芯片成為了核心板的控制單片機。于是一番繪制原理圖以及PCB之后,成品大概明朗了:
焊接好的成品如下:
這將會成為以后所有我的智能家居方案的核心控制板。
#制作過程之智能網(wǎng)關篇#
完成了核心板的制作,網(wǎng)關成為了下一個比較關注的對象,因為家中的所有智能設備的控制以及通訊都會由他來完成,包括鏈接到互聯(lián)網(wǎng)上傳數(shù)據(jù),所以說對于網(wǎng)關的硬件選取也是重中之重。上聯(lián)互聯(lián)網(wǎng),下接zigbee小型通訊網(wǎng),網(wǎng)關擔任了一個家庭控制中心的角色,對于它的選擇我認為esp8266是個不錯的方案,可以支持arduino ide編程,這對于不太了解網(wǎng)絡通訊協(xié)議的我來說是個好消息,因為在arduino的編程中,我可以借助強大的庫函數(shù)來完成我想要的功能。
為了方便網(wǎng)關節(jié)點的狀態(tài)顯示以及相關信息讀取,為以后的調(diào)試提供便利,我決定給網(wǎng)關添加了顯示屏屏,這樣方便信息的讀取以及調(diào)試工作。最終選擇了下面的這塊4.3寸的串口組態(tài)觸摸屏。
完成了zigbee節(jié)點核心板的設計以及網(wǎng)關的硬件選擇,整個智能家居系統(tǒng)的主要部分就構(gòu)建完成了,我先不講解程序的編寫,因為我將會在調(diào)試好每一個智能設備之后,再對網(wǎng)關進行編寫對應設備的接口程序。即完成一個智能設備的開發(fā)之后再對接網(wǎng)關,使其加入到家中的zigbee網(wǎng)絡,實現(xiàn)聯(lián)動控制或者聯(lián)網(wǎng)控制,因為畢竟我使用的ZigBee模組只是起一個通訊的作用,具體的功能實現(xiàn)還是靠核心板上的單片機來完成。這種開發(fā)方法叫做迭代開發(fā),對于較為龐大的項目是一種較好的解決方案。搭建好的智能網(wǎng)關。
#制作過程之無線氣象站篇#
接下來我將會進行首個智能設備的制作,我將會從制作這個設備的緣由開始,一步一步去實現(xiàn)我想要的功能,帖子篇幅較長,請慢慢觀看。
1.起因:
說到氣象站這個東西,一般大家都會覺得氣象局才需要這個東西去量測各種氣象數(shù)據(jù)(溫濕度,氣壓,風速風向,紫外線強度等等),而我們得知當天的氣象數(shù)據(jù)多半是靠手機上的天氣軟件來查看的,但是這樣帶來一些問題:手機上獲得的數(shù)據(jù)往往不能代表區(qū)域中所有的數(shù)據(jù),如果我們可以在家中自己搭建一個氣象站,這樣就可以得知最實時的,最精確的數(shù)據(jù),最具有參考性。同時,氣象站的各種數(shù)據(jù)輸出還可以在以后為我?guī)砀雍线m的穿衣建議,以及可以和家中的其他設備聯(lián)動,比如室外光線弱會自動開啟室內(nèi)電燈之類的。
2.氣象數(shù)據(jù)選擇
氣象數(shù)據(jù)有很多種類,我選擇了幾項對生活影響較大的參數(shù):溫度、濕度、氣壓、光照強度、紫外線強度。選擇這些參數(shù)的原因,基于以下幾方面:
- 溫濕度數(shù)據(jù)可以給讓我知道外面是高溫還是低溫,干燥還是濕潤,這對一些出行需要攜帶的衣物以及保濕工作起到很好的參考作用。
- 氣壓數(shù)據(jù)很能說明接下來的天氣情況,相信大家都知道雨前蜻蜓低飛的原因,就是因為氣壓較低,如果當前測得的氣壓較低,那么周邊高氣壓的區(qū)域的空氣會向低氣壓區(qū)域流動,低氣壓區(qū)域的空氣就是越聚越多,導致空氣上升,遇冷凝結(jié),造成降雨。所以氣壓數(shù)據(jù)可以很好的預報將來是否會有降雨發(fā)生。
- 光照強度以及紫外線強度可以很好提醒我是否需要防曬以及攜帶墨鏡等等,因為并不是光照強度越大紫外線強度就越大的,前者表示了照明強度,單位是勒克斯,后者表示了紫外線的強度,單位是瓦每平方米。在中國近赤道的城市,太陽的紫外線強度普遍比其他城市大,但是光照強度并不會比一些“火爐”城市大。這就是為什么有的太陽光看起來不耀眼,實際上很傷害我們的皮膚。
3.傳感器選擇
這個氣象站由于需要長時間使用,那么在倡導節(jié)能減排的今天,低功耗是必須要考慮在內(nèi)的。所以對于傳感器的選擇,我使用了一些采用iic接口通訊的數(shù)字傳感器,既可以保證數(shù)據(jù)的精確,也可以設置傳感器進入低功耗的模式。下面是我所 使用的傳感器,輸入這些名字就可以在某寶搜索到 :
4.代碼的編寫:
這么多傳感器的調(diào)試是一個比較費時費力的工作,我耗費了幾乎一周的時間來調(diào)試這些傳感器,索性終于都可以正常的輸出數(shù)據(jù)了。
下面用一張表來解釋氣象站的代碼邏輯:
可以看到,在程序開始執(zhí)行之后,首先初始化了各個傳感器以及設置他們的工作模式,然后四個傳感器紛紛進入低功耗模式節(jié)省電力。由于氣象站需要在每次間隔一段時間后上傳所有的傳感器數(shù)據(jù),所以我在這里用到了STC8系列單片機所帶有的掉電喚醒定時器,這個定時器在單片機進入掉電模式之后仍然可以運行,這樣定時器在設定時間到來之后就會喚醒單片機,這時候單片機就可以依次喚醒所有傳感器并且獲取數(shù)據(jù),然后再次進入掉電模式,等待下一次喚醒。
這樣我使用所有傳感器都帶有的低功耗睡眠模式以及單片機的掉電模式很大程度上節(jié)省了電力,使得這個氣象站使用電池供電成為可能。
5.實物的焊接制作
調(diào)試好了所有的傳感器,下面就是把他們焊接到一起了,我使用洞洞板來焊接四個傳感器。
焊接好了之后,實測待機狀態(tài)下的電流數(shù)據(jù)11uA:
單片機喚醒,采集傳感器數(shù)據(jù),使用zigbee模塊發(fā)射出去時的整體電流數(shù)據(jù)28mA
綜合來說,待機狀態(tài)下的電流數(shù)據(jù)幾乎可以忽略不計(微安級),而在發(fā)射狀態(tài)下,其電流可以達到28ma左右,但是畢竟此狀態(tài)下需要的時間極少(800ms左右,包括收集傳感器數(shù)據(jù)以及發(fā)送)所以氣象站決定采用鋰電池供電,我采用了比傳統(tǒng)鋰聚合物電池穩(wěn)定許多的18650電池(很害怕鋰聚合物電池鼓包)。
由于氣象站長期在室外(我家陽臺上),所以我沒有浪費室外較好的太陽能資源,于是我購買了一個太陽能電池板以及一個太陽能充電器,這樣在晴天太陽能就可以給電池補充電力,在沒有太陽的情況下,則使用鋰電池來給氣象站供電,下面是太陽能電池板在多云天下的輸出電壓:
鋰電池用的是一個2200mah的18650電池,根據(jù)理論計算,滿電的18650電池大概夠氣象站續(xù)航:
這樣的續(xù)航成績保證了連續(xù)近一個半月可以用純靠電池供電,加上太陽能電池板晴天下近9小時的電力輸出,這下可以永遠不需要充電了??!
但是為了考慮周全一點以及保護電池,我給18650電池增加了一個保護板,這樣即使極端環(huán)境下,電池也不會過放了。
6.氣象站輸出數(shù)據(jù)測試
現(xiàn)在氣象站可以正常的定時喚醒了,我開始準備測試數(shù)據(jù)是否正常,鏈接zigbee的協(xié)調(diào)器節(jié)點到電腦上,打開氣象站的電源,可以看到每隔一段時間,串口都會輸出一些數(shù)據(jù):
下面是對一幀數(shù)據(jù)的解讀:(當前的測試位置是氣象站放在室內(nèi)上,當天晴天)
- 濕度:64.8%
- 溫度:32.08度
- 氣壓:100194帕斯卡
- 光照強度:213勒克斯
- 紫外線強度:1(室內(nèi)幾乎為0,此數(shù)據(jù)請參考VEML6070的數(shù)據(jù)手冊,作進一步分析)
可以看到氣象站的數(shù)據(jù)正確無誤,所以接下來就是針對網(wǎng)關的開發(fā)了
7.網(wǎng)關對應程序的編寫:
由于ZIgbee協(xié)調(diào)器節(jié)點是采用串口通信的方式,于是需要ESP8266的串口來于協(xié)調(diào)器節(jié)點進行通信,所以我使用了Arduino自帶的軟串口庫,這樣我可以隨意定義兩個io口作為串口使用。
網(wǎng)關對于氣象站來的數(shù)據(jù)需要分為接受,處理,上傳到物聯(lián)平臺共3個過程,所以我一部分一部分的講解如何處理。
- 接受過程:
從之前的氣象站測試數(shù)據(jù)圖來看,一幀數(shù)據(jù)一共有近20多個字節(jié),所以當一幀數(shù)據(jù)到來時,我一次性的將其從串口取出,并且依據(jù)數(shù)據(jù)的格式,從中獲取節(jié)點類型,節(jié)點編號,指令類型,數(shù)據(jù)長度等信息。
得到了這些數(shù)據(jù)之后,就方便我的網(wǎng)關去判斷到底數(shù)據(jù)來自哪個設備,從而執(zhí)行相關的程序。
那么現(xiàn)在我的網(wǎng)關憑借節(jié)點類型知道了是無線氣象站發(fā)來的數(shù)據(jù),接下來就進入到數(shù)據(jù)處理的過程了。
- 處理過程:
大家可以看出,氣象站發(fā)來的數(shù)據(jù)全部是16進制的,所以我需要將其轉(zhuǎn)換成整數(shù)型變量,以便發(fā)送到物聯(lián)平臺。在氣象站的數(shù)據(jù)包中,取其中數(shù)據(jù)如下:
經(jīng)過一些移位操作,我獲得了所有的數(shù)據(jù)(十進制格式),下面就方便我上傳到物聯(lián)平臺了!
- 對接物聯(lián)平臺過程:
這次我使用的物聯(lián)平臺是貝殼物聯(lián)平臺,是免費的,只要注冊一個賬號即可使用,并且有手機APP以及微信小程序,這樣給我以后的控制提供了很多選擇。連接方式是采用TCP鏈接,即我的網(wǎng)關需要不停的發(fā)送心跳包來保持一個在線的狀態(tài),建立好TCP鏈接之后,只需要向服務器不停的上傳數(shù)據(jù),這些數(shù)據(jù)就可以正常的在手機上查看了。這里借用貝殼物聯(lián)通訊協(xié)議中的一個圖片來說明。
得益于Arduino眾多的庫文件,只需要幾行代碼,就可以鏈接到自家的WIFI并且建立一個TCP鏈接了。
之后的事情變得簡單了許多,由于貝殼物聯(lián)平臺的通訊格式采用的是json字符串(這也是大多數(shù)物聯(lián)平臺網(wǎng)站要求的通訊格式,即智能設備發(fā)送給服務器,服務器反饋回數(shù)據(jù)都是這個格式),所以我添加了一個用于處理json字符串的json庫,這樣我的智能網(wǎng)關就可以處理來自服務器的數(shù)據(jù)了。
至此對接物聯(lián)平臺的工作就完成了,下面開始演示!
【照片演示】
編寫好代碼,并且用arduino自帶的millis函數(shù)來讓ESP8266每隔5s上傳一次氣象站發(fā)送來的數(shù)據(jù),下載代碼到ESP8266后,登錄貝殼物聯(lián)手機端,我查看到了這些信息:
此時ESP8266成功的收到了zigbee協(xié)調(diào)器發(fā)送來的數(shù)據(jù),并且成功的將數(shù)據(jù)的格式轉(zhuǎn)換了過來,上傳到了服務器。
至此,我實現(xiàn)了氣象站以及網(wǎng)關的設計,電路搭建以及數(shù)據(jù)的上傳。給家里添加了相對準確的氣象參考數(shù)據(jù),并且只要我的手機有網(wǎng)絡的情況下,隨時可以查看家中的氣象數(shù)據(jù),給家庭帶來了很大方便。
接下來智能墻壁開關,無線遙控開關的設計制作我會持續(xù)發(fā)帖更新,以及其他更多的智能設備加入。
【相關文件或資源】
在這里我附上全部各個傳感器的調(diào)試代碼(基于STC8系列單片機開發(fā)),所以你如果也使用了STC8系列的單片機,可以直接使用。
#制作過程之智能墻壁開關篇#
下面是介紹智能墻壁開關的設計,核心就是使得家里墻壁開關智能化,可以聯(lián)網(wǎng)控制,達到場景聯(lián)動,智能控制等目的。
我嘗試就家中的傳統(tǒng)開關進行改造,但是發(fā)現(xiàn)拆開之后內(nèi)部空間實在不夠,沒法完成改裝
于是嘗試網(wǎng)購新的開關,尋找空間大些的墻壁開關,后來我找到了專門生產(chǎn)觸摸智能開關外殼的廠家,購買了幾個觸摸墻壁開關的外殼,內(nèi)部空間較大,適合改造
由于是觸摸面板,所以我準備使用觸摸模塊作為輸入,那么這就帶來了一個問題,控制方式的轉(zhuǎn)變。傳統(tǒng)的墻壁開關,開關的位置(抬起,按下)代表了不同的開關狀態(tài),現(xiàn)在變成觸摸模塊后,每一次觸摸,代表的是開關狀態(tài)的變化,即觸摸一次,開關的狀態(tài)變化一次(開變成關/關變成開),所以在代碼的邏輯中,我會注意到這個控制模式的變化。
關于執(zhí)行機構(gòu),也就是一充當原來機械開關的器件,我準備使用繼電器來代替。繼電器可以讓我使用單片機輸出的信號去控制220V交流電壓的通斷,并且提供良好的隔離以及絕緣性能。
1.代碼的編寫:
選擇了繼電器以及觸摸模塊之后,我在面包板上搭建了電路,接下來就是編寫代碼了
對于 智能開關節(jié)點,我將zigbee模塊配置成了路由器節(jié)點,這樣做的好處是,墻壁開關同時扮演了一個路由器的角色,看可以協(xié)助一些遠距離的終端節(jié)點完成多跳數(shù)據(jù)傳輸。。例如我想在臥室使用一個無線開關(下一章將會說到)去控制家門口的燈光,直接將數(shù)據(jù)發(fā)送到家門口的智能開關上或許信號強度不夠造成通信失敗,這時我在客廳增加一個路由器節(jié)點之后,無線開關的信號便可以傳輸?shù)郊议T口的智能開關上。
同樣的,為了響應國家節(jié)能減排的號召,我給單片機配置成了空閑模式以節(jié)省功耗,但是空閑模式下單片機沒法正確及時的檢測到觸摸按鍵的按下,所以我使用單片機的外部中斷來檢測觸摸按鍵,當觸摸按鍵按下時,單片機檢測到電平變化,引發(fā)中斷,喚醒單片機,使得單片機執(zhí)行相關指令。
當zigbee模塊收到來自智能網(wǎng)關的數(shù)據(jù)時候(例如閉合開關或者斷開開關),其輸出數(shù)據(jù)引發(fā)的串口中斷也會喚醒單片機,這時候單片機會執(zhí)行收到的指令,隨后再次進入空閑模式。
此外,為了更好的檢測每個開關的狀態(tài),每次開關有動作之后,會將當前的狀態(tài)上報給智能網(wǎng)關,以便網(wǎng)關檢測家中所有的開關狀況。
2.開關的測試:
鏈接zigbee的協(xié)調(diào)器節(jié)點到電腦上,打開智能開關的電源,可以看到每當我觸摸開關,對應的繼電器都會動作,并且協(xié)調(diào)器節(jié)點串口都會輸出一些數(shù)據(jù):
下面是一幀數(shù)據(jù)的解讀
測試完畢,智能開關達到了我想要的功能,下面就是針對我購買的外殼設計PCB板了
3.智能開關PCB的設計與制作:
對于購買的外殼,我先找到了一張廠家提供的CAD圖紙,上面標有了一些基本尺寸,這樣方便我去設計一塊合適的PCB板。將之前在面包板上搭建的電路,繪制成原理圖之后效果如下:
轉(zhuǎn)換成PCB文件后,經(jīng)過簡單的元件擺放以及布線后,完成的效果如下:
將交流高壓部分和直流低壓部分開槽隔離,提供了較好的抗干擾特性。而反面則設有zigbee模塊以及單片機的位置。
約幾天后,我收到了制作好的板子。
同時到來的還有一些元器件。
焊接過程太繁瑣無聊,略去。焊接好之后的效果圖
安裝上觸摸模塊之后,使用雙面膠將觸摸模塊粘貼在面板玻璃上。
燒錄程序,合上外殼
背后使用標簽標明出接線口定義,方便安裝。
使用智能開關替代家中的傳統(tǒng)開關。
4.網(wǎng)關對應程序的編寫:
這部分的程序主要是網(wǎng)關接受物聯(lián)平臺發(fā)來的控制指令json字符串,然后解碼翻譯,最后通過zigbee網(wǎng)絡告知智能開關引起相應動作。所以其核心在于接受服務器的json字符串,解釋其含義。
同樣的,還是使用Arduino的json庫來處理這些信息,查閱物聯(lián)平臺的通訊協(xié)議手冊,發(fā)現(xiàn)采用如下格式:
所以只需要解讀say指令后面附帶的指令即可,于是很快的,一個使用else if語句的并列結(jié)構(gòu)就寫好了,程序?qū)κ盏降淖址来闻袛?,如果相同則發(fā)送指令給智能開關。
上傳程序到ESP8266,開始測試!
5.綜合測試
安裝智能開關到位,接上網(wǎng)關的電源,觸摸觸摸開關,電燈可以正常開啟關閉
拿出手機,打開物聯(lián)平臺,按下開啟電燈按鈕,電燈開啟。
測試完畢
至此,我實現(xiàn)了智能開關的設計,電路搭建以及使用網(wǎng)絡控制。并且支持各種功能擴展(定時開關,和人體傳感器聯(lián)動等等),升級空間十分大,并且可聯(lián)網(wǎng)控制,給生活帶來了很大方便。:
#制作過程之智能墻壁開關篇#
下面是介紹智能墻壁開關的設計,核心就是使得家里墻壁開關智能化,可以聯(lián)網(wǎng)控制,達到場景聯(lián)動,智能控制等目的。
我嘗試就家中的傳統(tǒng)開關進行改造,但是發(fā)現(xiàn)拆開之后內(nèi)部空間實在不夠,沒法完成改裝
于是嘗試網(wǎng)購新的開關,尋找空間大些的墻壁開關,后來我找到了專門生產(chǎn)觸摸智能開關外殼的廠家,購買了幾個觸摸墻壁開關的外殼,內(nèi)部空間較大,適合改造
由于是觸摸面板,所以我準備使用觸摸模塊作為輸入,那么這就帶來了一個問題,控制方式的轉(zhuǎn)變。傳統(tǒng)的墻壁開關,開關的位置(抬起,按下)代表了不同的開關狀態(tài),現(xiàn)在變成觸摸模塊后,每一次觸摸,代表的是開關狀態(tài)的變化,即觸摸一次,開關的狀態(tài)變化一次(開變成關/關變成開),所以在代碼的邏輯中,我會注意到這個控制模式的變化。
關于執(zhí)行機構(gòu),也就是一充當原來機械開關的器件,我準備使用繼電器來代替。繼電器可以讓我使用單片機輸出的信號去控制220V交流電壓的通斷,并且提供良好的隔離以及絕緣性能。
1.代碼的編寫:
選擇了繼電器以及觸摸模塊之后,我在面包板上搭建了電路,接下來就是編寫代碼了
對于 智能開關節(jié)點,我將zigbee模塊配置成了路由器節(jié)點,這樣做的好處是,墻壁開關同時扮演了一個路由器的角色,看可以協(xié)助一些遠距離的終端節(jié)點完成多跳數(shù)據(jù)傳輸。。例如我想在臥室使用一個無線開關(下一章將會說到)去控制家門口的燈光,直接將數(shù)據(jù)發(fā)送到家門口的智能開關上或許信號強度不夠造成通信失敗,這時我在客廳增加一個路由器節(jié)點之后,無線開關的信號便可以傳輸?shù)郊议T口的智能開關上。
同樣的,為了響應國家節(jié)能減排的號召,我給單片機配置成了空閑模式以節(jié)省功耗,但是空閑模式下單片機沒法正確及時的檢測到觸摸按鍵的按下,所以我使用單片機的外部中斷來檢測觸摸按鍵,當觸摸按鍵按下時,單片機檢測到電平變化,引發(fā)中斷,喚醒單片機,使得單片機執(zhí)行相關指令。
當zigbee模塊收到來自智能網(wǎng)關的數(shù)據(jù)時候(例如閉合開關或者斷開開關),其輸出數(shù)據(jù)引發(fā)的串口中斷也會喚醒單片機,這時候單片機會執(zhí)行收到的指令,隨后再次進入空閑模式。
此外,為了更好的檢測每個開關的狀態(tài),每次開關有動作之后,會將當前的狀態(tài)上報給智能網(wǎng)關,以便網(wǎng)關檢測家中所有的開關狀況。
2.開關的測試:
鏈接zigbee的協(xié)調(diào)器節(jié)點到電腦上,打開智能開關的電源,可以看到每當我觸摸開關,對應的繼電器都會動作,并且協(xié)調(diào)器節(jié)點串口都會輸出一些數(shù)據(jù):
下面是一幀數(shù)據(jù)的解讀
測試完畢,智能開關達到了我想要的功能,下面就是針對我購買的外殼設計PCB板了
3.智能開關PCB的設計與制作:
對于購買的外殼,我先找到了一張廠家提供的CAD圖紙,上面標有了一些基本尺寸,這樣方便我去設計一塊合適的PCB板。將之前在面包板上搭建的電路,繪制成原理圖之后效果如下:
轉(zhuǎn)換成PCB文件后,經(jīng)過簡單的元件擺放以及布線后,完成的效果如下:
將交流高壓部分和直流低壓部分開槽隔離,提供了較好的抗干擾特性。而反面則設有zigbee模塊以及單片機的位置。
約幾天后,我收到了制作好的板子。
同時到來的還有一些元器件。
焊接過程太繁瑣無聊,略去。焊接好之后的效果圖
安裝上觸摸模塊之后,使用雙面膠將觸摸模塊粘貼在面板玻璃上。
燒錄程序,合上外殼
背后使用標簽標明出接線口定義,方便安裝。
使用智能開關替代家中的傳統(tǒng)開關。
4.網(wǎng)關對應程序的編寫:
這部分的程序主要是網(wǎng)關接受物聯(lián)平臺發(fā)來的控制指令json字符串,然后解碼翻譯,最后通過zigbee網(wǎng)絡告知智能開關引起相應動作。所以其核心在于接受服務器的json字符串,解釋其含義。
同樣的,還是使用Arduino的json庫來處理這些信息,查閱物聯(lián)平臺的通訊協(xié)議手冊,發(fā)現(xiàn)采用如下格式:
所以只需要解讀say指令后面附帶的指令即可,于是很快的,一個使用else if語句的并列結(jié)構(gòu)就寫好了,程序?qū)κ盏降淖址来闻袛?,如果相同則發(fā)送指令給智能開關。