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