基于STM32的智能家居系統(tǒng)設(shè)計(jì)
摘要
本文設(shè)計(jì)介紹一種以stm32 單片機(jī)為核心,設(shè)計(jì)了一套基于GPRS無(wú)線網(wǎng)絡(luò)的智能家居控制系統(tǒng)。該系統(tǒng)以GPRS通信為基礎(chǔ)、能通過(guò)無(wú)線通信技術(shù)實(shí)時(shí)監(jiān)控家居的溫濕度狀態(tài),并能自由控制家居的電器的開(kāi)關(guān)操作。同時(shí)集成光強(qiáng)采集電路,能自動(dòng)開(kāi)關(guān)窗簾的功能。
本設(shè)計(jì)硬件電路結(jié)構(gòu)簡(jiǎn)單,分為控制器模塊,GPRS模塊,繼電器控制模塊,步進(jìn)電機(jī)控制模塊等五大電路模塊,其中控制器選用基于cotex-m3內(nèi)核的32位微控制器STM32F103R8T6。GPRS模塊選用SIM900模塊,人機(jī)交互模塊選用OLED12864模塊顯示數(shù)據(jù),獨(dú)立鍵盤(pán)作為輸入設(shè)備,繼電器控制輸出控制家電電路開(kāi)關(guān)。最終通過(guò)系統(tǒng)的測(cè)試,本設(shè)計(jì)實(shí)現(xiàn)的功能包括:窗簾電機(jī)檢測(cè)當(dāng)前光照強(qiáng)度或者濕度情況實(shí)現(xiàn)自動(dòng)開(kāi)閉以及本地按鍵控制開(kāi)閉、GSM短信遠(yuǎn)程控制繼電器的開(kāi)閉、室內(nèi)溫度異常時(shí)的GSM短信通知。
Design of Intelligent Home System Based on STM32
Abstract:This paper introduces a kind of intelligent home control system based on GPRS wireless network with stm32 single chip as the core. The system based on GPRS communication, wireless communication technology can be real-time monitoring of home temperature and humidity status, and can freely control the home electrical switch operation, the use of stm32 internal calendar to achieve effective time management of household appliances, while integrated light Acquisition circuit, can automatically switch the function of the window.
The design of the hardware circuit is simple, divided into controller module, GPRS module, relay control module, stepper motor control module and other five circuit modules, including controller based on cotex-m3 core 32-bit microcontroller STM32F103R8T6. GPRS module selection SIM900 module, human-computer interaction module selection OLED12864 module display data, independent keyboard as input device, relay control output control home appliance circuit switch. Finally, through the system test, the design of the realization of the functions include: the curtain motor to detect the current light intensity or humidity to achieve automatic opening and closing and local key control open and close, GSM SMS remote control relay opening and closing, indoor temperature abnormal GSM SMS notification
目錄
第1章 前言
1.1 課題研究的背景和實(shí)際意義
1.1.1課題背景
1.1.2實(shí)際意義
1.2國(guó)內(nèi)外發(fā)展現(xiàn)狀、存在問(wèn)題以及前景
1.2.1發(fā)展現(xiàn)狀
1.2.2存在問(wèn)題
1.2.3發(fā)展前景
1.3 主要工作、內(nèi)容安排及預(yù)期成果
1.3.1主要研究工作
1.3.2預(yù)期成果
第2章 總體設(shè)計(jì)方案
2.1 系統(tǒng)總體方案設(shè)計(jì)
2.2 系統(tǒng)方案選擇
2.2.1 無(wú)線通訊方案選擇
2.2.2 顯示器方案選擇
第3章 系統(tǒng)硬件設(shè)計(jì)
3.1 控制單元模塊
3.2 人機(jī)交互模塊
3.3 GPRS電路設(shè)計(jì)
3.4 溫濕度傳感器電路設(shè)計(jì)
3.5 光強(qiáng)檢測(cè)電路設(shè)計(jì)
3.6 窗簾控制電路設(shè)計(jì)
3.6.1 步進(jìn)電機(jī)的選用
3.6.2 步進(jìn)電機(jī)28BYJ-48介紹
3.6.3 步進(jìn)電機(jī)驅(qū)動(dòng)
3.7 繼電器驅(qū)動(dòng)電路設(shè)計(jì)
3.8 電源電路設(shè)計(jì)
第4章 系統(tǒng)軟件設(shè)計(jì)
4.1 軟件開(kāi)發(fā)環(huán)境介紹
4.2 軟件總體設(shè)計(jì)
4.2.1 程序結(jié)構(gòu)分析
4.2.2 主程序設(shè)計(jì)
4.2.3 OLED驅(qū)動(dòng)程序分析
4.2.4 SIM900通信程序設(shè)計(jì)
第5章 系統(tǒng)調(diào)試與結(jié)果分析
5.1 程序仿真設(shè)計(jì)
5.2 實(shí)物調(diào)試
結(jié)論
致謝
參考文獻(xiàn)
第1章 前 言
1.1 課題研究的背景和實(shí)際意義
1.1.1 課題背景
智能家居是在以原有傳統(tǒng)住宅為基礎(chǔ),添加了網(wǎng)絡(luò)通信、智控家電、大規(guī)模傳感網(wǎng)絡(luò)等模塊設(shè)施的新型居住環(huán)境。這種新型家居環(huán)境的特點(diǎn)是集服務(wù)、系統(tǒng)控制、設(shè)施為一體,優(yōu)點(diǎn)是舒適便捷、安全環(huán)保。系統(tǒng)既包含分布家居各個(gè)部位和設(shè)備上的傳感器網(wǎng)絡(luò)系統(tǒng),還包括中央控制系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)和網(wǎng)絡(luò)通信系統(tǒng)。用戶通過(guò)手機(jī)、電腦等終端設(shè)備以及網(wǎng)絡(luò)通信系統(tǒng)實(shí)現(xiàn)對(duì)室內(nèi)家電進(jìn)行本地或遠(yuǎn)程控制。智能家居系統(tǒng)通常可以實(shí)現(xiàn)監(jiān)控功能:室內(nèi)煙霧、煤氣檢測(cè)及門(mén)窗監(jiān)控等;遠(yuǎn)程控制功能:開(kāi)閉家電、遠(yuǎn)程收水電費(fèi)等。智能家居具有可定制性,即可根據(jù)不同客戶的家居需求、預(yù)算及住房條件來(lái)設(shè)計(jì)不同的設(shè)計(jì)方案。
在20世紀(jì)80年代初,在美國(guó)業(yè)內(nèi)就提出了Smart Home的概念,即智能家居的原型。然而在很長(zhǎng)一段時(shí)間內(nèi)沒(méi)有具體的建筑案例問(wèn)世。直到1984年,在建設(shè)美國(guó)康涅狄格州(Connecticut)哈特佛市(Hartford)的CityPlaceBuilding時(shí),美國(guó)聯(lián)合科技公司(United Technologies Building System)把建筑設(shè)備信息化、智控化應(yīng)用于這項(xiàng)工程,才出現(xiàn)了第一項(xiàng)的“智能化建筑”工程,由此將智能家居行業(yè)的發(fā)展和需求推到了全世界面前。
1.1.2 實(shí)際意義
經(jīng)濟(jì)的飛速發(fā)展使人們對(duì)家居環(huán)境的要求日趨上漲與當(dāng)前智能家居所產(chǎn)生的發(fā)展瓶頸形成尖銳的矛盾,將迫切地驅(qū)使智能家居技術(shù)有進(jìn)一步的飛躍。本課題的實(shí)際意義就在于通過(guò)對(duì)智能家居控制系統(tǒng)的了解及基礎(chǔ)應(yīng)用,有助于讀者的智能家居概念啟蒙和深入理解,激發(fā)讀者對(duì)智能家居控制系統(tǒng)的研究興趣。其次,從工程意義上講,本文所介紹的基于stm32控制器的和GPRS網(wǎng)絡(luò)通信控制的家居環(huán)境監(jiān)測(cè)及家居電器開(kāi)關(guān)控制系統(tǒng)是在一定程度可用于實(shí)踐的,以此來(lái)滿足人們生活的多樣化需要,提升人們的生活質(zhì)量。
1.2 國(guó)內(nèi)外發(fā)展現(xiàn)狀、存在問(wèn)題以及前景
1.2.1 發(fā)展現(xiàn)狀
國(guó)際市場(chǎng)上看,由于發(fā)展開(kāi)始較早且大量的研發(fā)資源投入,美國(guó)以及一些歐洲國(guó)家在智能家居研發(fā)技術(shù)和市場(chǎng)比例一直走在世界前列。而發(fā)展近期,歐美一些頂尖研發(fā)公司投入到智能家居市場(chǎng)中來(lái),極大地推動(dòng)了智能家居的發(fā)展進(jìn)程,同時(shí)也上線了一些可規(guī)模生產(chǎn)的實(shí)用項(xiàng)目。如“夢(mèng)幻之家”、“居所之門(mén)”、“家庭主任”等。除此之外,亞太地區(qū)日、韓、新等國(guó)的相關(guān)前沿企業(yè)也正為智能家居研發(fā)作大規(guī)模投入。
而國(guó)內(nèi),信息化的春風(fēng)走進(jìn)了千家萬(wàn)戶為中國(guó)智能家居的發(fā)展能追上國(guó)際發(fā)展腳步提供了可能。進(jìn)年來(lái),國(guó)家也越來(lái)越注重國(guó)內(nèi)智能家居的發(fā)展。但由于我國(guó)智能家居發(fā)展起步較晚,還尚未形成合理統(tǒng)一的國(guó)家標(biāo)準(zhǔn),所以還需克服很多標(biāo)準(zhǔn)上技術(shù)上的難關(guān)。目前,國(guó)內(nèi)智能家居市場(chǎng)也開(kāi)發(fā)出了以海爾企業(yè)的e家庭和清華同方企業(yè)的e-home為代表的智能家居產(chǎn)品。
1.2.2 存在問(wèn)題
目前存在的智能家居系統(tǒng)產(chǎn)品自身性能與消費(fèi)者的要求相去甚遠(yuǎn),這樣的矛盾在很大程度阻礙了智能家居的發(fā)展。具體情況如下:
①人們對(duì)于智能家居的期望過(guò)大導(dǎo)致智能家居功能過(guò)于理想化。而廣告商對(duì)智能家居不切實(shí)際的宣傳加劇了這一現(xiàn)象。在技術(shù)落后的發(fā)展現(xiàn)狀面前,這就形成了一個(gè)形式大于實(shí)際效果的尖銳矛盾。
②智能家居行業(yè)還沒(méi)有建立起統(tǒng)一的標(biāo)準(zhǔn)和協(xié)議。智能家居的各個(gè)研發(fā)行業(yè)均開(kāi)發(fā)了屬于自己產(chǎn)品的協(xié)議標(biāo)準(zhǔn),這樣導(dǎo)致各產(chǎn)品整合、關(guān)聯(lián)時(shí)出現(xiàn)不兼容的現(xiàn)象。所以,要綜合各研發(fā)行業(yè)的成果來(lái)進(jìn)一步推進(jìn)智能家居的發(fā)展必須建立統(tǒng)一的標(biāo)準(zhǔn)協(xié)議。
③作為新穎的研發(fā)行業(yè),智能家居的發(fā)展是建立在大量科研前沿的技術(shù)和成果上的,所以要大規(guī)模發(fā)展智能家居必然導(dǎo)致巨額的推廣和普及成本。要想使智能家居大規(guī)模普及實(shí)用,價(jià)格問(wèn)題不同忽視。
1.2.3 發(fā)展前景
曾幾何時(shí),智能家居僅僅是一個(gè)寄托了人們對(duì)未來(lái)生活想象的抽象概念。而時(shí)至今日,在科技發(fā)展的推動(dòng)下,人們生活品質(zhì)在一波又一波的智能浪潮中獲得提升。如今,智能家居行業(yè)已經(jīng)處于快速發(fā)展軌道且效用日益在人們生活中擴(kuò)大化,但前文中提到的當(dāng)下出現(xiàn)的問(wèn)題決定了智能家居行業(yè)還有很長(zhǎng)的路要走,并且這條路會(huì)越走越寬,前景大好。
放眼于國(guó)內(nèi),自從引入智能家居以來(lái),由于諸多原因,國(guó)內(nèi)智能家居行業(yè)發(fā)展一直不慍不火。目前國(guó)內(nèi)行業(yè)正進(jìn)入了一個(gè)發(fā)展期的臨界點(diǎn),領(lǐng)頭企業(yè)所推出的相關(guān)智能產(chǎn)品一直處于爭(zhēng)議狀態(tài),而市場(chǎng)消費(fèi)觀念還尚未形成。但在未來(lái)發(fā)展中,消費(fèi)者認(rèn)知的提高和觀念的轉(zhuǎn)變以及相關(guān)政策的鼓勵(lì)一定會(huì)大大地推進(jìn)智能家居的發(fā)展。除此之外,現(xiàn)代網(wǎng)絡(luò)技術(shù)、電子信息科學(xué)技術(shù)及物聯(lián)網(wǎng)技術(shù)的發(fā)展與成熟,也將給傳統(tǒng)智能家居提供源源不斷的發(fā)展動(dòng)力,為其指明發(fā)展變革的道路。
1.3 主要工作、內(nèi)容安排及預(yù)期成果
1.3.1 主要研究工作
消費(fèi)者們對(duì)于智能家居呈現(xiàn)出一種多樣化的迫切性需求,一方面是居住環(huán)境的安全性,體現(xiàn)在門(mén)窗安全、煤氣泄漏及火災(zāi)隱患自動(dòng)報(bào)警等要求;另一方面是居住環(huán)境的舒適便捷性,體現(xiàn)在無(wú)線通信的控制方式、室內(nèi)燈光以及直觀性人機(jī)交互操作等方面。
在了解到消費(fèi)者對(duì)智能家居實(shí)質(zhì)性需求的基礎(chǔ)上,結(jié)合本人自身的開(kāi)發(fā)能力,本課題最終確定研究的簡(jiǎn)易智能家居控制系統(tǒng)涵蓋了如下幾個(gè)模塊:傳感器模塊、控制器模塊,GPRS通訊模塊,繼電器輸出控制模塊,顯示器模塊等五大電路模塊。本系統(tǒng)主要是側(cè)重點(diǎn)是在遠(yuǎn)程報(bào)警(室內(nèi)溫度異常時(shí),通過(guò)GPRS通訊模塊向手機(jī)發(fā)送報(bào)警短信)和遠(yuǎn)程控制(需要時(shí),遠(yuǎn)程終端通過(guò)GPRS通訊模塊向本地控制器發(fā)送控制指令,控制繼電器開(kāi)閉)方面。除此之外,還有窗簾根據(jù)光照強(qiáng)度自動(dòng)開(kāi)閉以及本地按鍵執(zhí)行中斷控制(應(yīng)用于特殊情況,如自動(dòng)控制出錯(cuò)時(shí))。
1.3.2預(yù)期成果
通過(guò)本系統(tǒng)設(shè)計(jì)各個(gè)模塊的搭建,預(yù)計(jì)能夠?qū)崿F(xiàn)如下功能:
1、本地溫度濕度報(bào)警器實(shí)時(shí)監(jiān)測(cè)室內(nèi)情況,當(dāng)溫度異常時(shí)發(fā)送室內(nèi)實(shí)時(shí)數(shù)據(jù)到設(shè)定手機(jī)上;測(cè)量范圍為濕度:20~90%RH;溫度:0~50℃。所以本設(shè)計(jì)使用范圍廣泛,既可用于氣候干燥的北方,也可用于較為濕潤(rùn)的南方;既可適用于工地環(huán)境,也可用于嬰兒房環(huán)境;
2、窗簾的自動(dòng)控制和按鍵控制(本設(shè)計(jì)中用電機(jī)正反轉(zhuǎn)表示窗簾的開(kāi)閉),這個(gè)功能解決了用戶頻繁手動(dòng)打開(kāi)窗簾的麻煩。日常生活中,當(dāng)遇到有強(qiáng)光的晴天,本設(shè)計(jì)的窗簾則能自動(dòng)關(guān)閉,減少用戶親自打開(kāi)窗簾的麻煩,遇到相反情況則相反處理。此外設(shè)計(jì)的按鍵控制窗簾,也可減少用戶手撥窗簾的不便;
3、手機(jī)發(fā)送控制指令的短信到GPRS通訊模塊,實(shí)現(xiàn)繼電器的開(kāi)閉。本設(shè)計(jì)用兩個(gè)發(fā)光二極管代替所控制的家電,實(shí)際應(yīng)用中,可通過(guò)繼電器控制空調(diào)、電飯煲等家用電器。例如炎炎夏季,空調(diào)制冷需要一定時(shí)間,用戶在回家前提前遠(yuǎn)程控制空調(diào)打開(kāi),回家即可享受到冰爽的體驗(yàn)。
第2章 總體設(shè)計(jì)方案2.1 系統(tǒng)總體方案設(shè)計(jì) 本設(shè)計(jì)硬件電路結(jié)構(gòu)包含6個(gè)部分,分別是STM32控制器、輸入部分、輸出部分、電源模塊、環(huán)境探測(cè)、SIM900無(wú)線通訊。其中控制器選用32位微控制器STM32F103R8T6OLED顯示器;輸入部分包含按鍵輸入、SMS指令輸入;輸出部分包含0.96寸12864 OLED顯示器、繼電器輸出、窗簾控制輸出;環(huán)境探測(cè)包含一體化溫濕度檢測(cè)模塊DHT11、光強(qiáng)檢測(cè)4線制光敏傳感器模塊。結(jié)構(gòu)框圖如下圖1.1所示。 光強(qiáng)檢測(cè)選用的是光感電阻傳感器模塊,可輸出模擬量(電壓)至STM32控制器處理后由OLED顯示器顯示出當(dāng)前光照強(qiáng)度,同時(shí)輸出經(jīng)比較器LM393比較后輸出的開(kāi)關(guān)量(0或1)至STM32來(lái)控制窗簾的開(kāi)關(guān)從而控制家居的通光率。在系統(tǒng)接通電源開(kāi)始運(yùn)行后,控制器通過(guò)串口訪問(wèn)SIM900通訊模塊,不斷判斷是否收到綁定手機(jī)發(fā)送的短信指令,若接受到有效命令則解析指令控制繼電器的開(kāi)閉,從而達(dá)到控制家電開(kāi)閉的目的。在系統(tǒng)工作過(guò)程中,溫濕度傳感器DHT11不斷采集環(huán)境的實(shí)時(shí)溫濕度并通過(guò)串口送入控制器。設(shè)置閾值來(lái)判別正常和異常情況,當(dāng)發(fā)現(xiàn)異常時(shí)觸發(fā)SIM900模塊向設(shè)定手機(jī)號(hào)發(fā)送狀態(tài)信息。此外,系統(tǒng)通過(guò)按鍵掃描的方式實(shí)現(xiàn)人機(jī)交互,控制器響應(yīng)按鍵輸入同時(shí)控制OLED顯示各類相關(guān)數(shù)據(jù)信息。 2.2 系統(tǒng)方案選擇2.2.1 遠(yuǎn)程通信方案選擇方案一、以太網(wǎng)。現(xiàn)如今,光纖和寬帶的大規(guī)模建設(shè)和普及使無(wú)線網(wǎng)絡(luò)幾乎已經(jīng)覆蓋了城市絕大部分區(qū)域。所以使用智能終端直接通過(guò)wifi網(wǎng)絡(luò)通信實(shí)現(xiàn)遠(yuǎn)程控制家居電器不得不算是一種可行的方法。 方案二、GPRS網(wǎng)絡(luò)。利用已建立的GPRS通信網(wǎng)絡(luò),通過(guò)收發(fā)短信訊息和指令來(lái)完成遠(yuǎn)程的人機(jī)交互。 相較之下,互聯(lián)網(wǎng)絡(luò)明顯的弊端是是節(jié)點(diǎn)的生產(chǎn)成本高;其次,單一wifi網(wǎng)絡(luò)覆蓋十分有限,且網(wǎng)絡(luò)穩(wěn)定性并不確定,會(huì)給系統(tǒng)帶來(lái)不穩(wěn)定因素;再者,由于互聯(lián)網(wǎng)涉及的控制環(huán)節(jié)較多,實(shí)現(xiàn)的技術(shù)要求更高、難度更大。相較于互聯(lián)網(wǎng)絡(luò),支持手機(jī)通訊的GPRS網(wǎng)絡(luò)有著更為廣泛的覆蓋率。根據(jù)中國(guó)移動(dòng)公司公示的統(tǒng)計(jì)數(shù)據(jù),中國(guó)的GPRS網(wǎng)絡(luò)覆蓋率已經(jīng)達(dá)到98%以上。所以,借由GPRS為載體網(wǎng)絡(luò)的家居控制更具可行性和可推廣性。而且GPRS成本更低,技術(shù)水平要求更低。因此本設(shè)計(jì)選擇以GPRS網(wǎng)絡(luò)的方式實(shí)現(xiàn)無(wú)線通信。 2.2.2 顯示器方案選擇方案一:七段數(shù)碼管顯示; 方案二:OLED液晶屏顯示。 相較之下,LED的優(yōu)點(diǎn)是硬件設(shè)計(jì)簡(jiǎn)單,成本相對(duì)較低,但缺點(diǎn)是只能顯示數(shù)字而不能顯示字符,不能實(shí)現(xiàn)更為復(fù)雜多樣的功能。當(dāng)顯示大數(shù)據(jù)時(shí),需要使用另外的編碼器進(jìn)行設(shè)計(jì),占用了大量的軟件資源。而OLED的優(yōu)點(diǎn)是節(jié)省電能、顯示功能廣泛、攜帶方便易封裝、可視角度大。最大支持64個(gè)字符顯示,4行顯示,每行16字符。自帶字體庫(kù),并且支持所有ASCII碼。一般采用SPI數(shù)據(jù)通訊方式,可將主控器的I/O端直接接入OLED的端口即可實(shí)現(xiàn)數(shù)據(jù)顯示,并保存當(dāng)前顯示狀態(tài)。因此綜合考慮到本設(shè)計(jì)的實(shí)用性,選用OLED作為顯示器。
第3章 系統(tǒng)硬件設(shè)計(jì)本設(shè)計(jì)的硬件部分包括控制單元模塊、人機(jī)交互模塊、無(wú)線通信模塊(GPRS)、執(zhí)行模塊(步進(jìn)電機(jī))、傳感器模塊(溫濕度檢測(cè)、光照檢測(cè)) 本章主要內(nèi)容是將各個(gè)模塊進(jìn)行拆分闡述和基本介紹。 3.1 控制單元模塊本設(shè)計(jì)采用的控制器是一款基于arm核和cotex-m3架構(gòu)技術(shù)的32位控制器。支持傳統(tǒng)Thumb和新型Thumb-2指令的譯碼器,采用三級(jí)流水線指令作業(yè)方式,內(nèi)部PLL技術(shù),最高運(yùn)行頻率達(dá)72MHZ。并且內(nèi)部資源豐富,內(nèi)置有128K的flash,多達(dá)20K的運(yùn)行RAM,集成多路定時(shí)器,12位的AD轉(zhuǎn)換器,多達(dá)9個(gè)通信接口和USB2.0接口,內(nèi)嵌經(jīng)出廠調(diào)教的8MHz的RC振蕩器。支持串行單線調(diào)試(SWD)和JTAG接口技術(shù),支持睡眠、停機(jī)和待機(jī)模式,其采用ECOPACK封裝。被告廣泛應(yīng)用于便攜式穿戴設(shè)備上。  主控制器及其電路是整個(gè)電路的核心,負(fù)責(zé)著整個(gè)系統(tǒng)的資源調(diào)度和計(jì)算控制。如圖3-1所示為主控制器模塊電路圖,其中主控制器型號(hào)為STM32F103R8T6,按鍵S1為復(fù)位按鍵,Y1為晶振。 本設(shè)計(jì)的晶振選用8MHz無(wú)源外部晶振,選用22P的C11,C13為起振電筒。整個(gè)外部時(shí)鐘電路為控制器提供一個(gè)8MHz的穩(wěn)定的時(shí)鐘源。再經(jīng)內(nèi)部配置PLL,使控制器運(yùn)行在72MHZ工作頻率。為了方便起振,起振電容選用22pF。圖中Y2為萬(wàn)年歷時(shí)鐘電路,BT1為萬(wàn)年歷備用電池,當(dāng)主機(jī)電源關(guān)閉時(shí),自動(dòng)切換到電池供電,以保證萬(wàn)年歷數(shù)據(jù)不丟失。雖然本設(shè)計(jì)使用控制器的萬(wàn)年歷,但硬件上留有設(shè)置口,為日常升級(jí)使用。R18為0歐電阻,可以適應(yīng)吸取一些微小信號(hào)。濾除低頻噪聲使用10uF的大電容C15,濾除高頻噪聲使用104的小電容C16,電容C15,C16構(gòu)成退耦濾波電路,減小電路的波動(dòng)從而提高電路穩(wěn)定性。BOOT0,和BOOT1引腳均通過(guò)下拉電阻至地,使主控制器工作在用戶閃存啟動(dòng)模式。復(fù)位電路由104的小電容C10和10k電阻R11構(gòu)成:上電后,電容充電,STM32的RESET復(fù)位引腳高電平;充電結(jié)束,復(fù)位端RESET低電平,充電過(guò)程在STM32復(fù)位端形成下降沿脈沖實(shí)現(xiàn)復(fù)位。當(dāng)按鍵S1按下后,電容端的電壓對(duì)釋放,RESET端重新出現(xiàn)高電平,松開(kāi)后,C10電容重新被充電,因此RESET再次出現(xiàn)一低電平脈沖,使得MCU復(fù)位 3.2 人機(jī)交互模塊顯示原理圖如下圖2-2所示。 人機(jī)交互模塊有按鍵和顯示分別作為輸入輸出。由于需要設(shè)定萬(wàn)年歷時(shí)間,溫濕度異常報(bào)警,主機(jī)手機(jī)號(hào)等參數(shù),系統(tǒng)設(shè)定三個(gè)按鍵完成人機(jī)輸出。R20,R21,R22為上拉電阻,當(dāng)按鍵彈開(kāi)為,輸入至MCU引腳為高電平,當(dāng)按鍵按下,由于S2另一端接地,輸入至MCU引腳變低電平。控制器通過(guò)采集輸入引腳PB8,PB9,PB10可以獲知按鍵輸入狀態(tài)。 OLED顯示器是本次設(shè)計(jì)輸出器的重要部分,采用四行顯示,顯示內(nèi)容包括實(shí)時(shí)光照強(qiáng)度、年月時(shí)間、實(shí)時(shí)溫濕度指數(shù)、短信接受號(hào)碼、繼電器開(kāi)關(guān)狀態(tài)。 OLED顯示器采用SPI數(shù)據(jù)通訊方式一共有7個(gè)引腳,1,2腳為供電引腳,3號(hào)腳為SDI腳接到MCU,PB15腳(亦為SPI2_MOSI腳),4號(hào)腳為SCL腳接至MCU的P14腳(亦為SPI2_MISO腳),5號(hào)腳為SCK接至MCU的P12腳(亦為SPI2_SCK腳),6號(hào)腳為RESET腳,由于復(fù)位電平方式與主控制器兼容,直接接至主控制器RESET端。7號(hào)腳為A0腳為數(shù)據(jù)/命令選擇口腳接至MCU的PB11腳。 3.3 GPRS電路設(shè)計(jì)作為整個(gè)設(shè)計(jì)的無(wú)線通信模塊,GSM模塊的完備對(duì)是否能實(shí)現(xiàn)遠(yuǎn)程控制功能有著至關(guān)重要的影響。本設(shè)計(jì)選用集成化的GSM模塊,型號(hào)是SIM900。采用標(biāo)準(zhǔn)的AT指令操作接受和發(fā)送短信指令,模塊解碼后發(fā)送至STM32主控制器執(zhí)行控制操作。本設(shè)計(jì)中最為核心的功能即是短信指令控制繼電器的開(kāi)關(guān),繼而達(dá)到遠(yuǎn)程操控家電的目的。(本設(shè)計(jì)硬件電路中用發(fā)光二級(jí)管的開(kāi)閉代替家電的開(kāi)關(guān))。  GSM使用短信指令實(shí)現(xiàn)控制,操作便捷,發(fā)送短信僅需要3條指令。GSM通信應(yīng)用廣泛,目前應(yīng)用短信控制開(kāi)關(guān)、氣象數(shù)據(jù)監(jiān)測(cè)、全球遠(yuǎn)距離無(wú)線通訊。本模塊支持900~1800頻段,包括中國(guó)移動(dòng)與中國(guó)聯(lián)通。SIM900模塊與STM32控制器采用串口直連的方式,方便美觀。SIM900模塊包含六個(gè)引腳:GND(電源負(fù)極)、RX(模塊接收端:對(duì)應(yīng)STM32的TX 端口)、TX(模塊發(fā)射端)、KEY(啟動(dòng)引腳:接地釋放啟動(dòng)和一直接地實(shí)現(xiàn)上電自啟)、VCC(模塊供電端:電壓范圍3.7~4.2V)。SIM900模塊連接圖見(jiàn)圖3-3。 3.4 溫濕度傳感器電路設(shè)計(jì)溫濕度采集是主要的輸入信號(hào)之一,通過(guò)設(shè)定閾值來(lái)觸發(fā)GSM模塊向設(shè)定手機(jī)發(fā)送報(bào)警短信。本設(shè)計(jì)默認(rèn)設(shè)定溫度閾值為40℃,默認(rèn)濕度閾值為60RH。此外,可根據(jù)具體情況,通過(guò)電路板上的設(shè)置按鍵設(shè)定所需溫濕度閾值。 查閱DHT11官方數(shù)據(jù)手冊(cè)可知此檢測(cè)模塊封裝形式采用4針單排直插;測(cè)量范圍是:濕度(20-90%)、溫度(0-50℃);濕度檢測(cè)精度可到到±5%RH,溫度檢測(cè)精度可達(dá)±2℃;分辨力位1。 傳感器包含4個(gè)引腳,分別是電源引腳、串行數(shù)據(jù)總線、懸空引腳、接地引腳,其電路圖如下圖3-4所示。溫濕度傳感器供電電壓范圍為3.3V~5.5V。由于是單總線數(shù)據(jù)傳輸方式,并且通過(guò)判斷高電平時(shí)間來(lái)區(qū)分高低電平,所以此檢測(cè)模塊的優(yōu)點(diǎn)是數(shù)據(jù)傳輸距離長(zhǎng),現(xiàn)場(chǎng)溫濕度監(jiān)控有良好的應(yīng)用效果。采用數(shù)字輸出接口經(jīng)上拉電阻R22后接入STM32的PB5引腳。上拉電阻的大小是由信號(hào)線的長(zhǎng)度來(lái)決定的,兩者呈反比關(guān)系,即信號(hào)線越長(zhǎng)時(shí),電阻越小;信號(hào)線越短,電阻越大。 3.5 光強(qiáng)檢測(cè)電路設(shè)計(jì)光強(qiáng)檢測(cè)電路是實(shí)現(xiàn)窗簾自動(dòng)開(kāi)閉重要的前端電路,本次設(shè)計(jì)采用光敏電阻式模塊化傳感器,原理圖見(jiàn)下圖3-5。 集成化模塊-輸出可以直接與主控制器或者A/D連接。光照強(qiáng)度較低時(shí)(低于預(yù)設(shè)值),傳感器的D0端輸出高電平;光照強(qiáng)度較高(高于預(yù)設(shè)值),傳感器的D1端輸出低電平。本設(shè)計(jì)將可采集到的光照強(qiáng)度劃分成20個(gè)光強(qiáng)等級(jí),采集范圍從0 Lux開(kāi)始,1000Lux為一個(gè)跨度,超過(guò)20000Lux只顯示等級(jí)20。本設(shè)計(jì)默認(rèn)設(shè)定光強(qiáng)閾  值為16個(gè)光強(qiáng)等級(jí)單位。 3.6 窗簾控制電路設(shè)計(jì)3.6.1 步進(jìn)電機(jī)的選用對(duì)步進(jìn)電機(jī)和直流電機(jī)簡(jiǎn)單比較有如下結(jié)論: ①當(dāng)步進(jìn)電機(jī)鎖定位置時(shí),電機(jī)不再耗電; ②步進(jìn)電機(jī)體積小、壽命長(zhǎng); ③步進(jìn)電機(jī)成本低廉、驅(qū)動(dòng)簡(jiǎn)單; ④步進(jìn)電機(jī)定位控制精確,直流電機(jī)定位控制誤差較大; ⑤驅(qū)動(dòng)方式不同:步進(jìn)電機(jī)驅(qū)動(dòng)方法的分類主要有恒電壓驅(qū)動(dòng)方式,直流電機(jī)驅(qū)動(dòng)方法是有刷驅(qū)動(dòng)和無(wú)刷驅(qū)動(dòng); ⑥控制方式不同:步進(jìn)電機(jī)開(kāi)環(huán)操作、直接控制,直流電機(jī)加反饋間接控制; 綜合分析直流電機(jī)和交流電機(jī)的優(yōu)缺點(diǎn)以及本設(shè)計(jì)的高精度要求,選用步進(jìn)電機(jī)。且確定型號(hào)為28BYJ-48。 3.6.2 步進(jìn)電機(jī)28BYJ-48介紹首先了解型號(hào)中各位數(shù)字字母包含的具體含義:28——步進(jìn)電機(jī)的有效最大外徑是 28 毫米;B——表示是步進(jìn)電機(jī);Y——表示是永磁式;J——表示是減速型;48——表示四相八拍。參數(shù)見(jiàn)表3-1。 表格3-1 步進(jìn)電機(jī)參數(shù) | | | | | | 起動(dòng)轉(zhuǎn)矩 100P.P.S g.cm | | | | | | | | | | | | | | | | | |
3.6.3 步進(jìn)電機(jī)驅(qū)動(dòng)本設(shè)計(jì)采用小型步進(jìn)電機(jī)進(jìn)行模擬。考慮到窗簾需要打開(kāi)和關(guān)閉。其執(zhí)行電機(jī)必須實(shí)現(xiàn)正反轉(zhuǎn)控制。因此采用步進(jìn)電機(jī)構(gòu)成的開(kāi)環(huán)控制系統(tǒng)實(shí)現(xiàn)。采用5V供電的四相步進(jìn)電機(jī)作為執(zhí)行機(jī)構(gòu)。采用ULN2004作為驅(qū)動(dòng)器件,組成窗簾控制電路。步進(jìn)電機(jī)驅(qū)動(dòng)方法如下表3-2,驅(qū)動(dòng)原理如下圖3-6。 表格3-2 步進(jìn)電機(jī)的驅(qū)動(dòng)方法
3.7 繼電器驅(qū)動(dòng)電路設(shè)計(jì)繼電器作為本設(shè)計(jì)的輸出控制模塊,接收STM主控制器傳輸來(lái)的高低電平信號(hào)來(lái)控制家電。設(shè)計(jì)用L1和L3的亮滅表示繼電器的開(kāi)閉。驅(qū)動(dòng)電路如圖3-7所示。 由于繼電器的功率較大,本設(shè)計(jì)中采用8050和8550組成達(dá)林頓管方式來(lái)驅(qū)動(dòng),它的最大集電極電流可以達(dá)到1A。繼電器線圈從通電到斷開(kāi)電感電流不能突變,所以需要一個(gè)電流泄放回路。二極管Q1,Q3采用二極管IN4007對(duì)繼電器的線圈進(jìn)行續(xù)流。R13,R17為限流電阻,使三極管工作在放大區(qū)。R9,L2,R14,L3構(gòu)成繼電器工作指示電路。 3.8 電源電路設(shè)計(jì)電源模塊的主要作用是為整個(gè)系統(tǒng)供電,保證系統(tǒng)工作穩(wěn)定。本系統(tǒng)需要兩種電壓:SIM900模塊工作的3.7V~4.2V、MCU的3.3V工作電壓。因此系統(tǒng)直接采用12V電壓輸入,由LM2596-ADJ芯片構(gòu)成的固定頻率開(kāi)關(guān)降壓穩(wěn)壓電路后,得到4.2V直流電壓,為SIM900模塊提供工作電壓. 電路中通過(guò)調(diào)節(jié)R2電阻,可調(diào)節(jié)輸出電壓。主機(jī)電源模塊電路如圖3-8所示。 線性低壓差三端穩(wěn)壓器LM1117的作用是將4.2V電壓轉(zhuǎn)換成3.3V電壓,繼而給STM32控制器、各部分傳感模塊、OLED顯示模塊等供電。大電容C5、C6的作用是濾除低頻電源紋波,小電容C7、C8的作用是濾除高頻噪聲,外加0歐電阻,使得電源抗干擾能力更強(qiáng)。BT1為電池,為另一種系統(tǒng)供電方式。電阻R8和二極管D2構(gòu)成電源指示電路。
第4章 系統(tǒng)軟件設(shè)計(jì)
4.1 軟件開(kāi)發(fā)環(huán)境介紹本設(shè)計(jì)中選用KEIL公司推出名為MDK的編譯器。其主要指向是arm核控制器開(kāi)發(fā)的集成開(kāi)發(fā)環(huán)境作為主機(jī)程序設(shè)計(jì)。Keil MDK軟件為基于Cortex-M、Cortex-R4、ARM7、ARM9處理器的設(shè)備創(chuàng)造了完整的開(kāi)發(fā)環(huán)境。 MDK的功能特點(diǎn): ●支持的器件庫(kù)豐富,包括Cortex-M、Cortex-R4、ARM7等系列; ●可使用C/C++語(yǔ)言編程,使用受眾廣泛易于上手; ●小封裝實(shí)時(shí)操作系統(tǒng); ●μVision4 IDE集成開(kāi)發(fā)環(huán)境,調(diào)試器和仿真環(huán)境; ●TCP/IP網(wǎng)絡(luò)套件提供多種的協(xié)議和各種應(yīng)用; ●提供帶標(biāo)準(zhǔn)驅(qū)動(dòng)類的USB 設(shè)備和USB 主機(jī)棧; ●完善的GUI庫(kù)支持; ●符合CMSIS (Cortex微控制器軟件接口標(biāo)準(zhǔn))。 4.2 軟件總體設(shè)計(jì)4.2.1 程序結(jié)構(gòu)分析軟件設(shè)計(jì)的主要任務(wù)有: 1)從SIM900 GPRS模塊讀取短信,并進(jìn)行判斷,從而對(duì)家用電器進(jìn)行開(kāi)關(guān)控制; 2)采集光照強(qiáng)度,實(shí)現(xiàn)家居光照率自動(dòng)控制; 3)采集溫濕度值,判斷發(fā)生異常時(shí),觸發(fā)短息報(bào)警通知主機(jī); 4)讀取主控器萬(wàn)年歷時(shí)鐘,對(duì)家用電器進(jìn)行時(shí)間段開(kāi)關(guān)管理; 5)按鍵掃描,將實(shí)時(shí)的數(shù)據(jù)信息和操作消息顯示在OLED屏上。 4.2.2 主程序設(shè)計(jì)為了使溫濕度以及光照采集新的信息能實(shí)時(shí)地進(jìn)行傳輸和處理,本設(shè)計(jì)的程序通過(guò)循環(huán)掃描對(duì)光敏電阻傳感模塊和DHT11傳感模塊進(jìn)行數(shù)據(jù)采集。主程序功能實(shí)現(xiàn)系統(tǒng)的初始化,之后再進(jìn)行功能模塊的運(yùn)行。因而主程序需要完成的設(shè)置任務(wù)是系統(tǒng)各部分初始化、進(jìn)行人機(jī)交互。主程序流程圖如圖4-1所示。  系統(tǒng)開(kāi)始運(yùn)行后,首先進(jìn)行系統(tǒng)的初始化,包括相關(guān)系統(tǒng)參數(shù)的初始化、OLED模塊的初始化、I/O串口的配置和初始化、RTC及ADC的初始化。完成初始化后,程序開(kāi)始循環(huán)掃描,首先讀取DHT11傳感器采集處理的溫濕度數(shù)據(jù),STM32控制器進(jìn)行數(shù)據(jù)分析后邏輯判斷溫濕度情況是否正常。若判斷出異常,控制器置異常標(biāo)志位,控制SIM900模塊周期性向設(shè)定手機(jī)發(fā)送提醒短信。程序不斷訪問(wèn)SIM900模塊,隨時(shí)準(zhǔn)備接受短信并解碼,解碼到有效指令則控制相關(guān)模塊輸出。若對(duì)指令不予處理,程序開(kāi)始進(jìn)行掃描響應(yīng)按鍵。程序中設(shè)置有五個(gè)按鍵輸入,其中兩個(gè)執(zhí)行中斷操作,實(shí)現(xiàn)中斷控制窗簾的開(kāi)閉,其余三個(gè)按鍵輸入用于參數(shù)、模式的設(shè)置,包括溫濕度閾值設(shè)置、光照強(qiáng)度閾值設(shè)置。接著程序獲取萬(wàn)年歷時(shí)間,若到達(dá)設(shè)定開(kāi)機(jī)時(shí)間或者關(guān)機(jī)時(shí)間,則控制繼電器輸出變化。最后程序指令STM32控制器根據(jù)采集的信息控制顯示器顯示實(shí)時(shí)溫濕度值、預(yù)設(shè)定手機(jī)號(hào)碼、繼電器狀態(tài)、萬(wàn)年歷時(shí)間及GSM模塊工作狀態(tài)。 4.2.3 OLED驅(qū)動(dòng)分析OLED采用SPI數(shù)據(jù)通訊協(xié)議。驅(qū)動(dòng)程序關(guān)鍵在于OLED讀寫(xiě)時(shí)序。本設(shè)計(jì)功能中,程序只需要實(shí)現(xiàn)實(shí)時(shí)寫(xiě)入數(shù)據(jù),用于OLED顯示,達(dá)到人機(jī)交互的目的。OLED的時(shí)序圖如圖4-2所示,對(duì)時(shí)序圖詳細(xì)分析后再模擬時(shí)序編程就能驅(qū)動(dòng)顯示器了。  4.2.4 SIM900通信程序設(shè)計(jì)SIM900模塊支持AT串口指令集,對(duì)SIM900進(jìn)行訪問(wèn)相當(dāng)于對(duì)STM32 I/O口的訪問(wèn)。所以通過(guò)AT指令,即可以實(shí)現(xiàn)控制SIM900的短信發(fā)送和讀取。下面介紹與短信發(fā)送和讀取的AT命令:AT+CMGF=?——選擇模式;AT+CMGS——發(fā)送一條SMS;AT+CMGR——讀取一條SMS;AT+CMGD ——?jiǎng)h除一條SMS; 在本設(shè)計(jì)中,SIM900串口通訊協(xié)議為9600波特率,8位數(shù)據(jù)位,無(wú)校驗(yàn),1位停止位。系統(tǒng)啟動(dòng)后先初始化SIM900 模塊,內(nèi)容包括設(shè)置短信模式、接收短信模式方式等。運(yùn)行過(guò)程中,程序不斷掃描串口,當(dāng)串口接收到由于接收到含有“+CMTI”字符的短信后,程序則會(huì)進(jìn)入讀取短信的過(guò)程。這是由于當(dāng)模塊接收到短信后,SIM900會(huì)經(jīng)過(guò)串口向主控制器傳送“+CMTI: "SM",1”的命令,通過(guò)接收指令即可判斷是否接收到短信。讀取短信時(shí),SIM900又會(huì)發(fā)送字符為“AT+CMGR=1”的指令,將信息讀出并根據(jù)信息內(nèi)容判斷對(duì)繼電器的開(kāi)閉操作,以此實(shí)現(xiàn)遠(yuǎn)程家電的控制功能。
第5章 系統(tǒng)調(diào)試與結(jié)果分析通過(guò)實(shí)際測(cè)試,本次設(shè)計(jì)出的基于stm32的智能家居系統(tǒng)能接收短息,并響應(yīng)有效的命令,對(duì)繼電器進(jìn)行控制,實(shí)現(xiàn)家用電器的開(kāi)關(guān)控制,并且能夠根據(jù)光照強(qiáng)度,實(shí)現(xiàn)窗簾的自動(dòng)開(kāi)關(guān),并切確地對(duì)時(shí)間響應(yīng),在設(shè)定時(shí)間段打開(kāi)繼電器。 5.1 程序仿真設(shè)計(jì)1、系統(tǒng)仿真采用仿真軟件Proteus7.0。仿真開(kāi)始測(cè)試圖(lcd屏顯示初始,溫濕度感測(cè)值,狀態(tài)值)如圖5-1所示。  2、調(diào)整濕度值,濕度過(guò)高,電機(jī)反轉(zhuǎn)關(guān)窗測(cè)試圖,見(jiàn)下圖5-2。 5.2 實(shí)物調(diào)試實(shí)物圖通電后,等待各個(gè)模塊啟動(dòng),在OLED顯示器上顯示當(dāng)前室內(nèi)環(huán)境的實(shí)時(shí)數(shù)據(jù)。 1、報(bào)警調(diào)試:用打火機(jī)提高檢測(cè)環(huán)境溫度,超過(guò)預(yù)設(shè)閾值(35℃),STM32控制GPRS模塊向設(shè)定手機(jī)(184****5651)發(fā)送報(bào)警短信,見(jiàn)下圖5-3。  2、窗簾控制調(diào)試:打開(kāi)閃光燈增強(qiáng)光照傳感器探測(cè)環(huán)境光強(qiáng),電機(jī)正轉(zhuǎn)表示窗簾關(guān)閉,OLED顯示器顯示窗簾關(guān)閉,見(jiàn)圖5-4。
3、家電開(kāi)光調(diào)試:用設(shè)定手機(jī)(184****5651)向GPRS通訊模塊的手機(jī)號(hào)(155****3582)發(fā)送指令短信“2 Open”,打開(kāi)繼電器2的發(fā)光二極管,見(jiàn)圖5-5所示。 結(jié)論本次設(shè)計(jì)完成了一個(gè)基于STM32控制芯片的簡(jiǎn)易智能家居系統(tǒng),其核心功能主要是實(shí)現(xiàn)實(shí)時(shí)的環(huán)境監(jiān)測(cè)并顯示,當(dāng)環(huán)境溫度或者濕度超過(guò)設(shè)定值時(shí)判定為異常情況并向設(shè)定手機(jī)發(fā)送報(bào)警信息,其次實(shí)現(xiàn)光控窗簾的自動(dòng)控制和按鍵控制功能,再次實(shí)現(xiàn)設(shè)定手機(jī)向GSM模塊發(fā)送控制指令打開(kāi)繼電器。由于設(shè)計(jì)中所用到的核心主控制器STM32芯片以及GSM模塊都是本科期間未學(xué)習(xí)的課程,所以是本次設(shè)計(jì)工作需要大量重零學(xué)習(xí)的過(guò)程,也遇到了很多的困難。 通過(guò)本次設(shè)計(jì), 本人不僅將以前學(xué)習(xí)的理論知識(shí)應(yīng)用于實(shí)際,還對(duì)自己的動(dòng)手能力有較大提升。除此之外,本人還深深意識(shí)到查閱其他相關(guān)論文文獻(xiàn)對(duì)于豐富自身知識(shí)和建立設(shè)計(jì)思路的重要性。所以,檢索文獻(xiàn)資料對(duì)于我們也是相當(dāng)重要的技能。而經(jīng)過(guò)這次畢業(yè)設(shè)計(jì),也學(xué)會(huì)了利用網(wǎng)絡(luò)和圖書(shū)館等資源來(lái)幫助自己完成作品。
致謝時(shí)間如白駒過(guò)隙,悄無(wú)聲息地從指縫中溜走。在四年大學(xué)生活的末尾,我完成了能夠證明四年青春的畢業(yè)設(shè)計(jì)和論文。至此,衷心地感謝一如既往支持我學(xué)習(xí)的家人、陪伴我成長(zhǎng)的同學(xué)們以及孜孜不倦地指導(dǎo)我學(xué)習(xí)的老師們。 其次,特別感謝高雪菲老師。從選定課題開(kāi)始到畢業(yè)論文定稿,高老師的嚴(yán)格要求和監(jiān)督都激勵(lì)我不斷學(xué)習(xí)和進(jìn)步。在做畢業(yè)設(shè)計(jì)過(guò)程中,遇到了很多的問(wèn)題,甚至曾好幾次因理解不了器件的使用方法我都萌生放棄的念頭,這時(shí)高雪菲老師不僅提供給我專業(yè)知識(shí)的幫助和設(shè)計(jì)方面的建議,還不斷鼓勵(lì)我克服困難,把遇到的困難最后轉(zhuǎn)化成工程設(shè)計(jì)的經(jīng)驗(yàn)。 接著,是學(xué)校和學(xué)院給提供了畢業(yè)設(shè)計(jì)這樣一個(gè)平臺(tái)來(lái)讓大家有機(jī)會(huì)綜合整理自己大學(xué)四年所學(xué)的知識(shí)并用于實(shí)踐中,所以在此也要向?qū)W校表達(dá)我的感謝。在同學(xué)們即將步入社會(huì)之際,這樣一個(gè)過(guò)程能夠提高我們的學(xué)習(xí)能力和適應(yīng)工程設(shè)計(jì)開(kāi)發(fā)的能力。 最后,還要感謝那些共同為畢業(yè)設(shè)計(jì)挑燈奮戰(zhàn)的同學(xué)們,你們不單單是在畢業(yè)設(shè)計(jì)中給我提供了很多寶貴意見(jiàn)和實(shí)質(zhì)幫助。更多的是在我沮喪的時(shí)候給予的鼓勵(lì)。沒(méi)有大家,我很難獨(dú)立完成這次設(shè)計(jì),在此真誠(chéng)的感謝你們。
單片機(jī)程序源碼如下:
- //頭文件調(diào)用
- #include "usually.h"
- #include "usart.h"
- #include "oled.h"
- #include "dht11.h"
- #include "rtc.h"
- #include "delay.h"
- #include "stm32f10x_adc.h"
- #include <string.h>
- #include "BSP_Config.h"
- #include "gpio.h"
- #include "gsm.h"
- //宏定義
- #define ADC_CH0 0 //通道0
- #define ADC_CH1 1 //通道1
- #define ADC_CH2 2 //通道2
- #define ADC_CH3 3 //通道3
- #define SEC 0
- #define MIN 1
- #define HOUR 2
- #define DATE 3
- #define MON 4
- #define YEAR 6
- #define MODE_NORMAL 0
- #define MODE_SET_HOUR 1
- #define MODE_SET_MIN 2
- #define MODE_SET_SEC 3
- #define MODE_SET_YEAR 4
- #define MODE_SET_MON 5
- #define MODE_SET_DATE 6
- #define MODE_SET_HUMI_HIGH 8
- #define MODE_SET_TEMP_HIGH 7
- #define MODE_SET_LIGHT 9
- #define KEY_MENU_IN PBin(0)
- #define KEY_ADD_IN PBin(1)
- #define KEY_SUB_IN PBin(2)
- //步進(jìn)控制 A-AB-B-BC-C-CD-D-DA
- #define Motor1_A_run { GPIO_SetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);GPIO_ResetBits(GPIOB,GPIO_Pin_10);GPIO_ResetBits(GPIOB,GPIO_Pin_11);}
- #define Motor1_AB_run { GPIO_SetBits(GPIOB,GPIO_Pin_8); GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_10);GPIO_ResetBits(GPIOB,GPIO_Pin_11);}
- #define Motor1_B_run { GPIO_ResetBits(GPIOB,GPIO_Pin_8);GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_10);GPIO_ResetBits(GPIOB,GPIO_Pin_11);}
- #define Motor1_BC_run { GPIO_ResetBits(GPIOB,GPIO_Pin_8);GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_SetBits(GPIOB,GPIO_Pin_10); GPIO_ResetBits(GPIOB,GPIO_Pin_11);}
- #define Motor1_C_run { GPIO_ResetBits(GPIOB,GPIO_Pin_8);GPIO_ResetBits(GPIOB,GPIO_Pin_9);GPIO_SetBits(GPIOB,GPIO_Pin_10); GPIO_ResetBits(GPIOB,GPIO_Pin_11);}
- #define Motor1_CD_run { GPIO_ResetBits(GPIOB,GPIO_Pin_8);GPIO_ResetBits(GPIOB,GPIO_Pin_9);GPIO_SetBits(GPIOB,GPIO_Pin_10); GPIO_SetBits(GPIOB,GPIO_Pin_11);}
- #define Motor1_D_run { GPIO_ResetBits(GPIOB,GPIO_Pin_8);GPIO_ResetBits(GPIOB,GPIO_Pin_9);GPIO_ResetBits(GPIOB,GPIO_Pin_10);GPIO_SetBits(GPIOB,GPIO_Pin_11);}
- #define Motor1_DA_run { GPIO_SetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);GPIO_ResetBits(GPIOB,GPIO_Pin_10);GPIO_SetBits(GPIOB,GPIO_Pin_11);}
- #define Motor1_STOP_run { GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9);GPIO_ResetBits(GPIOB,GPIO_Pin_10);GPIO_ResetBits(GPIOB,GPIO_Pin_11);}
- #define motorSpdDelayUs 1100
- //聲明變量
- extern struct Data_Time timer;
- unsigned char *pUart1_Rxd;//接收數(shù)據(jù)指針
- unsigned int uart1_RxNum=0;//串口1接收字?jǐn)?shù)
- unsigned char Num_TXD=0;//串口1發(fā)送緩沖區(qū)的字節(jié)數(shù)
- unsigned char Uart1_TxBuf[256]={0,2,3,};//串口1發(fā)送緩沖區(qū)
- unsigned char Uart1_RxBuf[256]; //串口1接收緩沖區(qū)
- unsigned char *pUart2_Rxd; //串口2接收數(shù)據(jù)指針
- unsigned int uart2_RxNum=0; //串口2接收字?jǐn)?shù)
- unsigned char uart2_TxNum=0; //串口2發(fā)送緩沖區(qū)的字節(jié)數(shù)
- unsigned char Uart2_TxBuf[256]={0,2,3,};//串口2發(fā)送緩沖區(qū)
- unsigned char Uart2_RxBuf[256]; //串口2接收緩沖區(qū)
- //變量聲明
- //extern struct tm timer;
- char line1str[17]="Welcome to use!";
- char line2str[17]="Wating gsm... ";
- char line3str[17]=" ";
- char line4str[17]=" ";
- uint8_t dht11_buf[5];
- uint8_t nowtemp,nowhumi;//當(dāng)前溫濕度值
- uint8_t thalmflg; //溫濕度過(guò)高報(bào)警
- uint16_t adtemp[12]={0}; //連續(xù)采集12點(diǎn)算平均值
- uint16_t light_adc,set_lit_high,lit_high;
- uint8_t almtmp_high,almhumi_high;
- uint8_t mode_status; //模式
- uint8_t flashflg; //模式
- uint8_t settimeflg; //時(shí)間被設(shè)置標(biāo)志位
- uint8_t solid1flg,solid2flg,winflg;
- unsigned char settime[8]={0x00,30,12,0x6,10,0x01,15};//??sec,min,hour,date,month,week,year
- char recephonenum[12]="13538510586";
- char phonenum_flash;
- uint8_t adci=0;
- char strLs[32];
- //按鍵輸入初始化
- void Key_init(void){
-
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口時(shí)鐘
- //Configure pin Pb1 as output
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA13,PA14,PA15按鍵輸入
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- }
- //繼電器輸出IO初始化
- void Solid_Init(){
-
- GPIO_InitTypeDef GPIO_InitStructure;
- //Configure pin Pb0 as output
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- //Configure pin Pb1 as output
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- /* GPIO_SetBits(GPIOB,GPIO_Pin_5);
- GPIO_SetBits(GPIOB,GPIO_Pin_6);
- GPIO_ResetBits(GPIOB,GPIO_Pin_5);
- GPIO_ResetBits(GPIOB,GPIO_Pin_6); */
- }
- //步進(jìn)輸出IO初始化
- void Motor_Init(){
-
- GPIO_InitTypeDef GPIO_InitStructure;
- //Configure pin Pb0 as output
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- //Configure pin Pb1 as output
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- //Configure pin Pb0 as output
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- //Configure pin Pb1 as output
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_Init(GPIOB,&GPIO_InitStructure);
-
-
- /* GPIO_SetBits(GPIOB,GPIO_Pin_5);
- GPIO_SetBits(GPIOB,GPIO_Pin_6);
- GPIO_ResetBits(GPIOB,GPIO_Pin_5);
- GPIO_ResetBits(GPIOB,GPIO_Pin_6); */
- }
- //初始化ADC
- //這里我們僅以規(guī)則通道為例
- //我們默認(rèn)將開(kāi)啟通道0~3
- void Adc_Init(void)
- {
- //先初始化IO口
- RCC->APB2ENR|=1<<2; //使能PORTA口時(shí)鐘
- GPIOA->CRL&=0XFFFF0000;//PA0 1 2 3 anolog輸入
- //通道10/11設(shè)置
- RCC->APB2ENR|=1<<9; //ADC1時(shí)鐘使能
- RCC->APB2RSTR|=1<<9; //ADC1復(fù)位
- RCC->APB2RSTR&=~(1<<9);//復(fù)位結(jié)束
- RCC->CFGR&=~(3<<14); //分頻因子清零
- //SYSCLK/DIV2=12M ADC時(shí)鐘設(shè)置為12M,ADC最大時(shí)鐘不能超過(guò)14M!
- //否則將導(dǎo)致ADC準(zhǔn)確度下降!
- RCC->CFGR|=2<<14;
- ADC1->CR1&=0XF0FFFF; //工作模式清零
- ADC1->CR1|=0<<16; //獨(dú)立工作模式
- ADC1->CR1&=~(1<<8); //非掃描模式
- ADC1->CR2&=~(1<<1); //單次轉(zhuǎn)換模式
- ADC1->CR2&=~(7<<17);
- ADC1->CR2|=7<<17; //軟件控制轉(zhuǎn)換
- ADC1->CR2|=1<<20; //使用用外部觸發(fā)(SWSTART)!!! 必須使用一個(gè)事件來(lái)觸發(fā)
- ADC1->CR2&=~(1<<11); //右對(duì)齊
- ADC1->SQR1&=~(0XF<<20);
- ADC1->SQR1&=0<<20; //1個(gè)轉(zhuǎn)換在規(guī)則序列中 也就是只轉(zhuǎn)換規(guī)則序列1
- //設(shè)置通道0~3的采樣時(shí)間
- ADC1->SMPR2&=0XFFFFF000;//通道0,1,2,3采樣時(shí)間清空
- ADC1->SMPR2|=7<<9; //通道3 239.5周期,提高采樣時(shí)間可以提高精確度
- ADC1->SMPR2|=7<<6; //通道2 239.5周期,提高采樣時(shí)間可以提高精確度
- ADC1->SMPR2|=7<<3; //通道1 239.5周期,提高采樣時(shí)間可以提高精確度
- ADC1->SMPR2|=7<<0; //通道0 239.5周期,提高采樣時(shí)間可以提高精確度
- ADC1->CR2|=1<<0; //開(kāi)啟AD轉(zhuǎn)換器
- ADC1->CR2|=1<<3; //使能復(fù)位校準(zhǔn)
- while(ADC1->CR2&1<<3); //等待校準(zhǔn)結(jié)束
- //該位由軟件設(shè)置并由硬件清除。在校準(zhǔn)寄存器被初始化后該位將被清除。
- ADC1->CR2|=1<<2; //開(kāi)啟AD校準(zhǔn)
- while(ADC1->CR2&1<<2); //等待校準(zhǔn)結(jié)束
- //該位由軟件設(shè)置以開(kāi)始校準(zhǔn),并在校準(zhǔn)結(jié)束時(shí)由硬件清除
- }
- //獲得ADC值
- //ch:通道值 0~3
- u16 Get_Adc(u8 ch)
- {
- //設(shè)置轉(zhuǎn)換序列
- ADC1->SQR3&=0XFFFFFFE0;//規(guī)則序列1 通道ch
- ADC1->SQR3|=ch;
- ADC1->CR2|=1<<22; //啟動(dòng)規(guī)則轉(zhuǎn)換通道
- while(!(ADC1->SR&1<<1));//等待轉(zhuǎn)換結(jié)束
- return ADC1->DR; //返回adc值
- }
- //
- uint16_t adc_avg(void)
- {
- uint8_t i;
- uint32_t sum=0;
- uint16_t ret=0;
- for(i=0;i<12;i++) sum+=adtemp[i];
- ret= sum/12;
-
- return ret;
- }
- //馬達(dá)正轉(zhuǎn)開(kāi)窗簾
- void motor_Foreward(void)
- {
- Motor1_A_run;
- delay_us(motorSpdDelayUs);
- Motor1_AB_run;
- delay_us(motorSpdDelayUs);
- Motor1_B_run;
- delay_us(motorSpdDelayUs);
- Motor1_BC_run;
- delay_us(motorSpdDelayUs);
- Motor1_C_run;
- delay_us(motorSpdDelayUs);
- Motor1_CD_run;
- delay_us(motorSpdDelayUs);
- Motor1_D_run;
- delay_us(motorSpdDelayUs);
- Motor1_DA_run;
- delay_us(motorSpdDelayUs);
- }
- //馬達(dá)反轉(zhuǎn)關(guān)窗簾
- void motor_Backward(void)
- {
- Motor1_DA_run;
- delay_us(motorSpdDelayUs);
- Motor1_D_run;
- delay_us(motorSpdDelayUs);
- Motor1_CD_run;
- delay_us(motorSpdDelayUs);
- Motor1_C_run;
- delay_us(motorSpdDelayUs);
- Motor1_BC_run;
- delay_us(motorSpdDelayUs);
- Motor1_B_run;
- delay_us(motorSpdDelayUs);
- Motor1_AB_run;
- delay_us(motorSpdDelayUs);
- Motor1_A_run;
- delay_us(motorSpdDelayUs);
- }
- //顯示設(shè)置頁(yè)面
- void Show_Normal(void){
- //顯示溫濕度
- strncpy(line1str,"tmp:99C/hm:99%RH",16);
- line1str[4]=0x30+nowtemp/10;
- line1str[5]=0x30+nowtemp%10;
- line1str[11]=0x30+nowhumi/10;
- line1str[12]=0x30+nowhumi%10;
- OLED_8x16Str(0,0,line1str);
- //顯示光照強(qiáng)度及窗簾狀態(tài)
- if(winflg){
- strncpy(line2str,"lit:99 /wn:open ",16);
- }else{
- strncpy(line2str,"lit:99 /wn:close",16);
- }
- line2str[4]=0x30+light_adc/41/10; //100%顯示
- line2str[5]=0x30+light_adc/41%10;
- OLED_8x16Str(0,2,line2str);
-
- //顯示繼電器輸出狀態(tài)
- strncpy(line3str, "s1:open s2:open ",16);
- if(solid1flg) {
- line3str[3]='o';line3str[4]='p';line3str[5]='e';line3str[6]='n';line3str[7]=' ';
- }else{
- line3str[3]='c';line3str[4]='l';line3str[5]='o';line3str[6]='s';line3str[7]='e';
- }
- if(solid2flg) {
- line3str[11]='o';line3str[12]='p';line3str[13]='e';line3str[14]='n';line3str[15]=' ';
- }else{
- line3str[11]='c';line3str[12]='l';line3str[13]='o';line3str[14]='s';line3str[15]='e';
- }
-
- OLED_8x16Str(0,4,line3str);
-
- //顯示時(shí)間
- //line4str[0]= 0x30+ timer.w_year%1000%100/10;
- line4str[0]= 0x30+ timer.w_year%1000%100%10;
- line4str[1]= '/';
- line4str[2]= 0x30+timer.w_month/10;
- line4str[3]= 0x30+ timer.w_month%10;
- line4str[4]= '/';
- line4str[5]= 0x30+timer.w_date/10;
- line4str[6]= 0x30+ timer.w_date%10;
- line4str[7]= ' ';
- line4str[8]= 0x30+ timer.hour/10;
- line4str[9]= 0x30+ timer.hour%10;
- line4str[10]= ':';
- line4str[11]= 0x30+timer.min/10;
- line4str[12]= 0x30+ timer.min%10;
- line4str[13]= ':';
- line4str[14]= 0x30+timer.sec/10;
- line4str[15]= 0x30+timer.sec%10;
- OLED_8x16Str(0,6,line4str);
- }
- /*
- 顯示設(shè)置頁(yè)面
- */
- void Show_SetPage(void){
- uint8_t i;
- //顯示溫濕度
- strncpy(line1str,"tH:99C/hH:99%RH ",16);
-
- if(MODE_SET_TEMP_HIGH== mode_status && flashflg){
- line1str[3]=' ';
- line1str[4]=' ';
- }else{
- line1str[3]=0x30+almtmp_high/10;
- line1str[4]=0x30+almtmp_high%10;
- }
- if(MODE_SET_HUMI_HIGH== mode_status && flashflg){
- line1str[10]=' ';
- line1str[11]=' ';
- }else{
- line1str[10]=0x30+almhumi_high/10;
- line1str[11]=0x30+almhumi_high%10;
- }
- OLED_8x16Str(0,0,line1str);
-
- //設(shè)置光強(qiáng)度
- strncpy(line2str,"litH:99 15/04/25",16);
-
- if(MODE_SET_LIGHT== mode_status && flashflg){
- line2str[5]=' '; //100%顯示
- line2str[6]=' ';
- }else{
- line2str[5]=0x30+set_lit_high/10; //100%顯示
- line2str[6]=0x30+set_lit_high%10;
- }
- if(MODE_SET_YEAR== mode_status && flashflg){
- line2str[8]=' '; //100%顯示
- line2str[9]=' ';
- }else{
- line2str[8]=0x30+settime[YEAR]/10; //100%顯示
- line2str[9]=0x30+settime[YEAR]%10;
- }
-
- if(MODE_SET_MON== mode_status && flashflg){
- line2str[11]=' '; //100%顯示
- line2str[12]=' ';
- }else{
- line2str[11]=0x30+settime[MON]/10; //100%顯示
- line2str[12]=0x30+settime[MON]%10;
- }
-
- if(MODE_SET_DATE== mode_status && flashflg){
- line2str[14]=' '; //100%顯示
- line2str[15]=' ';
- }else{
- line2str[14]=0x30+settime[DATE]/10; //100%顯示
- line2str[15]=0x30+settime[DATE]%10;
- }
- OLED_8x16Str(0,2,line2str);
-
- //設(shè)置時(shí)間
- strncpy(line3str," 10/59/00 ",16);
-
- if(MODE_SET_HOUR== mode_status && flashflg){
- line3str[1]=' '; //100%顯示
- line3str[2]=' ';
- }else{
- line3str[1]=0x30+settime[HOUR]/10; //100%顯示
- line3str[2]=0x30+settime[HOUR]%10;
- }
- if(MODE_SET_MIN== mode_status && flashflg){
- line3str[4]=' '; //100%顯示
- line3str[5]=' ';
- }else{
- line3str[4]=0x30+settime[MIN]/10; //100%顯示
- line3str[5]=0x30+settime[MIN]%10;
- }
-
- if(MODE_SET_SEC== mode_status && flashflg){
- line3str[7]=' '; //100%顯示
- line3str[8]=' ';
- }else{
- line3str[7]=0x30+settime[SEC]/10; //100%顯示
- line3str[8]=0x30+settime[SEC]%10;
- }
- OLED_8x16Str(0,4,line3str);
-
- //顯示手機(jī)
- strncpy(line4str,"NO:13538510586 ",16);
- for(i=3;i<14;i++){
- line4str[i]= recephonenum[i-3];
- }
- OLED_8x16Str(0,6,line4str);
- }
- /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
- int main(void)
- {
- uint8_t check,flashi,t,posi;
- uint16_t adcx,motori,tt;
- u32 i=0,xx;
- SystemInit(); //系統(tǒng)時(shí)鐘配置
- OLED_Init(); //初始化OLED
- NVIC_Configuration(); //初始化中斷向量
- Init_RTC(); //內(nèi)部RTC初始化
- Adc_Init(); //adc 初始化
- Usart1_Configuration(9600); //串口配置 設(shè)置波特率9600
- USART2_Config(9600);
- Key_init(); //按鍵初始化輸入
- OLED_8x16Str(0,0,line1str);
- OLED_8x16Str(0,2,line2str);
- OLED_8x16Str(0,4,line3str);
- OLED_8x16Str(0,6,line4str);
- Motor_Init(); //馬達(dá)控制IO初始化
-
- Uart1_ClrBuf();
- while(0==Sim_Send_AT()) delay_ms(1000); //??SIM ???? ,SIM900?????
- Sim_Set_MODE(1);
- delay_ms(800);
- Sim_ReSms_Config();
- delay_ms(800);
- Sim_Sms_Config_Cscs();
- Solid_Init(); //繼電器IO配置輸出
- Uart2_ClrBuf();
- Uart1_ClrBuf();
- set_lit_high=85;
- almtmp_high=40;
- almhumi_high=60;
-
- mode_status=0;
- //RTC_Set(2015,4,25,20,35,00);
- adci=0;
- while(1)
- {
- if(KEY_MENU_IN==0){
- delay_ms(5);
- if(KEY_MENU_IN==0){
- mode_status++; //
- if(mode_status>9) mode_status=0;
- if( settimeflg){
- settimeflg=0;
- Time_Update(settime[YEAR]+2000,settime[MON],settime[DATE],settime[HOUR],settime[MIN],settime[SEC]);
- }
- }
- while(KEY_MENU_IN==0) ; //等待放鍵
- }
- if(KEY_ADD_IN==0){ //加鍵
- delay_ms(5);
- if(KEY_ADD_IN==0){
- switch(mode_status ){ //
- case MODE_SET_HOUR:
- if(settime[HOUR]<24) settime[HOUR]++;
- else settime[HOUR]=0;
- settimeflg=1;
- break;
- case MODE_SET_MIN:
- if(settime[MIN]<60) settime[MIN]++;
- else settime[MIN]=0;
- settimeflg=1;
- break;
- case MODE_SET_SEC:
- if(settime[MIN]<60) settime[SEC]++;
- else settime[SEC]=0;
- settimeflg=1;
- break;
- case MODE_SET_YEAR:
- if(settime[YEAR]<99) settime[YEAR]++;
- else settime[YEAR]=0;
- settimeflg=1;
- break;
- case MODE_SET_MON:
- if(settime[MON]<12) settime[MON]++;
- else settime[MON]=0;
- settimeflg=1;
- break;
- case MODE_SET_DATE:
- if(settime[DATE]<31) settime[DATE]++;
- else settime[DATE]=0;
- settimeflg=1;
- break;
- case MODE_SET_TEMP_HIGH:
- if(almtmp_high<99) almtmp_high++;
- else almtmp_high=0;
- break;
- case MODE_SET_HUMI_HIGH :
- if(almhumi_high<99) almhumi_high++;
- else almhumi_high=0;
- break;
- case MODE_SET_LIGHT :
- if(set_lit_high<99) set_lit_high++;
- else set_lit_high=0;
- break;
- }
- }
- while(KEY_ADD_IN==0) ;
- }
- if(KEY_SUB_IN==0){
- delay_ms(5);
- if(KEY_SUB_IN==0){
- switch(mode_status ){ //
- case MODE_SET_HOUR:
- if(settime[HOUR]>0) settime[HOUR]--;
- else settime[HOUR]=0;
- settimeflg=1;
- break;
- case MODE_SET_MIN:
- if(settime[MIN]>0) settime[MIN]--;
- else settime[MIN]=0;
- settimeflg=1;
- break;
- case MODE_SET_SEC:
- if(settime[MIN]>0) settime[SEC]--;
- else settime[SEC]=0;
- settimeflg=1;
- break;
- case MODE_SET_YEAR:
- if(settime[YEAR]>0) settime[YEAR]--;
- else settime[YEAR]=0;
- settimeflg=1;
- break;
- case MODE_SET_MON:
- if(settime[MON]>0) settime[MON]--;
- else settime[MON]=0;
- settimeflg=1;
- break;
- case MODE_SET_DATE:
- if(settime[DATE]>0) settime[DATE]--;
- else settime[DATE]=0;
- settimeflg=1;
- break;
- case MODE_SET_TEMP_HIGH:
- if(almtmp_high>0) almtmp_high--;
- else almtmp_high=0;
- break;
- case MODE_SET_HUMI_HIGH :
- if(almhumi_high>0) almhumi_high--;
- else almhumi_high=0;
- break;
- case MODE_SET_LIGHT :
- if(set_lit_high>0) set_lit_high--;
- else set_lit_high=0;
- break;
- }
- }
- while(KEY_SUB_IN==0) ;
- }
- switch(mode_status){ ///不同狀態(tài)顯示不同頁(yè)面
-
- case MODE_NORMAL:
-
- dht11_readdata(dht11_buf);
- check= dht11_buf[0]+ dht11_buf[1]+ dht11_buf[2]+ dht11_buf[3];
- if(dht11_buf[4]==check){
- nowhumi = dht11_buf[0];
- nowtemp = dht11_buf[2];
- thalmflg =0;
- if(nowtemp> almtmp_high) thalmflg=1;
- if(nowhumi> almhumi_high) thalmflg=1;
-
- if (thalmflg){ //觸發(fā)短息發(fā)送
- tt++;
- if(tt>300){
- strncpy(strLs,"Alarm Temp:99 oC, Humi:99 %RH",29);
- strLs[11]=0x30+nowtemp/10;
- strLs[12]=0x30+nowtemp%10;
- strLs[23]=0x30+nowhumi/10;
- strLs[24]=0x30+nowhumi%10;
- OLED_8x16Str(0,2,"Sending msg.... ");
- delay_ms(1000);
- Sim_Send_Text(recephonenum,strLs);
- tt=0;
- }
-
- }
- }
-
- adtemp[adci]=Get_Adc(ADC_CH0);
- adci++;
- if( adci>11) {
- adci=0;
- light_adc = adc_avg();
- if(light_adc > set_lit_high*41) {//光照充足關(guān)閉窗簾
- if(winflg==1){
- motori=800;
- while(motori--) { motor_Backward();}
- Motor1_STOP_run;
- }
- winflg=0;}
- else {
- if(winflg==0){
- motori=800;
- while(motori--) { motor_Foreward();}
- Motor1_STOP_run;
- }
- winflg=1; //打開(kāi)窗簾
- }
- }
- if(t!=timer.sec)
- {
- t=timer.sec;
- //printf("%d年%d月%d日%d點(diǎn)%d分%d秒\r\n",timer.w_year,timer.w_month,timer.w_date,timer.hour,timer.min,timer.sec);
- }
- Show_Normal();
- memset(strLs,0,sizeof(strLs));
- strLs[0]=0x3a;
- strLs[1]=nowtemp/10+0x30;
- strLs[2]=nowtemp%10+0x30;
- strLs[3]=nowhumi/10+0x30;
- strLs[4]=nowtemp%10+0x30;
- strLs[5]=0x30+light_adc/41/10;
- strLs[6]=0x30+light_adc/41%10;
- strLs[7]=timer.w_year%1000%100/10+0x30;
- strLs[8]=timer.w_year%1000%100%10+0x30;
- strLs[9]=timer.w_month/10+0x30;
- strLs[10]=timer.w_month%10+0x30;
- strLs[11]=timer.w_date/10+0x30;
- strLs[12]=timer.w_date%10+0x30;
- if(solid1flg) strLs[14]=1+0x30;
- else strLs[14]=0+0x30;
- if(solid2flg) strLs[15]=1+0x30;
- else strLs[15]=0+0x30;
- if(winflg) strLs[16]=1+0x30;
- else strLs[16]=0+0x30;
-
- for(i=0;i<17;i++) USART2_Senddata(strLs[i]);
- break;
- case MODE_SET_HOUR:
- case MODE_SET_MIN:
- case MODE_SET_SEC:
- case MODE_SET_YEAR:
- case MODE_SET_MON:
- case MODE_SET_DATE:
- case MODE_SET_HUMI_HIGH:
- case MODE_SET_TEMP_HIGH:
- case MODE_SET_LIGHT:
- flashi++;
- if(flashi>2){
- flashflg=~flashflg;
- flashi=0;
- }
- Show_SetPage();
- break;
- default:
- break;
- }
-
-
- if(mystrstr(Uart1_RxBuf,"+CMTI:")!= NULL ){ //接收到手機(jī)短息
- delay_ms(300);
- OLED_8x16Str(0,2,"Receing msg.... ");
- Uart1_ClrBuf();
- delay_ms(1000);
- USART1_SendString("AT+CMGR=1\r\n"); //??????
-
- while(Uart1_RxBuf[0]==0); //等級(jí)待接收
- delay_ms(1000); //set 1lu:
- delay_ms(1000); //set 1lu:
- delay_ms(1000); //set 1lu:
- if( mystrstr(Uart1_RxBuf,"1 Close")!= NULL ){
- GPIO_ResetBits(GPIOB,GPIO_Pin_5); //關(guān)閉1路繼電器輸出
- solid1flg=0;
- }
- if( mystrstr(Uart1_RxBuf,"1 Open")!= NULL ){
- GPIO_SetBits(GPIOB,GPIO_Pin_5); //關(guān)閉1路繼電器輸出
- solid1flg=1;
- }
- if( mystrstr(Uart1_RxBuf,"2 Close")!= NULL ){
- GPIO_ResetBits(GPIOB,GPIO_Pin_6); //關(guān)閉2路繼電器輸出
- solid2flg=0;
- }
- if( mystrstr(Uart1_RxBuf,"2 Open")!= NULL ){
- GPIO_SetBits(GPIOB,GPIO_Pin_6); //打開(kāi)2路繼電器輸出
- solid2flg=1;
- }
- Sim_delt_Sms(); //刪除短信
- …………
- …………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png (44.24 KB, 下載次數(shù): 91)
下載附件
2018-10-25 15:44 上傳
所有資料51hei提供下載:
基于STM32的智能家居控制系統(tǒng).rar
(1.73 MB, 下載次數(shù): 726)
2018-10-25 15:49 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|