版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
基于PLC的智慧家庭蔬菜農(nóng)場設計摘要隨著物聯(lián)網(wǎng),智能家居的發(fā)展,智能化的足跡已經(jīng)遍及千家萬戶。而農(nóng)業(yè)作為一個國家的第一產(chǎn)業(yè),對一個國家的發(fā)展和壯大不管是在任何時期都是十分重要的。農(nóng)場作為未來農(nóng)業(yè)發(fā)展的一個主要平臺,對其的升級和改進自然不可忽略,既然我們的嵌入式系統(tǒng)能夠?qū)崿F(xiàn)如此強大的功能,如果能與我們的農(nóng)場進行合理有效的結合,那么必將促進我們在農(nóng)場上的科學有效的管理,為我們農(nóng)場品的增長或者是農(nóng)場的有效管理提供一套比較完備的解決方案。本文主要是側重于對軟件的設計和開發(fā),根據(jù)農(nóng)場的運作設計的不同算法,通過農(nóng)場的智能化改進,合理的配合農(nóng)場運作和規(guī)范化的管理智能農(nóng)場。不管是在農(nóng)產(chǎn)管理算法上,還是在對農(nóng)場設施的控制上,或者是在用戶交互上,我們都需要開發(fā)和設計相應的軟件架構,并制定完善的在智能化農(nóng)場管理的通信協(xié)議。通過對軟件架構的規(guī)范化設計,旨在對現(xiàn)代化的農(nóng)場管理提供一套簡單可行的解決方案。關鍵詞:嵌入式軟件;智能;農(nóng)場目錄第一章緒論 第一章緒論1.1課題研究的意義隨著物聯(lián)網(wǎng)和智能家居的發(fā)展,智能已經(jīng)發(fā)展到成千上萬的家庭。農(nóng)業(yè)作為國家的主要部門,一直對國家的發(fā)展和發(fā)展具有重要意義。農(nóng)場作為未來農(nóng)業(yè)發(fā)展的重要平臺,對其的升級和改進自然不可忽略,因此,對農(nóng)場的研究很重要。除了微控制器處理器的不斷發(fā)展之外,還生產(chǎn)了一些最強大的微控制器:我們將其稱為嵌入式操作系統(tǒng),這與整個MCU不同。SOC被認為是一個功能強大的處理單元,它結合了大量的芯片器件,能夠處理一些集成系統(tǒng)。由于處理器管道非常高效,因此它也稱為嵌入式操作系統(tǒng)。并且其功能深度可以改變,通常在使用工業(yè)產(chǎn)品時,我們將根據(jù)功能要求,價格取向和其他因素選擇硬件設備。集成系統(tǒng)主要包括基本COD和外圍控制。日常生活中的這些程序是電信系統(tǒng),消費電子產(chǎn)品,家庭應用,運輸系統(tǒng),醫(yī)療設備等。對于嵌入式操作系統(tǒng),常見使用的有Android,F(xiàn)irefoxOS,iPhoneOS,uC/OSII,uCLinux,VxWorks,WindowsCE,WindowsXPEmbedded,Linux,Arm-Linux。對于目前的應用市場,Linux因其免費開源,一直是市場占有率第一。也因此,本課題采用的是嵌入式Linux系統(tǒng)。在我們較大的嵌入式系統(tǒng)中,為了降低SOC處理器或一系列智能和手動控制的壓力,我們通??刂埔恍┡c微處理單元相關的輔助單元。MCU準備就緒,旨在降低主控制器的壓力,另一方面,它也有助于節(jié)省能源。這對我們的智能農(nóng)場來說可能并不重要,但可以看出這會影響機器進入系統(tǒng)就效果一般了。由于我們的嵌入式系統(tǒng)可以發(fā)揮如此強大的功能,如果我們將農(nóng)場有效地整合到我們的運營中,我們就可以管理我們的科學和運營效率,從而發(fā)展我們的農(nóng)場品或農(nóng)場管理提供了完整的解決方案。1.2課題研究的現(xiàn)狀1.2.1嵌入式技術的發(fā)展現(xiàn)狀這幾年嵌入式系統(tǒng)事業(yè)可以說是飛速發(fā)展,嵌入式軟件技術也得到了快速發(fā)展,而且當下嵌入式軟件的發(fā)展已經(jīng)讓硬件有些吃力,微處理器也從8位到16位,32位甚至64位;從支持單一品種的CPU芯片到支持很多歌品種的;從單一內(nèi)核到多功能內(nèi)核;qita功能模塊如文件系統(tǒng)、TCP/IP網(wǎng)絡系統(tǒng)、窗口圖形系統(tǒng)等;而且形成了以嵌入式系統(tǒng)為核心,硬件為其服務,應用軟件基于此來開發(fā)產(chǎn)品及解決方案。隨著現(xiàn)代現(xiàn)代化需求的逐漸增大,以及人們對開源的追求,未來將以嵌入式系統(tǒng)為火車頭的火車快速進發(fā)。嵌入式系統(tǒng)應用領域之廣泛,可以說是空前絕后,一方面是人們對于至于智能化需求的日益增長,也是目前我國經(jīng)濟發(fā)展進入一個新階段的重要標志。目前我國嵌入式系統(tǒng)設計主要在消費電子、汽車電子、醫(yī)療電子、信息家電、通信通訊、手持設備、工業(yè)控制、安防監(jiān)控等領域產(chǎn)品開發(fā)及解決方案。消費類電子產(chǎn)品開發(fā)時當前最熱門,從當前國內(nèi)的手機等行業(yè)便可知悉,當然也是從業(yè)工程師最多的行業(yè),占到62%,其次是在通信通訊領域(53%),最后在工業(yè)控制領域(46%)。嵌入式軟件開發(fā)平臺眾多,Linux遙遙領先2016年,在嵌入式產(chǎn)品和解決方案的開發(fā)平臺的選型上,嵌入式Linux以55%的市場份額遙遙領先于qita嵌入式開發(fā)軟件平臺,比去年增長13個百分比。由此可見,Linux憑借其開源和免費的精神,已經(jīng)長期穩(wěn)定使用和穩(wěn)健的更新,已經(jīng)越來越多的獲得跟多的開發(fā)團隊和個人的青睞和認可。而作為互聯(lián)網(wǎng)客戶端最大的終端設備,智能手機和平板電腦的市場已經(jīng)越來越不能小覷,Android憑借多級分層的結構,和底層采用Linux內(nèi)核從而便于驅(qū)動開發(fā),大大節(jié)約了開發(fā)難度和時間,而且和其使用的Java虛擬機的高度可移植性密不可分,幾乎可以兼容不同廠商,不同型號,不同硬件不同Android版本的智能手機。嵌入式開發(fā)語言多樣,C/C++語言仍占主導地位,因為C語言的高度不安全性,也可以說是其高度地接近匯編語言,因此對于嵌入式系統(tǒng)的驅(qū)動開發(fā)往往十分有效。而對于C++,因其高度兼容C的特性,同時對C的安全性加強,加之其面向?qū)ο蟮拇a可復用性,因此C/C++已然成為現(xiàn)如今軟件、解決方案開發(fā)的主流語言。1.2.2物聯(lián)網(wǎng)及智能農(nóng)場的發(fā)展現(xiàn)狀隨著寬帶和網(wǎng)絡通信的發(fā)展,物聯(lián)網(wǎng)如今更加光明。工業(yè)和信息化部,發(fā)展和改革委員會以及科技部表示,互聯(lián)網(wǎng)發(fā)展是中國高科技發(fā)展最重要的領域之一。發(fā)展智力農(nóng)場主要是監(jiān)測家庭環(huán)境,就環(huán)境變化進行快速有效的討論,并實現(xiàn)植物生長的各個階段的自動化以實現(xiàn)目標。最大的好處?,F(xiàn)代農(nóng)業(yè)相對于傳統(tǒng)農(nóng)業(yè)最重要的方面是智力控制,它不僅減少了人力資源,而且還生產(chǎn)了骯臟,健康和環(huán)保的農(nóng)產(chǎn)品。對于物聯(lián)網(wǎng),通??梢哉f所有物理設備連接到網(wǎng)絡以實時控制用戶?;ヂ?lián)網(wǎng)是當前發(fā)展的核心,它越來越孤立于人們的生活。更好的平臺可提供更高的網(wǎng)絡容量和更少的網(wǎng)絡延遲。實現(xiàn)完全符合環(huán)境信息環(huán)境時間控制的實時性能。用途。與此同時,物聯(lián)網(wǎng)可以將信息,充足的供應和應用資源結合起來,收集大數(shù)據(jù)有助于農(nóng)場的長期管理及其有效供應。1.3課題研究的主要內(nèi)容本課題主要研究研究如何合理的規(guī)劃和搭建嵌入式系統(tǒng),統(tǒng)一管理整個農(nóng)場的運作,監(jiān)控整個農(nóng)場的環(huán)境。又或者是對環(huán)境或者是說農(nóng)場中的事件,自動采取相應的措施去處理,那我要做的關鍵是控制電路和處理電路之間的選型和通信問題,以TCP/IP協(xié)議去實現(xiàn)我們相應需要的一些具體功能,完成Server和Client或者Controller的協(xié)調(diào)與一致,同時運用視頻監(jiān)控完成對農(nóng)場某一部分的監(jiān)控功能。同時對于嵌入式系統(tǒng)本身的管理和可控,硬件電路的協(xié)調(diào)工作作出相應的調(diào)節(jié)和完善。具體來說,我們通過TCP或者是UDP協(xié)議和Server來傳輸我們需要的一些控制控制信息給相應的硬件設備,同時在反方向上,Sensor來傳遞給我們當前環(huán)境的信息,以便我們?nèi)ゲ僮饔布鞒鱿鄳恼{(diào)整。本設計分為硬件和軟件兩大部分,硬件以主控SOC為SAMSUAMG公司的Exynos4412作為Server的硬件平臺,配有2GDDR3內(nèi)存和8GEMMC高速閃存,有UART和常用的IO引腳可以滿足我們的這個農(nóng)場服務器的性能要求。同時用采用ST公司的STM32作為硬件控制平臺,它是一個增強型Cortex-M3,32bit的MCU,時鐘頻率可達72MHz,擁有512KB的flash和64KB的SRAM,足以滿足我們對硬件控制,和環(huán)境信息采集還有與服務器通信的需求。
第二章系統(tǒng)總體方案設計2.1芯片的選型本系統(tǒng)最重要的兩個部分,一個是服務器Server,它既負責和底層控制部分的數(shù)據(jù)交互,同時又負責和用戶APP的交互,那么為了保證能夠?qū)崿F(xiàn)對用戶信息的管理,和對收集的數(shù)據(jù)的處理,也就是說我們的服務器能夠調(diào)用常見的數(shù)據(jù)庫的API函數(shù),那么我們的服務器必然不是一個裸機程序能夠做到的,它需要運行在一個操作系統(tǒng)之上,因此我們服務器的主控一定是SOC,也就是嵌入式操作系統(tǒng)。近幾年,可以說SOC的發(fā)展可以說是飛速的,從單核到多核,從低頻率到現(xiàn)在頻率能夠和電腦一般,我所選用的SOC一款SUMSUNG公司在2012年發(fā)布的一款主要應用于智能手機解決方案的SOC,它是基于ARMCortex-A9核32位的微控制器,四核以及最高1.6GHz的主頻,能夠高速的處理大量數(shù)據(jù);且板載2G的RAM和8G的ROM,使其能有較大的運行內(nèi)存和數(shù)據(jù)存儲空間;它自帶了常見的總線及外設接口,以及豐富的IO資源,比如USB,UART,I2C,以太網(wǎng)口等等。另外為了我們對于硬件的控制和底層信息的采集,我們對于控制的主控選用的是當下十分熱門的STM32,64KBSRAM和512KB的flash,時鐘頻率可達72MHZ一款功能強大的MCU其豐富的IO口和片內(nèi)外設完全能夠滿足我們的設計需求。2.2系統(tǒng)框架和工作流程分析該系統(tǒng)主要是一個基于嵌入式綜合應用的控制系統(tǒng),農(nóng)民通過移動電話從當前服務器場接收不同的信息,并了解農(nóng)場的工作條件。在此期間,服務器還可以通過控制傳感器發(fā)送的各種控制和各種數(shù)據(jù)來自動調(diào)節(jié)和控制電池。例如,有時我們必須監(jiān)控電池何時制造。電池和電池邊框。如果使用相關設備,則必須手動控制它們。因此,APP基本上完成了與服務器的協(xié)作,以便在通過服務器提供控制器的同時從服務器場檢索數(shù)據(jù)。那么服務器和底層的控制器相當于主人和仆人的關系,服務器可以無條件的獲取控制器采集的信息,服務器也可以無條件的控制控制器去實現(xiàn)不同的操作。充當各個模塊之間的“媒人”當然也是不同,在APP和服務器之間我們只需要通過TCP/IP或者是說UDP協(xié)議來實現(xiàn)通信。而我們的Sensor和控制器之間通過WiFi和藍牙進行數(shù)據(jù)傳輸。為了保證我們通信的可靠性問題,我們可以采用在TCP協(xié)議中為了保證數(shù)據(jù)可靠傳輸?shù)霓k法,即是對數(shù)據(jù)幀編號,超時傳輸,及時回應。系統(tǒng)的整體框架如圖2-1所示。 圖2-1系統(tǒng)整體架構圖2.3嵌入式Linux系統(tǒng)當移動及用戶終端設備日益成熟的今天,尤其是用戶終端設備紛雜多樣,為了便于我們快速開發(fā)和有效的管理。嵌入式Linux出現(xiàn)了,它實際上是對Linux系統(tǒng)的精簡,因為可能我們的用戶終端設備不需要那么全的整套Linux系統(tǒng)的所有功能。現(xiàn)如今,人們往往是根據(jù)自己產(chǎn)品的不同需求裁剪出適合自己精簡的Linux版本。對與Linux來說,我們在嵌入式開發(fā)中往往關注的是三個點,其一是Bootloader,它是被用作來對核心硬件和運行環(huán)境做一個初始化,其核心實際上就是一個裸機程序。其二就是Linux內(nèi)核,它也是Linux的核心,主要由5大子模塊構成,進程管理、文件管理、設備管理和網(wǎng)絡管理。其三就是根文件系統(tǒng),文件系統(tǒng)是Linux下不可或缺的重要組成。在Linux下一切皆文件,不論是普通文件,或是設備,又或者是通信的管道等等,在Linux下均被抽象為文件。這三者之間的結構圖如下3-1所示:引導加載程序:包括固化在iROM中的啟動代碼和Bootloader兩部分。內(nèi)核:經(jīng)過裁剪的LinuxKernel以及Bootloader傳給內(nèi)核的參數(shù)。文件系統(tǒng):rootfilesystem用戶應用程序:實現(xiàn)用戶特定功能的程序。圖3-1Linux啟動模塊圖對于本次設計,主要是完成服務程序的設計,因此需要的工作是交叉編譯工具鏈的安裝,能夠在我們的Ubuntu中完成對Arm平臺的程序的編譯。同時也需要利用這個交叉編譯工作鏈來制作我們需要的u-boot,kernel,以及根文件系統(tǒng)。以便在目標機上使用。2.4開發(fā)環(huán)境搭建環(huán)境搭建的主要是完成開發(fā)主機,目標機,開發(fā)介質(zhì)間的連接關系。環(huán)境搭建的主要工作,安裝交叉編譯工具鏈arm-none-gnulinux-eabi-,配置tftp,nfs,samba等服務。Tftp主要是用于文件傳輸,用于開發(fā)中開發(fā)板通過網(wǎng)絡從主機中下載,kenel,devicetree等文件。Nfs主要是用于網(wǎng)絡文件系統(tǒng)的掛載,便于我們在主機段將嵌入式應用程序或者是驅(qū)動程序添加,便于直接進行調(diào)試。其配置過程大致如下所示:1、檢查是否安裝tftpserver,如果未安裝,安裝tftp-server。2、開啟tftp后臺守護進程服務。4、創(chuàng)建tftpboot共享文件目錄,啟動tftp-server。5、登陸本機測試,或者是開發(fā)板與主機文件傳輸測試。2.5Linux網(wǎng)絡編程2.5.1Linux網(wǎng)絡的介紹Linux操作系統(tǒng)的網(wǎng)絡棧是其最大的特性。它源于最初BSD的網(wǎng)絡協(xié)議棧,其接口非常易于使用和層次分明,組織邏輯性強。其調(diào)用接口是對網(wǎng)絡協(xié)議層次的一個封裝,socket套接字本身與協(xié)議無關,但是我們可以利用其提供的接口完成網(wǎng)絡層和傳輸層的程序設計。本次設計以TCP/IP協(xié)議為服務器的主要通信協(xié)議,該通訊協(xié)議采用的4層的層級結構,分別為:應用層、傳輸層、網(wǎng)絡層和網(wǎng)絡接口層。2.5.2TCP/IP協(xié)議TCP/IP,為傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,它在實際上是4層協(xié)議的結合以一系列協(xié)議的集合。具體如表3-1所示。表3-1TCP/IP層級結構層級介紹應用層完成特定功能的協(xié)議層,如傳輸電子郵件協(xié)議(SMTP)、傳輸文件協(xié)議(FTP)、遠程網(wǎng)絡訪問協(xié)議(Telnet)等。傳輸層此層主要是選擇合適的網(wǎng)間路由和交換節(jié)點,確保數(shù)據(jù)的及時傳送。分為傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)報協(xié)議(UDP)等。它們主要是將數(shù)據(jù)鏈路層提供的幀組成數(shù)據(jù)包,包中的數(shù)據(jù)含有包頭。網(wǎng)絡層其功能主要是負責提供數(shù)據(jù)封包傳送,確保所有封好的包都能夠順利到達對端(但不檢查是否被接收正確),如網(wǎng)際協(xié)議(IP)。數(shù)據(jù)鏈路層對物理層的數(shù)據(jù)進行幀封裝,添加必要的控制信息。它要保證數(shù)據(jù)幀在信道上無差錯的傳輸。它主要功能包括物理地址尋址、數(shù)據(jù)封裝成幀、流量控制、數(shù)據(jù)的檢錯、重發(fā)等。物理層它主要是規(guī)定數(shù)據(jù)的物理特性,它傳輸?shù)淖钚挝皇莃it。2.5.3基于TCP/IP的C/S模型程序設計Linux提供了一個對網(wǎng)絡的使用和條用接口socket,它本身與協(xié)議無關。由socket調(diào)用生成的文件描述符,可以提供給眾多的API對其進行設置其屬性。一般在整個網(wǎng)絡絡通信過程中,socket套接字就是我們與網(wǎng)絡通信連接的橋梁,也是“一切皆文件”的體現(xiàn)。對該文件描述符,我們可以對其進行一系列的操作。來完成我們需要的網(wǎng)絡編程。具體步驟如下所示:TCP服務器Socket(),獲得一個filedescription。綁定主機IP,Port等信息到套接字文件上。用函數(shù)setsockopt()設置socket文件描述符的屬性;用函數(shù)listen()創(chuàng)建監(jiān)聽隊列;用函數(shù)accept()接受客戶端的請求;用函數(shù)send()和recv(),或者read()和write()來進行收發(fā)數(shù)據(jù);用close()關閉調(diào)用接口來關閉網(wǎng)絡連接;TCP客戶端Socket(),獲得一個filedescription。綁定主機IP,Port等信息到套接字文件上(客戶端可選)。Setsockopt()來設置socket套接字的屬性(可選);設置要連接的服務器的IP和Port;連接服務器,用函數(shù)connect();用函數(shù)send()和recv(),或者read()和write()收發(fā)數(shù)據(jù);Close()關閉網(wǎng)絡連接。第三章系統(tǒng)的硬件電路設計3.1服務端硬件電路設計服務器的硬件平臺主要由三星Exynos4412SOC,外圍我們所用到UART1和UART2,以太網(wǎng)口,存儲器,電源管理,運行狀態(tài)指示燈,USB口7大部分組成。系統(tǒng)的硬件框圖如圖3-1所示。圖3-1服務器硬件架構圖SOC是嵌入式系統(tǒng)的核心,因為本系統(tǒng)需要運行一個服務器的主程序同時需要兩個UART來和底層的控制電路部分進行通信,最重要的是要有足夠的內(nèi)存來實現(xiàn)我們多個進程的后臺運行,因此我們最終選擇了廣州友善之弊公司提供的tiny4412開發(fā)板,該開發(fā)板的主控SOC采用的是三星公司的Exynos4412。3.2控制電路硬件設計3.2.1控制電路總體設計控制電路需要完成的主要任務是對各種傳感器的驅(qū)動,控制不同外圍硬件,同時又能夠和我們的服務器進行通信,而且在考慮到功能強大的同時,我們必須對功耗做一定的限制,因此我們最終選擇的主控MCU是當下最流行的意法半導體公司的一款高性能多引腳的STM32F103,它有100多個引腳,完全能夠滿足我們的底層控制模塊,片內(nèi)外設我們需要用到的I2C,UART1和UART2,定時器豐富,同時16個外部中斷完全能夠滿足我們的設計需求。我們所需要的外設有溫濕度傳感器DHT22,三軸加速度和三軸陀螺儀傳感器MPU6050,光照強度傳感器GY302,紅外傳感器,以及我們系統(tǒng)需要的一個有源或者是無源蜂鳴器,兩個LDE燈,一個步進電機,一個頁面濕度傳感器,一個藍牙模塊系統(tǒng)的硬件框圖如圖3-2所示。圖3-2控制電路硬件框圖3.2.2GPIO模塊硬件電路設計GPIO是MCU和現(xiàn)代微控制處理器最核心的片內(nèi)IO口模塊,它主要完成系統(tǒng)的通用輸入輸出功能,我們的STM32F103ZET6一共有7組IO口,每組IO口有16個IO,一共是7*16=112個IO。豐富的IO口可完全滿足我們的程序設計。在LED,報警器,步進電機中我們使用了IO口的輸出功能完成了對外部模塊的操作。在紅外傳感模塊中,我們使用了IO口的輸入功能完成了對人體紅外的感應采集和處理。GPIO一共有4種輸入模式和4種輸出模式,其內(nèi)部的輸入輸出配置如圖3-3所示:圖3-3GPIO模塊圖對于控制我們的LED,我們采用的是用兩個上拉電阻接到我們的VCC,也就是說當我們的IO口給低電平的時候,LED燈會被驅(qū)動。LED0和LED1的電路如圖3-4所示。報警器我們采用的是一個有源蜂鳴器,采用一個NPN型三極管與其串聯(lián),當給高電平時,使其驅(qū)動,給低電平時,關閉。LED模塊和報警器的控制電路圖如圖3-4和3-5所示。 圖3-4LED硬件圖 圖3-5報警器硬件圖對于步進電機來說,其完成的功能是控制遮陽棚和頂棚,我的步進電機需要用四個通用IO口進行驅(qū)動,通過依次給每個引腳高電平來將其驅(qū)動。步進電機的原理圖如圖3-6所示。圖3-6步進電機硬件電路圖3.2.3I2C模塊硬件電路設計對于I2C模塊,在程序設計中我們主要是關注它的SDA,SCL這兩根線,對于I2C總線而言,它是一種同步串行總線,時鐘SCL由主設備控制,主要負責進行時序的控制,便于對I2C從設備的同步控制。而SDA則為數(shù)據(jù)總線。對數(shù)據(jù)進行收發(fā)。在本次設計中采用I2C通信的主要是GY-302光照強度傳感器,和MPU6050三軸加速度和三軸陀螺儀傳感器。通過讀寫這兩個模塊,來達到實時通信獲得環(huán)境數(shù)據(jù)的目的,其硬件電路設計如下圖3-7和圖3-8所示。圖3-7MPU6050模塊I2C連接圖圖3-8GY302模塊I2C連接圖對于MPU6050模塊來說,可以說是“短小精悍”,在如此小的模塊之上竟有100多個寄存器,除了在本次實驗中需要測量三軸加速度和三軸陀螺儀外,它還可以測量當前環(huán)境的溫度,只是出于精度的考慮,在本設計中我們并沒有去使用,而是采用精度更高的DHT22代替。在兩個模塊中ADDR是I2C從設備的地址,因I2C通信是多個I2C設備“并聯(lián)”在同一根I2C總線上。因此,為了確保主設備能夠正確找到I2C從設備,每個從設備都有一個地址,若需要接入2個相同模塊,又或者說不同模塊的I2C從設備地址相同,那么通過給ADDR不同的電平可以達到模塊不同的從設備地址的目的。另外XDA,和XCL則是MPU6050用于拓展介入其他的I2C設備的。在這兩個模塊中,STM32控制部分,均采用的復用了IO口的片內(nèi)I2C外設。3.2.4藍牙通訊模塊硬件電路設計藍牙通信在本設計中必不可少,因為STM32采集的數(shù)據(jù)均是比特流的形式,因此采用比特流進行通信也就顯得必不可少。而藍牙通信模塊作為比特流通信穩(wěn)定可靠且節(jié)能的模塊介質(zhì),也是我們設計所需要的。對于一個藍牙模塊來說,它分為主,從兩個模塊,主機是負責發(fā)射器,如同“廣播”一樣,從機作為一個接收器則主要是負責和主機進行配對。本次實驗所采用的主從藍牙一體機HC-05模塊,因藍牙協(xié)議的固件在藍牙芯片廠商出廠時就已經(jīng)設置完畢,本次設計不予深究。在使用時我們必須先用AT指令對藍牙模塊進行設定,主要包括如下:設定其中一個藍牙模塊為主機模式。設定藍牙的配對碼。設定任意連接模式。設定連個模塊的串口收發(fā)的波特率、停止位,校驗位,數(shù)據(jù)長度。設定完畢之后,藍牙模塊通電之后。其就相當于一根“串口線”,能夠通過無線的方式,收發(fā)Server和STM32硬件模塊之間的數(shù)據(jù)。其藍牙模塊連接圖如圖3-9所示。圖3-9藍牙模塊連接圖第四章系統(tǒng)軟件設計4.1STM32控制電路軟件設計Stm32硬件控制電路主要是完成和底層各個硬件模塊的交互。主要負責和服務器進行交互,根據(jù)服務器不同的操作指令控制不同的外設,亦或是收集各個傳感器的數(shù)據(jù)。同時能夠給服務器進行反饋,以保障通信過程的可靠進行。具體控制的硬件模塊和外設有:UART串口藍牙模塊,DHT22溫濕度傳感器模塊,步進電機,光照傳感器模塊,三軸加速度和三軸陀螺儀MPU6050模塊,紅外感應模塊,土壤濕度傳感器模塊。為了實現(xiàn)以上各個功能,我們需要完成UART串口驅(qū)動,I2C總線驅(qū)動,DHT22單總線的驅(qū)動,定時器timer驅(qū)動步進電機,GPIO電平監(jiān)測驅(qū)動紅外感應。4.1.1USART串口驅(qū)動USART,簡稱為通用串行異步輸入輸出總線,標準的串行RS232接口中有9針引腳,而往往在實際的數(shù)據(jù)傳輸中僅僅只需要兩根線用于數(shù)據(jù)傳輸即可,即是RXD和TXD。因為其為異步通信,通信雙方必須約定好一些通信協(xié)議,使得能夠準確的進行收發(fā)數(shù)據(jù),例如比特率,以及每幀有效數(shù)據(jù)的長度,校驗位的類型,停止位的個數(shù)。雖然是異步通信,但是其全雙工收發(fā)和無時序要求的特性,使得其在嵌入式應用和微控制領域的應用十分廣泛。在嵌入式領域,它主要應用于主機和外圍設備的通信,或者是高速率設備與低速設備間的通信。在本次設計中,我們的藍牙模塊就是使用UART總線與STM32和Exynos4412開發(fā)板進行通信,在STM32端我們只需要讀寫UART的收發(fā)緩沖區(qū)就能夠?qū)崿F(xiàn)數(shù)據(jù)的讀寫,在實際應用中,往往使用三根線(GND),來為雙方提供統(tǒng)一的電平參考。其連線如下:圖4-1UART連線原理圖每個USART都有1個USART控制器,負責USART的各項設定,同時又能夠讀寫緩沖區(qū)控制數(shù)據(jù)幀的輸入和接收。其波特率,有效數(shù)據(jù)長度,奇偶校驗位,停止位就顯得特別重要,本次設計我們采用的是115200bps的波特率,8bit的有效數(shù)據(jù)長度,無校驗位,1bit的停止位來實現(xiàn)藍牙模塊通信的相關功能。如下圖4-2所示位USART的一幀數(shù)據(jù)格式。圖4-2USART一幀數(shù)據(jù)格式在STM32中我們使用USART2來驅(qū)動我們的藍牙和服務器進行通信。因為USART2復用使用的IO的PA2和PA3引腳,所以要將其復用。4.1.2I2C總線驅(qū)動I2C是微控制器和嵌入式設備中一種很常見的同步通信總線,它由兩根線來完成通信,一個時鐘總線由I2C主設備控制來控制時鐘保持設備之間的同步,而另一根是數(shù)據(jù)總線,主從設備均可控制。對于從設備來說,其實它一直處于一個被動的狀態(tài),不會主動地往I2C總線上發(fā)送數(shù)據(jù)。因此I2C設備的連接方式就是將各個I2C設備“并聯(lián)”起來。其連接模型如圖4-3所示。圖4-3I2C總線連接圖I2C的收發(fā)數(shù)據(jù),I2C設備之間必須遵循由主設備控制的I2C時序,一般一次的I2C通信都是由主設備發(fā)起。I2C數(shù)據(jù)線SDA上根據(jù)時序的變化,一般會有開始信號,I2C從設備地址,讀/寫標志位,I2C有效數(shù)據(jù),應答信號和停止信號,具體見如下的I2C時序圖。圖4-4I2C傳輸時序圖至于數(shù)據(jù)的流向,當主設備寫操作的時候,主設備會主動地發(fā)送7bit從設備地址和1bit為‘0’的寫操作位,然后等待從設備回應,再發(fā)送要操作的從設備寄存器地址。等待回應,最后發(fā)送要寫的寄存器的值,最后發(fā)送停止位完成本次寫操作。而對操作,其相當于一次“寫”通信與一次“讀”通信的結合,其在完成寫操作后將主設備會重新進行I2C通信,發(fā)送7bit從設別地址和1bit的‘1’的度操作,然后等待從設備回應,發(fā)送要讀的從設備的寄存器,等待從設備回應,并且從設備會回應相應寄存器的值,主設備再來確認,如果還有數(shù)據(jù),從設備會繼續(xù)讀,直到從設備無響應,完成這一次I2C通信。STM32控制板中我們主要用I2C總線和MPU6050,光照傳感器通信來獲得需要的三軸加速度,三軸陀螺儀,溫度,濕度的值。對于MPU6050,用PA6,PA7來分別復用I2C通信中的SCL和SDA,而對于光照傳感器BH1750,用PB10和PB11來復用SCL和SDA。對與MPU6050,在與其進行的一次簡單通信中,我們需要獲得的數(shù)據(jù)包括6個字節(jié)的三軸加速度(每個方向上是用1個16bit數(shù)來表示),6bytes的三軸陀螺儀(每個方向上也是用1個16bit的數(shù)表示),還有并沒有使用的溫度也是占2個字節(jié)。所以應該根據(jù)需要來獲得我們的數(shù)據(jù)。例如,對于三軸加速度來說,可能每個軸都是用兩個8bit的寄存器來存儲我們的數(shù)據(jù)。那所需要的就是用I2C通信來讀取MPU6050內(nèi)部相應的寄存器來獲取相應的值。下列是利用I2C通信來完成初始化的工作。mpu6050_write_byte(MPU_PWR_MGMT1_REG,0X80);//復位MPU6050//設置陀螺儀和加速度的量程 mpu6050_set_gyro_fsr(0); //三軸陀螺儀量程0:±250dps mpu6050_set_accel_fsr(0); //三軸加速度量程0:±2g mpu6050_set_rate(50); mpu6050_write_byte(MPU_INT_EN_REG,0X00); //關閉所有的中斷 mpu6050_write_byte(MPU_USER_CTRL_REG,0X00); //I2C主模式關閉 mpu6050_write_byte(MPU_FIFO_EN_REG,0X00); //關閉FIFO mpu6050_write_byte(MPU_INTBP_CFG_REG,0X80); //INT引腳低電平有效 res=mpu6050_read_byte(MPU_DEVICE_ID_REG); if(res==MPU6050_ADDR){ mpu6050_write_byte(MPU_PWR_MGMT1_REG,0X01); mpu6050_write_byte(MPU_PWR_MGMT2_REG,0X00);//加速度和陀螺儀的三軸均工作 mpu6050_set_rate(50); //設置采樣率為50KHz通過I2C通信來度寄存器獲得我們?nèi)S加速度和三軸陀螺儀。以獲得三軸陀螺儀的數(shù)據(jù)位例,MPU6050讀1個字節(jié)就是I2C通信的過程,如下程序所示。uint8_tbuf[2];//獲取X軸的陀螺儀值 buf[0]=mpu6050_read_byte(MPU_GYRO_XOUTH_REG); buf[1]=mpu6050_read_byte(MPU_GYRO_XOUTL_REG); *gx=((uint16_t)buf[0]<<8)+buf[1];//獲取Y軸的陀螺儀值 buf[0]=mpu6050_read_byte(MPU_GYRO_YOUTH_REG); buf[1]=mpu6050_read_byte(MPU_GYRO_YOUTL_REG); *gy=((uint16_t)buf[0]<<8)+buf[1]; //獲取Z軸的陀螺儀值buf[0]=mpu6050_read_byte(MPU_GYRO_ZOUTH_REG); buf[1]=mpu6050_read_byte(MPU_GYRO_ZOUTL_REG); *gz=((uint16_t)buf[0]<<8)+buf[1]; 4.1.3溫濕度傳感器DHT22驅(qū)動DHT22是一款高精度的溫濕度采集傳感器模塊,它為單總線結構設計,MCU和其通信便是通過這一根單總線,主要是由MCU控制其工作,DHT22被動發(fā)送溫濕度數(shù)據(jù),因其通信時間極短,數(shù)據(jù)采集穩(wěn)定可靠,完全能夠達到本次設計中對實時性和穩(wěn)定性的需求。不僅如此,也因能夠?qū)崿F(xiàn)遠距離傳輸,因此滿足我們智能農(nóng)場的需求,其連接圖如圖4-5所示。圖4-5DTH22與MCU連接圖DHT22通過1根單總線和MCU進行通信,因此時序的控制顯得尤為重要。亦是說按照雙方規(guī)定好的發(fā)送數(shù)據(jù)的順序和規(guī)范進行收發(fā)。在DHT22中MCU和Sensor對總線的控制時間都在一個特定的時間段內(nèi)。DHT22與MCU一次的通訊時間大概是在5ms左右,具體的數(shù)據(jù)格式將在下圖圖4-6中顯示。圖4-6DHT22一幀數(shù)據(jù)格式圖當MCU發(fā)送一次信號以后,DHT22從睡眠模式進入工作模式,當主機發(fā)送start信號后,DHT22發(fā)送回應信號,然后把40bit的溫濕度和校驗數(shù)據(jù)發(fā)送出去,完成這一次信號采集。其時序工作如下圖4-7所示。圖4-7DHT22傳輸時序圖所以對于DHT22的配置就顯而易見了,首先發(fā)送1個開始或是復位信號,然后不斷的去讀取40bit的數(shù)據(jù)。uint8_tbuf[5]; uint8_ti; dht22_reset(); //DHT22復位(發(fā)送一個開始信號) if(dht22_check()==0){ //依次去讀取40bit的數(shù)據(jù) for(i=0;i<5;i++){ buf[i]=dht22_read_byte(); } }else{ return1; }//校驗40bit數(shù)據(jù)的正確性 if(buf[0]+buf[1]+buf[2]+buf[3]==buf[4]){ *humi10=((uint16_t)buf[0]<<8)+buf[1]; *temp10=((uint16_t)buf[2]<<8)+buf[3]; }4.1.4步進電機驅(qū)動程序設計在智能化農(nóng)場的現(xiàn)代應用中,經(jīng)常要考慮到要實現(xiàn)遮陽棚的打開關閉,又或者是土壤的松土等等,此時以步進電機來模擬遮陽棚和松土機。對于步進電機模塊,主要分為兩個部分:其一是步進電機的驅(qū)動板,另一個就是步進電機的實體。驅(qū)動板的目的是將MCU所發(fā)出的指令(正轉、反轉、轉速),轉換為步進電機工作時的模擬控制量,當然,它不是簡單的數(shù)模轉換。由上一章中步進電機的電路圖可知,步進電機與MCU連接時使用了4個IO口。那么通過依次給這4個IO口高電平就能達到轉的目的,給的方向決定了轉的方向。而給高電平的時間同時又決定了轉的速度,在本設計中出于只是模擬遮陽棚和松土的考慮,在轉速和轉向未做過多研究。本設計用1個2ms中斷一次的定時器來控制其轉速,轉的方向采用的正向旋轉,也就是依次從INT1~INT4給高電平,來達到設備驅(qū)動的目的。其STM32主要驅(qū)動程序如下所示。uint16_tphasecw[4]={GPIO_Pin_5,GPIO_Pin_4,GPIO_Pin_3,GPIO_Pin_2};//正轉D-C-B-Auint16_tphaseccw[4]={GPIO_Pin_2,GPIO_Pin_3,GPIO_Pin_4,GPIO_Pin_5};//反轉A-B-C-Duint16_tori_data; //用于保存原始PF口的數(shù)據(jù)voidmotor_cw(void){ staticuint8_ti=0; GPIO_Write(GPIOF,ori_data|phasecw[i]); ++i; if(i==4)i=0;}voidmotor_ccw(void){ staticuint8_ti=0; GPIO_Write(GPIOF,ori_data|phaseccw[i]); ++i; if(i==4)i=0;}voidmotor_stop(void){GPIO_ResetBits(GPIOF,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);}4.1.5紅外傳感模塊程序設計紅外模塊利用紅外感應系統(tǒng),當感應到人體紅外時,其輸出引腳會自動地由空閑時的低電平轉換為高電平,并維持一定的時間后再由其低電平又重新回到高電平,完成一次紅外感應過程。因此本次設計MCU只需要監(jiān)測由高電平到低電平的變化,在監(jiān)測高電平回到低電平的變化即可。因此采用一個外部中斷IO來接收電平的變化。STM32支持19個外部中斷、外部事件,因此需要將我們的IO口“掛載”特定的那根中斷線上。本次設計上,將其掛載在外部中斷線1上,并設置其雙邊沿觸發(fā)。其中斷處理程序如下所示: voidEXTI1_IRQHandler(void){delay_ms(10);if(SR501_INPUT==1){rs501_enter(); } elseif(SR501_INPUT==0){ rs501_exit(); }EXTI_ClearITPendingBit(EXTI_Line1);//清除終端標志位}voidrs501_enter(void){ BEEP_ON;}voidrs501_exit(void){ BEEP_OFF;}4.2Tiny4412服務端軟件設計4.2.1服務程序介紹當下,服務器的時代是越來越重要。隨著終端用戶設備的興起,服務器不可避免的要去扮演一個去服務當下眾多用戶的需求。而運行一個服務程序,需要將其部署在一個穩(wěn)定的能夠長期運行,而且維護性高,維護時間短,或者是維護不中斷服務的系統(tǒng)之上。服務器的操作系統(tǒng)主要分為四大種類,Windows,Netware,Unix,Linux,對于現(xiàn)代的大多數(shù)服務程序來說,人們普遍選擇的是Linux服務器。對于Linux操作系統(tǒng)來說,Linux是世界上的眾多前輩在POSIX和Unix基礎上開發(fā)而來的,它支持多用戶,多任務,多線程,滿足我們的開發(fā)需求,又因其開放源代碼政策,使得基于該平臺開發(fā)與使用無需支付任何的單位和個人的版權費用。因此它已成為當今服務類操作系統(tǒng)的主流。本課題的智能農(nóng)場中服務程序則是基于Ubuntu16.04開發(fā)而來。Ubuntu是一個基于DebianGNU/Linux,以桌面應用為主的開源Linux操作系統(tǒng),其成熟和穩(wěn)定已經(jīng)得到越來越多的廠商和個人的認可。服務程序一般后臺運行,實時監(jiān)控客戶端的請求并做相應的處理。它永遠處于一種被動的狀態(tài),也即是說它一直處于“被連接”,而不是“去連接”。對于我們的服務器程序,我們主要是要關注它的穩(wěn)定性,實時性和有效性。還有其能夠使用的系統(tǒng)資源。服務的主要有兩個功能:與APP進行通信,處理用戶的各種請求??刂苨tm32獲取相應的信息和控制必要的功能。而且對于服務其來說,簡單的過程話程序是完全不能滿足我們的設計需求,因此,我們需要多進程,以及進程間的通信。4.2.2服務程序的設計需求一方面,我們需要去接收客戶端的請求,完成客戶端的相應功能。對于服務客戶端來講,我們主要完成的功能有:客戶端客戶的注冊功能??蛻舳丝蛻舻牡卿浌δ???蛻舳说耐浢艽a功能??蛻舳丝蛻舻墓δ苷埱螅刂圃O備或者是獲得信息)。多客戶端的處理。另一方面,服務器必須和設備控制器STM32硬件部分進行通信,通過藍牙獲得需要的各種數(shù)據(jù),將其存起來,以便用戶請求的時候能夠快速響應。同時又必須根據(jù)用戶的需求向STM32控制電路發(fā)送不同的請求,完成響應的操作。在服務器和客戶端或者是服務器和控制電路的交互上,為了保證服務器正常地進行收發(fā)和控制,我們需要對通信協(xié)議作進一步的規(guī)范設計。參考TCP/IP協(xié)議簇中的相關協(xié)議,我們的通信協(xié)議也包含,報文類型、功能號、傳輸方向、控制指令,數(shù)據(jù)長度等。在與APP的通信上,因為是通過網(wǎng)絡進行傳輸,速度依然不需要用很低速的數(shù)據(jù)幀進行傳輸了,我們可以采樣更大量數(shù)據(jù)的報文段進行傳輸。因此在與APP的通信中,采用了Json鍵值對的形式。Json鍵值對分為鍵型和鍵值,中間采用冒號進行分隔。例如如下:第一組:“userName”:“Master”,第二組:“phoneNumber”:,第三組:“password”:“jiugeliu”.對于以上的三組鍵值對,其中userName,phoneNumber,passWord均為鍵型,而緊跟其后冒號后面的則為鍵值,userName的鍵值為Master,phoneNumber的鍵值password的鍵值則為jiugeliu。而將多個鍵值對疊加在一起并最后用兩個大括號將其闊起來就形成了Json數(shù)據(jù)包例如{“userName”:“Master”,“phoneNumber”:,“password”:“jiugeliu”}即為一個Json數(shù)據(jù)包。而且各個鍵值對之間均是無序的,因此不管是對于生成和解析就方便了許多。生成時可以隨時擴充,而在解析時,只需要根據(jù)鍵名就可以得到鍵值了。在本次設計中我們使用的鍵名及其宏如下表所示:表4-1鍵值宏-鍵名表KEY_USERNAME"userName"用戶名KEY_PASSWORD"password"密碼KEY_PHONENUM"phoneNumber"手機號KEY_STATECOD"stateCode"狀態(tài)碼KEY_USERTOKE"userToken"用戶唯一識別碼KEY_TEMPRATU"temperature"溫度KEY_HUMIDITY"humidity"濕度KEY_LIGHTINT"light"光照強度KEY_ACCE_X"AcceX"X軸加速度KEY_ACCE_Y"AcceY"Y軸加速度KEY_ACCE_Z"AcceZ"Z軸加速度KEY_GYRO_X"GyroX"X軸陀螺儀KEY_GYRO_Y"GyroY"Y軸陀螺儀KEY_GYRO_Z"GyroZ"Z軸陀螺儀KEY_DEVNUMBE"deviceNumber"設備號KEY_DEVICODE"deviceCode"設備操作碼KEY_DEVSTATE"deviceState"設備狀態(tài)碼在服務用戶客戶端的時候,當用戶注冊時,我們需要保存用戶的的登錄信息,同時,在用戶進行登錄時,我們呀要根據(jù)用戶提供的用戶名和密碼來與保存的的用戶信息進行比對,來判斷用戶驗證信息是否正確。返回給用戶登錄碼。因此我們不得不去使用數(shù)據(jù)庫來存儲用戶信息表和登錄狀態(tài)表。數(shù)據(jù)庫的種類十分之多,常見的有SQL,MySQL,Oracle。而在嵌入式產(chǎn)品中經(jīng)常是一個極小型的數(shù)據(jù)庫SQLite3,他的特點是免費開源,小巧精致。特別適合在嵌入式產(chǎn)品中使用。它實際上是一個軟件庫,無需服務器,無需手動配置。在本次設計中采用的便是SQLite3來完成記錄用戶登錄信息的作用。4.2.4服務器軟件架構設計服務端是本設計整個系統(tǒng)的核心,它不僅關系到系統(tǒng)的穩(wěn)定性,而且好的有框架的模塊化的服務端也能夠進行移植和改進,用于以后其它服務程序和類似應用程序的復用。服務端在服務于用戶端的同時,也要保證自己的可靠性。舉一個簡單的例子,它不能因為一條錯誤的指令或者是一幀錯誤的數(shù)據(jù)而是服務器出現(xiàn)任何的破壞甚至是崩潰。所以對于服務器的架構設計就在嵌入式產(chǎn)品和解決方案中顯得尤為重要。在整個服務器的架構中,從整體上看。它需要服務于用戶,此外它也必須作用于STM32控制電路。在整個框架上,可分為兩個進程。父進程:與用戶交互,處理用戶的登錄、注冊、找回密碼、控制硬件、獲取環(huán)境信息等功能。在父進程中,我們可以創(chuàng)建一個線程池(簡易理解為空線程“座位”),當來一個用戶的時候,就給他分配一個“座位”,這樣做的好處時,節(jié)省處理時間,使服務器反應能夠更迅速。當有多個用戶任務需要處理時,那么可以將其放入一個“任務隊列”中,即所有創(chuàng)建的隊列的單元都是一個客戶任務。利用socket編程,一方面去檢測監(jiān)聽套接字的請求,準備連接,另一方面,處理已經(jīng)連接的套接字的任務,接收請求,通過子進程和STM32控制設備進行交互,然后再進行反饋。子進程:子進程中大致可分為三個線程。線程1不斷地向STM32請求獲得環(huán)境數(shù)據(jù),也就是發(fā)送命令請求,存儲起來,方便用戶能夠快速進行訪問。另外兩個線程主要負責串口的收和發(fā),當接收到服務器的命令請求時,線程2進行串口發(fā)送命令請求,線程3用于從串口藍牙上獲取各種命令請求的反饋信息。這樣的話形成了一個發(fā)送和接收的線程循環(huán)。通過消息隊列來接受來自父進程的控制命令請求,通過共享內(nèi)存來將從STM32上獲取的各種數(shù)據(jù)傳遞給父進程,然后再給用戶端。服務器的整個架構如下圖所示。圖4-8服務器程序架構圖4.2.5服務器C++類抽象本設計為可移植性和代碼利用性的考慮,全部代碼采用Linux下C++編譯完成,因此需要將整個框架中的類進行抽象,這樣做的好處是便于我們后續(xù)對整體的框架的添加功能和裁剪功能。在一般的C++應用開發(fā)軟件設計中,類的抽象顯得尤為重要,每一個類對應一個功能模塊的實現(xiàn)。換句話說,類組成了整個框架。所以,進行C++開發(fā)時我們往往是站在一個很高的角度在進行思考問題。在本次設計中,一方面需要與用戶交互,又需要與STM32進行數(shù)據(jù)傳輸,同時在網(wǎng)絡通信,隊列化管理,進程和線程的并發(fā)處理,串口驅(qū)動等功能上實現(xiàn)模塊化處理。因此抽象的類有服務器類、用戶管理類、設備管理類、TCP服務器類、IPCObject類、線程池類、數(shù)據(jù)庫類,鏈式隊列類。它們的大致功能如下。用戶管理類:管理用戶任務,實現(xiàn)用戶的登錄、注冊、控制設備、獲取環(huán)境信息等,同時反饋給用戶。服務器對象:對整個服務器的抽象,實現(xiàn)進程的創(chuàng)建,用戶管理對象和設備管理對象的工作。設備管理對象:對設備進行管理,控制設備的收發(fā)調(diào)度,和設備統(tǒng)一控制。TCP服務端類:對整個服務器端的TCP收發(fā)任務進行管理,管理用戶任務的接入、工作、退出。IPCObject類:對新型的進程間通信方式共享內(nèi)存、消息隊列、信號燈集的抽象。用于多進程的并發(fā)和數(shù)據(jù)的共享。線程池類:對線程池的對象,便于對多任務的快速處理。即申請好任務資源,留給任務線程來使用。數(shù)據(jù)庫類:對用戶信息的管理,具體是管理用戶的用戶名,密碼,手機號和用戶唯一識別碼之間的對應關系。統(tǒng)一化用戶管理。鏈式隊列類:主要是對多任務進行隊列化(先進先出)處理。4.3App應用軟件設計4.3.1應用軟件介紹應用化圖形軟件在當今時代的發(fā)展潮流可以說是高歌猛進,它的勢頭已經(jīng)蓋過了整個軟件鏈上的任何一個其它部分。因此現(xiàn)如今,因其需求的如此之大,也誕生了一大批應用軟件開發(fā)工程師。這樣趨勢正式由于應用軟件的層次低位所決定的。應用軟件,顧名思義是以應用為主要目的軟件,一方面它必須要和用戶進行界面的交互,這也是很重要的一環(huán),因為好的界面交互會讓人感覺到賞心悅目,流暢的界面也能彌補功能上的損失和缺陷,然而現(xiàn)實確是如此,用戶體驗已經(jīng)占據(jù)了APP開發(fā)和更新維護的主旋律。另一方面,對于聯(lián)網(wǎng)的APP,與服務器端的交互也顯得尤為重要,協(xié)議的選擇,數(shù)據(jù)傳送的方式,數(shù)據(jù)的壓縮等將會影響聯(lián)網(wǎng)類APP的流暢性體驗。最后也就是APP的維護和升級,為了便于穩(wěn)步更新和易于維護,APP應用也必須采用模塊化的處理。現(xiàn)如今,應用軟件的開發(fā)平臺也是多種多樣。目前移動端的以Android應用開發(fā)市場最為廣闊,Android應用又以Java的高度兼容性開支扇葉。然而本設計任采用嵌入式框架下的應用軟件開發(fā)工具Qt5.8.0進行開發(fā)。Qt采用C++語言進行軟件產(chǎn)品的開發(fā),其中的類和庫豐富,且已經(jīng)封裝的完美,它是嵌入式產(chǎn)品開發(fā)中常見的開發(fā)工具。同時不僅可以開發(fā)本平臺,其源代碼可以移植到任何平臺。但是由于語言中類的兼容性考慮,可能移植后并不是十分完美。因此,本設計不采用任何移植。4.3.2應用軟件功能分析本設計中,由于服務器器端的是一個多客戶任務處理。因此,客戶端的連接可以采用長連接,也可以是短連接??蛻舳巳绻B接上服務器,就必須知道服務端的IP地址和端口號,因此必須有綁定IP和端口號的功能,在實際的應用開發(fā)中,因為服務段程序一段運行在有一個合法的IP服務器主機上,所以在客戶端中,人們往往是將其固定,如果有域名,當然也可以采用域名來處理,但是端口是必須的。另外用戶的登錄和注冊也是必不可少,用戶登錄的信息(包括用戶名和密碼)等都需要和用戶交互去獲取。當發(fā)送登錄信息后,等待服務端的驗證,會給用戶反饋唯一的識別吧,以判斷用戶是否存在,或是用戶名和密碼是否正確。根據(jù)服務端返回的信息,如果是用戶名或密碼錯誤,會new一個新的對話框提示用戶是否進行找回密碼操作。如果是登錄成功,則會進行進入一個智能農(nóng)場管理的主界面。用戶農(nóng)場管理的主界面主要是將農(nóng)場中的各種信息進行采集然后在匯總到一個界面,直觀的顯示給農(nóng)場用戶。在其中,農(nóng)場中設備的控制也需要去添加此功能。所以數(shù)據(jù)的優(yōu)化和界面的快速跳轉就顯得很重要。4.3.3APP架構設計APP主要是由類的拼接來實現(xiàn)全部的功能,有界面化的類又和界面綁定。在APP的設計中,因為每個圖形界面其本質(zhì)是1個類的對象,所以這也充分地體現(xiàn)了類在C++中的核心地位。本次在APP的開發(fā)設計中,我們創(chuàng)建的類如下。 TcpClient:用于TCP通信的客戶端。 BindServer:用戶綁定服務器的IP地址和端口號。 LoginWiget:用戶用于登錄的主界面。包含了獲得用戶信息及進入綁定IP界面,智能農(nóng)場主界面,及注冊主界面。 RegisterWidge:用戶用于注冊的主界面。包含了獲得用戶的用戶名、密碼、手機號注冊信息。 DeviceManager:設備管理主界面。包含了控制農(nóng)場中各種設備的按鈕。各個類的通信與結合就構成了整個APP模塊的框架。類之間的跳轉就形成了界面之間的跳轉,不過大部分界面之間都需要使用TCP協(xié)議和服務端進行通信。整個APP的架構如下圖所示。圖4-9APP程序架構圖
第五章系統(tǒng)測試與性能分析5.1STM32控制模塊測試STM32是整個農(nóng)場系統(tǒng)的數(shù)據(jù)采集中心,所有的傳感器模塊均采用STM32進行驅(qū)動,因此STM32獲得的數(shù)據(jù)將是整個系統(tǒng)的核心數(shù)據(jù)。因為STM32的數(shù)據(jù)最后都是通過藍牙進行傳輸?shù)椒掌鞫?,所以我們將藍牙主設備與USB轉串口CH340相連后插入電腦用串口調(diào)試助手進行測試。串口測試方法入下圖所示。圖5-1串口測試STM32圖 測試主要包括,溫度采集測試、濕度采集測試、光照強度采集測試、三軸加速度采集測試、三軸陀螺儀采集測試、控制LED測試、控制報警器測試、控制步進電機測試等。測試內(nèi)容及結果如下表所示。表5-1測試命令結果表測試內(nèi)容測試命令測試結果點亮LED10XBB0X990X000X01正確熄滅LED10XBB0X990X000X02正確控制LED20XBB0X990X010X01正確熄滅LED20XBB0X990X010X02正確開啟舵機運轉0XBB0X990X020X01正確關閉舵機運轉0XBB0X990X020X02正確開啟報警器0XBB0X990X030X01正確關閉報警器0XBB0X990X030X02正確獲得溫度數(shù)據(jù)0XCC0X990X000X01正確獲得濕度數(shù)據(jù)0XCC0X990X010X01正確獲得光照強度0XCC0X990X040X01正確獲得三軸加速度0XCC0X990X020X01正確獲得三軸陀螺儀0XCC0X990X030X01正確獲得設備狀態(tài)0XCC0X990X070X01正確通過藍牙對STM32硬件上的各個模塊的采集工作已經(jīng)完畢,各模塊均能夠正常工作,指令有效且能夠正確反饋信息。5.2Exynos4412服務端模塊測試首先需要測試的是服務端的基本功能,包括服務器開啟、父進程和子進程創(chuàng)建、任務隊列的創(chuàng)建、數(shù)據(jù)庫的創(chuàng)建、串口的打開、線程池的創(chuàng)建等。我們通過中斷打印的方法來進行測試。Exynos4412的服務器是高速運行的,也就是說它會以很快的速度向STM32發(fā)送控制指令來要求獲得環(huán)境信息。為了便于觀察服務端是否能夠正確發(fā)送指令,和獲取環(huán)境信息,將服務器的采集信息間隔由原來的100ms增加為2s。便于我們直接進行觀察。服務端的測試結果如下表5-2所示。表5-2服務運行功能模塊測試表測試內(nèi)容終端現(xiàn)象(信息)測試結果Socket接口Socketopensuccess正確創(chuàng)建任務隊列Createtaskqueuesuccess正確創(chuàng)建線程池Createthreadpoolsuccess正確創(chuàng)建sqlite3數(shù)據(jù)庫Createdatabasesuccess正確Uart控制OpenttyUSB0success正確創(chuàng)建消息隊列Createmsgequeuesuccess正確創(chuàng)建共享內(nèi)存Createsharememsuccess正確創(chuàng)建信號燈集Createsempahoresuccess正確獲取設備狀態(tài)STAT:0x10x100正確獲取溫度信息(溫度x10)TEMP:0x010x04正確獲取濕度信息(濕度x10)HUMI:0x020x01正確獲取光照強度(關照強度x12)LIGH:0x000x53正確獲取三軸加速度(實際數(shù)據(jù)x262)ACCE:0xD70x520x0D0x7C0x2C0x5A正確獲取三軸陀螺儀(實際數(shù)據(jù)x3276)GYRO:0xFF0xDB0x00x1A0x00x03正確獲取與用戶的交互功能需要同APP一起連調(diào)。這部分的測試內(nèi)容同APP一起在本章下節(jié)進行。5.3APP應用模塊測試APP的測試主要包括:注冊測試、登錄測試、控制設備測試、獲取環(huán)境信息測試、多用戶任務測試。在進行登錄之間,先要進行設置服務端的IP和端口號。界面如下圖5-2和5-3所示。圖5-2綁定服務端地址圖圖5-3綁定成功界面圖當綁定完成之后,需要進行登錄,登錄界面如下所示。在登錄時,服務器端會進行驗證用戶名和密碼操作。如果用戶請求的用戶名和密碼和服務器保存的不一致會要求注冊或重新登錄。登錄和注冊模塊如下圖5-4所示。圖5-4APP登錄界面圖因為當前用戶“hello”并不存在,所以服務器端無法進行識別。服務端收到的信息和反饋的“null”如下圖5-5所示。圖5-5服務端處理“無效”用戶圖客戶端接收服務端的userToken后,處理如下圖5-6所示。圖5-6APP處理服務器反饋圖因此我們需要對hello用戶進行注冊操作,注冊模塊界面及服務器的處理信息如下圖5-7,5-8所示。圖5-7用戶注冊界面圖圖5-8服務處理注冊圖因為已經(jīng)注冊,在服務端的數(shù)據(jù)庫中已有該用戶“hello”,所以,再次登錄服務端的處理如下圖5-9所示。圖5-9服務端處理“存在”用戶圖當服務端匹配到“合法”的用戶時,會返回給用戶唯一的用戶狀態(tài)識別碼,在用戶的本次通信中,均需要用次識別碼進行身份識別。這樣做的一個好處,防止用戶長時間不操作占用服務端資源。當?shù)卿洺晒螅脩舳说闹鹘缑嫒缦聢D5-10所示。圖5-10用戶信息主界面當用戶點下左邊那個大的按鈕時,會進行環(huán)境信息采集。APP界面及服務端處理如下所示。圖5-11APP采集信息動態(tài)顯示圖圖5-12服務端處理“獲取溫度”圖圖5-13服務端處理“獲取濕度”圖圖5-14服務端處理“獲取光照強度”圖圖5-15服務端處理“獲取三軸
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025隴塬大數(shù)據(jù)服務(定西)有限公司招聘53人(甘肅)備考考試題庫及答案解析
- 2026內(nèi)蒙古包頭稀土高新區(qū)教育系統(tǒng)校園招聘20人(四)(內(nèi)蒙古師范大學招聘站)模擬筆試試題及答案解析
- 2025天津久大環(huán)境檢測有限責任公司招聘10人備考筆試題庫及答案解析
- 中船集團第七〇八研究所2026屆校園招聘模擬筆試試題及答案解析
- 2025福建三明沙縣區(qū)第一中學高中編內(nèi)招聘7人參考筆試題庫附答案解析
- 2025廣西玉林市博白縣消防救援大隊公開招聘政府專職消防員10人備考筆試試題及答案解析
- 2025年甘肅省新華書店有限責任公司招聘工作人員57人備考考試題庫及答案解析
- 2025廣西北海市殘疾人康復培訓中心招聘2人備考筆試題庫及答案解析
- 2025海南省海賓酒店管理集團有限公司招聘2人參考考試題庫及答案解析
- 2025湖南懷化市教育局直屬學校招聘教職工65人模擬筆試試題及答案解析
- 財稅托管托管合同范本
- 發(fā)現(xiàn)自己的閃光點課件
- 2025建筑節(jié)能工程監(jiān)理實施細則
- 2025-2026學年蘇教版(新教材)小學科學三年級上冊科學期末復習卷及答案
- 發(fā)電廠汽輪機副操崗位考試試卷及答案
- 阿里合伙人合同
- 雨課堂在線學堂《臨床中成藥應用》作業(yè)單元考核答案
- 2025年皮膚科年度工作總結報告
- 實施指南(2025)《HGT 6114-2022 廢酸中重金屬快速檢測方法 能量 - 色散 X 射線熒光光譜法》
- 廚師廚工考試題及答案
- 理化檢測知識培訓課件
評論
0/150
提交評論