殖物聯(lián)網(wǎng)監(jiān)測(cè)控制系統(tǒng):從傳感器到自動(dòng)控制的全棧設(shè)計(jì)與實(shí)現(xiàn))
做家畜養(yǎng)殖的物聯(lián)網(wǎng)監(jiān)測(cè)與控制系統(tǒng)聽起來是個(gè)標(biāo)準(zhǔn)到不能再標(biāo)準(zhǔn)的畢業(yè)設(shè)計(jì)題目但真正動(dòng)手把“監(jiān)測(cè)”和“控制”都跑通以后你才會(huì)發(fā)現(xiàn)這里面的門道比想象中多。它不只是一個(gè)嵌入式項(xiàng)目也不只是一套管理軟件而是傳感器、通信、自動(dòng)控制、數(shù)據(jù)庫(kù)、前端展示幾條線擰在一起的一整套閉環(huán)。這篇內(nèi)容我按“從需求到落地”的順序把整套方案的設(shè)計(jì)思路、選型權(quán)衡、代碼實(shí)現(xiàn)和論文寫作要點(diǎn)拆開聊一遍如果你正在做這類題目或者想給自家養(yǎng)殖場(chǎng)搞一套低成本的監(jiān)測(cè)控制系統(tǒng)可以直接照著這個(gè)框架走。1. 項(xiàng)目概述與需求分析1.1 為什么規(guī)模養(yǎng)殖越來越需要監(jiān)測(cè)控制系統(tǒng)傳統(tǒng)散養(yǎng)模式下家畜的體溫、環(huán)境狀態(tài)、采食飲水這些指標(biāo)全靠飼養(yǎng)員肉眼觀察一旦存欄量上來問題就藏不住了。我實(shí)地跟過一個(gè)小型豬場(chǎng)六百多頭育肥豬每天光人工巡檢溫濕度、看通風(fēng)狀態(tài)就要花掉大半天氨氣濃度超標(biāo)的時(shí)候人要進(jìn)豬舍都得戴著口罩憋口氣進(jìn)去等發(fā)現(xiàn)牲口咳嗽、精神差再處理?yè)p失早就造成了。這套系統(tǒng)的核心邏輯是把人的“巡檢-判斷-操作”拆成機(jī)器的閉環(huán)傳感器不停采集環(huán)境參數(shù)和家畜個(gè)體數(shù)據(jù)數(shù)據(jù)匯聚到管理平臺(tái)后平臺(tái)根據(jù)預(yù)設(shè)閾值或者聯(lián)動(dòng)規(guī)則自動(dòng)控制風(fēng)機(jī)、濕簾、照明、喂料設(shè)備同時(shí)在異常發(fā)生時(shí)推送報(bào)警。說白了就是用一套低價(jià)可靠的設(shè)備替代高頻重復(fù)的人工勞動(dòng)把管理動(dòng)作從“事后補(bǔ)救”變成“事中干預(yù)”。做這類項(xiàng)目的需求分析時(shí)最忌諱只寫“實(shí)現(xiàn)溫濕度監(jiān)測(cè)”這種空話。論文里和設(shè)計(jì)里都一定要量化比如豬舍目標(biāo)溫度區(qū)間18到25攝氏度氨氣濃度長(zhǎng)期控制在20ppm以下超過25ppm啟動(dòng)風(fēng)機(jī)強(qiáng)排30ppm觸發(fā)報(bào)警。把指標(biāo)定到這里后面的方案選型和實(shí)驗(yàn)測(cè)試才有據(jù)可依。1.2 系統(tǒng)的核心功能模塊拆解我把系統(tǒng)按功能拆成四個(gè)塊這也是論文目錄里最自然的劃分環(huán)境監(jiān)測(cè)、個(gè)體監(jiān)管、自動(dòng)控制、遠(yuǎn)程預(yù)警。環(huán)境監(jiān)測(cè)覆蓋溫濕度、氨氣濃度、光照強(qiáng)度和粉塵濃度其中溫濕度和氨氣是基礎(chǔ)配置光照用于畜禽舍補(bǔ)光控制粉塵可以部分反映通風(fēng)效果。個(gè)體監(jiān)管這塊規(guī)模養(yǎng)殖場(chǎng)通常用RFID耳標(biāo)或者二維碼耳標(biāo)記錄個(gè)體信息配合稱重傳感器和采食計(jì)數(shù)能掌握每頭家畜的體重增長(zhǎng)曲線和進(jìn)食異常。自動(dòng)控制是系統(tǒng)的執(zhí)行端包括風(fēng)機(jī)啟停、濕簾水泵、照明燈組、喂料電機(jī)、電磁水閥這些。遠(yuǎn)程預(yù)警則是把設(shè)備報(bào)警、閾值越限和系統(tǒng)故障通過現(xiàn)場(chǎng)聲光報(bào)警、管理端彈窗、短信或者移動(dòng)端推送發(fā)出去。四塊功能在系統(tǒng)里不是各干各的它們之間存在明確的聯(lián)動(dòng)環(huán)境參數(shù)引導(dǎo)控制動(dòng)作控制動(dòng)作反過來影響環(huán)境參數(shù)個(gè)體數(shù)據(jù)又為飼養(yǎng)策略提供參考。下面這個(gè)表格能快速表達(dá)清楚模塊、作用域與實(shí)現(xiàn)手段的對(duì)應(yīng)關(guān)系。環(huán)境監(jiān)測(cè)采集溫濕度、氨氣、光照、粉塵用于環(huán)境評(píng)估與控制聯(lián)動(dòng)通過傳感器節(jié)點(diǎn)完成個(gè)體監(jiān)管記錄耳標(biāo)身份、體重、采食量用于健康分析和異常篩查通過RFID與稱重模塊實(shí)現(xiàn)自動(dòng)控制操作風(fēng)機(jī)、濕簾、照明、喂料、飲水用于環(huán)境調(diào)節(jié)與定時(shí)飼喂通過控制器與驅(qū)動(dòng)電路實(shí)現(xiàn)遠(yuǎn)程預(yù)警越限報(bào)警、設(shè)備掉線提醒、報(bào)警記錄查詢用于異常及時(shí)響應(yīng)通過Web/移動(dòng)端推送實(shí)現(xiàn)2. 系統(tǒng)整體架構(gòu)與方案選型2.1 三層架構(gòu)設(shè)計(jì)思路整套系統(tǒng)我推薦用最經(jīng)典的感知層-傳輸層-平臺(tái)層三層結(jié)構(gòu)別在這個(gè)地方搞花活。感知層是各類傳感器和控制器負(fù)責(zé)采集數(shù)據(jù)和執(zhí)行動(dòng)作傳輸層是通信網(wǎng)絡(luò)負(fù)責(zé)把數(shù)據(jù)從現(xiàn)場(chǎng)送到服務(wù)器同時(shí)把下發(fā)指令送回設(shè)備端平臺(tái)層是運(yùn)行在服務(wù)器上的軟件系統(tǒng)負(fù)責(zé)數(shù)據(jù)存儲(chǔ)、規(guī)則引擎、界面展示和控制指令下發(fā)。為什么一定要分三層因?yàn)楝F(xiàn)場(chǎng)環(huán)境太惡劣了畜禽舍有高濃度的氨氣、水汽和粉塵設(shè)備之間間距幾十米甚至上百米如果不把通信職責(zé)獨(dú)立出來后面調(diào)試的時(shí)候會(huì)非常痛苦。分層的另一個(gè)好處是論文邏輯清晰需求分析、總體設(shè)計(jì)、詳細(xì)設(shè)計(jì)天然按層次展開查重和答辯的時(shí)候也好講。平臺(tái)層可以進(jìn)一步拆成服務(wù)端程序和Web管理端兩部分服務(wù)端負(fù)責(zé)與設(shè)備網(wǎng)關(guān)通信、處理數(shù)據(jù)、執(zhí)行調(diào)度控制Web管理端給用戶跨平臺(tái)的管理操作界面。如果還想做得更完整加一個(gè)小程序端用于移動(dòng)巡檢但題目里的核心是論文加源碼服務(wù)端加Web端已經(jīng)完全夠用。2.2 通信方案選型比技術(shù)本身更重要的是場(chǎng)景約束選通信方案時(shí)我建議先看傳輸距離、功耗約束和現(xiàn)場(chǎng)遮擋情況再來選技術(shù)。畜禽舍內(nèi)部存在大量金屬欄桿和實(shí)體隔墻無(wú)線信號(hào)衰減比空曠環(huán)境嚴(yán)重得多如果一味追求單跳距離容易出現(xiàn)數(shù)據(jù)斷斷續(xù)續(xù)的問題。我在實(shí)際對(duì)比中整理過一張參考表可以幫助你在開題階段就錨定方向方案通信距離功耗成本傳輸速率典型場(chǎng)景RS485有線可達(dá)1200米低低中等舍內(nèi)固定點(diǎn)位采集穩(wěn)定性最高LoRa空曠1-3公里低低低跨舍區(qū)匯聚后端數(shù)據(jù)抗干擾強(qiáng)ZigBee100米級(jí)別低低中等星型網(wǎng)絡(luò)采集但穿墻較弱Wi-Fi50米級(jí)別高中高適合有廠區(qū)網(wǎng)絡(luò)的環(huán)境4G/NB-IoT遠(yuǎn)距離中高中高中野外散養(yǎng)點(diǎn)、無(wú)本地網(wǎng)關(guān)的場(chǎng)景最終我常用的是“RS485總線做舍內(nèi)采集 LoRa網(wǎng)關(guān)做跨舍匯聚 4G做遠(yuǎn)端上云”的組合方案。別小看這種混合組網(wǎng)它的容錯(cuò)性比單一種類好很多傳感器節(jié)點(diǎn)通過RS485總線掛在采集器上不易受無(wú)線干擾采集器再通過LoRa把數(shù)據(jù)匯聚到網(wǎng)關(guān)網(wǎng)關(guān)統(tǒng)一通過4G接入平臺(tái)。這樣的好處是任意一棟舍的線路故障不影響其余棟舍采集。2.3 為什么不建議全程用Wi-Fi不少初次做這個(gè)題目的同學(xué)拿著ESP8266就設(shè)計(jì)成每個(gè)節(jié)點(diǎn)連Wi-Fi理由是開發(fā)簡(jiǎn)單。真正部署就會(huì)發(fā)現(xiàn)三個(gè)麻煩第一畜禽舍面積大、墻體厚單臺(tái)路由器覆蓋不了全部點(diǎn)位需要多臺(tái)做Mesh配置量直接膨脹第二Wi-Fi信道稠密時(shí)互相干擾嚴(yán)重?cái)?shù)據(jù)丟包率肉眼可見第三Wi-Fi模塊功耗高如果節(jié)點(diǎn)還要靠電池供電續(xù)航會(huì)很難看。最要命的是Wi-Fi和家里的微波爐一樣工作在2.4GHz頻段現(xiàn)場(chǎng)如果有其他無(wú)線設(shè)備信號(hào)質(zhì)量會(huì)忽好忽壞。調(diào)試的時(shí)候數(shù)據(jù)通的過了兩天又掉線排查起來極其難受。所以我的建議是固定部署的環(huán)境監(jiān)測(cè)點(diǎn)盡可能走有線總線只有確實(shí)布線困難的地方才考慮LoRa這類低功耗無(wú)線方式。3. 感知層設(shè)計(jì)傳感器選型與數(shù)據(jù)采集3.1 傳感器選型與布點(diǎn)原則感知層是整個(gè)系統(tǒng)的眼睛選型出了問題后面全白搭。以最常見的豬舍環(huán)境監(jiān)測(cè)為例溫濕度我用數(shù)字型傳感器SHT30它比DHT22精度更高長(zhǎng)期穩(wěn)定性更好I2C接口直接讀寄存器拿數(shù)據(jù)不用自己算時(shí)序。氨氣濃度用MQ-137氣體傳感器模塊輸出模擬電壓經(jīng)ADC采集。光照用BH1750I2C接口直接輸出勒克斯值。每個(gè)測(cè)點(diǎn)還順帶留了一個(gè)DS18B20防水探頭插在飲水槽里測(cè)水溫這個(gè)細(xì)節(jié)在我的實(shí)測(cè)里救了不少次場(chǎng)。布點(diǎn)不能拍腦袋我踩過很深的坑是只在一個(gè)位置裝傳感器。豬舍這種環(huán)境南側(cè)和北側(cè)溫差能到幾攝氏度氨氣濃度更是和風(fēng)機(jī)位置強(qiáng)相關(guān)。正確做法是每棟舍內(nèi)按照對(duì)角線布置三個(gè)測(cè)點(diǎn)離地高度1.2米左右避開排風(fēng)口和直射陽(yáng)光。采集數(shù)據(jù)時(shí)平臺(tái)側(cè)取三點(diǎn)平均值參與控制判斷單個(gè)節(jié)點(diǎn)異常時(shí)可以及時(shí)剔除不會(huì)讓一次傳感器失靈就誤開整個(gè)控溫系統(tǒng)。3.2 模擬量采集與接線細(xì)節(jié)MQ-137這類傳感器模塊輸出的是模擬電壓需要接到采集器的ADC引腳。采集器我經(jīng)常用STM32系列的開發(fā)板自帶12位ADC分辨率和穩(wěn)定性都滿足要求。接線時(shí)注意傳感器模塊的供電電壓和信號(hào)電壓必須和采集器的ADC參考電壓一致否則會(huì)出現(xiàn)讀數(shù)偏移。一個(gè)容易被忽略的細(xì)節(jié)是模擬信號(hào)線需要用屏蔽線并單端接地我剛開始用的普通跳線測(cè)試環(huán)境一切正常一進(jìn)豬舍數(shù)據(jù)就開始跳動(dòng)排查了很久才發(fā)現(xiàn)是旁邊風(fēng)機(jī)帶來的電磁干擾。后來?yè)Q成雙絞屏蔽線把屏蔽層在采集器側(cè)單端接地?cái)?shù)據(jù)馬上穩(wěn)定下來。每次布點(diǎn)完成后都要在螺絲口和接線端子處打上硅膠固定防止氨氣腐蝕導(dǎo)致接觸不良。提示與傳感器通信時(shí)必須先在本地記錄各個(gè)測(cè)點(diǎn)校準(zhǔn)后的基礎(chǔ)值比如某只傳感器放在同一位置連續(xù)采集24小時(shí)的平均值以此作為后續(xù)異常態(tài)的參照基線而不是憑空使用芯片手冊(cè)里的默認(rèn)值。3.3 采樣頻率與濾波策略溫濕度這類緩變環(huán)境量采樣頻率不需要太高10秒采一次完全夠用。氨氣濃度的變化頻率稍高一些但也不建議低于2秒一采。問題在于采集回來的原始數(shù)據(jù)經(jīng)常帶毛刺尤其是氣體傳感器本身就有輸出波動(dòng)如果不做濾波平臺(tái)上的曲線會(huì)像心電圖一樣上下猛跳控制設(shè)備也跟著頻繁啟停。我常用的組合是限幅濾波加滑動(dòng)平均濾波先把超過上下限的粗大誤差剔除再對(duì)最近五個(gè)點(diǎn)取平均值。限幅濾波的閾值要根據(jù)傳感器數(shù)據(jù)手冊(cè)和經(jīng)驗(yàn)設(shè)置比如氨氣濃度相鄰兩秒的差值超過5ppm就認(rèn)為是干擾。處理完的數(shù)據(jù)才進(jìn)入數(shù)據(jù)庫(kù)和規(guī)則引擎這套濾波代碼在論文里也能單獨(dú)寫一小節(jié)屬于工作量很實(shí)在的內(nèi)容。4. 傳輸層實(shí)現(xiàn)通信協(xié)議與數(shù)據(jù)交互4.1 傳感器采集器的Modbus協(xié)議封裝如果采集端用的是RS485總線那Modbus RTU協(xié)議是繞不開的基礎(chǔ)通信協(xié)議。每臺(tái)采集器作為一個(gè)Modbus從站網(wǎng)關(guān)作為主站輪詢各個(gè)從站寄存器從站地址從1開始順序分配。輪詢周期依據(jù)采集頻率設(shè)定一般控制在1秒內(nèi)完成一輪全量采集。協(xié)議封裝不復(fù)雜核心就是組報(bào)文、發(fā)報(bào)文、解析報(bào)文。讀溫濕度的請(qǐng)求幀是“從站地址 功能碼0x03 起始寄存器高字節(jié) 起始寄存器低字節(jié) 寄存器數(shù)量高字節(jié) 寄存器數(shù)量低字節(jié) CRC校驗(yàn)”。從站返回的數(shù)據(jù)幀里溫濕度分別放在兩個(gè)寄存器里按照數(shù)據(jù)手冊(cè)換算成實(shí)際工程值。CRC16校驗(yàn)一定要自己實(shí)現(xiàn)一遍別圖省事把校驗(yàn)函數(shù)整個(gè)裁掉通信質(zhì)量會(huì)大幅下降。4.2 網(wǎng)關(guān)到平臺(tái)MQTT接入與主題設(shè)計(jì)從LoRa網(wǎng)關(guān)到云平臺(tái)的通信我推薦直接走M(jìn)QTT協(xié)議。MQTT的好處是發(fā)布訂閱模型解耦了設(shè)備和平臺(tái)設(shè)備端只往主題里發(fā)消息平臺(tái)端根據(jù)自己的訂閱收消息雙方各自獨(dú)立演進(jìn)不需要像HTTP一樣頻繁建立連接。同時(shí)MQTT的心跳機(jī)制非常適合低帶寬、弱網(wǎng)環(huán)境網(wǎng)關(guān)斷網(wǎng)后重連的成本極低。主題命名要遵循可維護(hù)性原則我習(xí)慣用三級(jí)主題結(jié)構(gòu)一級(jí)是項(xiàng)目標(biāo)識(shí)二級(jí)是設(shè)備類型或區(qū)域三級(jí)是具體設(shè)備編號(hào)和數(shù)據(jù)類別。實(shí)際報(bào)文用JSON封裝一個(gè)典型消息體包含設(shè)備編號(hào)、采集時(shí)間點(diǎn)、溫度、濕度、氨氣濃度、光照強(qiáng)度和信號(hào)質(zhì)量字段服務(wù)端收到后直接解析入庫(kù)。M點(diǎn)多說一句QoS的選擇。傳感器上報(bào)數(shù)據(jù)允許偶爾丟失用QoS 0就夠控制指令下發(fā)涉及生產(chǎn)安全必須用QoS 1確保消息至少到達(dá)一次。主題的保留消息功能也很有用設(shè)備狀態(tài)這種與最新值強(qiáng)相關(guān)的信息可以開保留新上線的管理端一訂閱就能拿到最新狀態(tài)。4.3 數(shù)據(jù)緩存與時(shí)序存儲(chǔ)網(wǎng)絡(luò)波動(dòng)是畜禽現(xiàn)場(chǎng)的常態(tài)網(wǎng)關(guān)與服務(wù)器之間的連接斷掉幾十秒再恢復(fù)是很正常的事情。因此網(wǎng)關(guān)側(cè)需要有一個(gè)輕量級(jí)的本地消息緩存區(qū)斷線時(shí)先把數(shù)據(jù)暫存在本地網(wǎng)絡(luò)恢復(fù)后按時(shí)間順序補(bǔ)傳避免平臺(tái)側(cè)出現(xiàn)時(shí)間斷檔。這個(gè)補(bǔ)傳機(jī)制在論文的詳細(xì)設(shè)計(jì)章節(jié)里要畫出來是工作量體現(xiàn)的加分項(xiàng)。平臺(tái)側(cè)的存儲(chǔ)我建議區(qū)分兩類表一類是設(shè)備信息表記錄設(shè)備的基礎(chǔ)信息另一類是環(huán)境時(shí)序數(shù)據(jù)表專門存監(jiān)測(cè)數(shù)值。時(shí)序表不能無(wú)限增長(zhǎng)后面加一個(gè)定期清理策略比如保留90天詳情數(shù)據(jù)超過期限的做聚合后刪除這樣可以保證數(shù)據(jù)庫(kù)的查詢速度不隨著時(shí)間拖垮。5. 控制執(zhí)行層設(shè)計(jì)與實(shí)現(xiàn)5.1 控制模塊的驅(qū)動(dòng)電路控制層到底控制什么要看養(yǎng)殖對(duì)象和規(guī)模。風(fēng)機(jī)、濕簾水泵、補(bǔ)光燈、喂料電機(jī)、電磁水閥這五類設(shè)備基本覆蓋了絕大多數(shù)場(chǎng)景。電氣控制我用的方案是控制器輸出低電平控制信號(hào)給光耦光耦隔離后再驅(qū)動(dòng)繼電器繼電器觸點(diǎn)接接觸器或直接接負(fù)載。光耦隔離這一層絕對(duì)不能省現(xiàn)場(chǎng)電機(jī)啟停時(shí)的浪涌電壓很容易順著共地串回控制器嚴(yán)重時(shí)會(huì)直接燒毀主控芯片。繼電器選型要看負(fù)載類型。風(fēng)機(jī)屬于感性負(fù)載啟動(dòng)電流比穩(wěn)態(tài)電流大很多繼電器觸點(diǎn)容量要預(yù)留1.5到2倍裕量。濕簾水泵這類阻性負(fù)載相對(duì)輕松但功率也不能忽略。每個(gè)繼電器輸出端并一個(gè)續(xù)流二極管吸收反向電動(dòng)勢(shì)這兩個(gè)細(xì)節(jié)在長(zhǎng)期運(yùn)行中價(jià)值極大能幫你少跑十趟現(xiàn)場(chǎng)。5.2 控制策略死區(qū)控制與聯(lián)動(dòng)規(guī)則控制策略是系統(tǒng)的靈魂也是論文中最能寫深度的部分。我觀察過很多失敗的系統(tǒng)控制邏輯就一句“溫度高了開風(fēng)機(jī)”結(jié)果設(shè)備頻繁啟停機(jī)械磨損嚴(yán)重現(xiàn)場(chǎng)環(huán)境波動(dòng)反而更大。正確做法是引入死區(qū)控制。比如目標(biāo)溫度區(qū)間設(shè)為20到26攝氏度那么當(dāng)溫度升到26攝氏度以上并且持續(xù)30秒才開風(fēng)機(jī)降到20攝氏度以下并且持續(xù)30秒才停風(fēng)機(jī)。升溫過程和降溫過程的啟停閾值之間拉開差距設(shè)備就不會(huì)在臨界點(diǎn)上反復(fù)震蕩。這個(gè)“持續(xù)確認(rèn)時(shí)間”能過濾掉傳感器毛刺帶來的誤動(dòng)作同時(shí)給執(zhí)行設(shè)備一個(gè)穩(wěn)定的工作周期。聯(lián)動(dòng)規(guī)則更體現(xiàn)系統(tǒng)價(jià)值。氨氣濃度超過25ppm時(shí)單純開風(fēng)機(jī)可能不夠我就設(shè)計(jì)成風(fēng)機(jī)強(qiáng)制高速擋運(yùn)行、同時(shí)打開側(cè)窗電機(jī)直到氨氣濃度降到18ppm才恢復(fù)常規(guī)控制。溫度控制同理夏季高溫時(shí)風(fēng)機(jī)加濕簾水泵聯(lián)動(dòng)冬季低溫時(shí)打開加熱器并且關(guān)閉風(fēng)機(jī)保溫。這些規(guī)則在規(guī)則引擎里配置管理員可以在管理端直接調(diào)整閾值不需要重新燒寫設(shè)備程序。5.3 安全保護(hù)與手動(dòng)優(yōu)先無(wú)論設(shè)計(jì)多少自動(dòng)化功能都必須保留現(xiàn)場(chǎng)手動(dòng)優(yōu)先機(jī)制。實(shí)際畜禽舍環(huán)境復(fù)雜算法不可能覆蓋所有情況一旦傳感器集體漂移或者斷電重啟自動(dòng)控制可能給出錯(cuò)誤指令。我的設(shè)計(jì)方案是每個(gè)控制柜都保留手動(dòng)/自動(dòng)/遠(yuǎn)程三擋轉(zhuǎn)換開關(guān)當(dāng)打到手動(dòng)擋時(shí)平臺(tái)和自動(dòng)策略全部失效現(xiàn)場(chǎng)人員可以完全人工操作。軟件側(cè)的倒計(jì)時(shí)保護(hù)也同樣重要任何控制指令下發(fā)后平臺(tái)側(cè)要啟動(dòng)一個(gè)超時(shí)保護(hù)比如風(fēng)機(jī)開啟指令執(zhí)行后如果環(huán)境參數(shù)在設(shè)定時(shí)間內(nèi)沒有任何變化趨勢(shì)系統(tǒng)判定執(zhí)行異常自動(dòng)發(fā)報(bào)警并恢復(fù)為安全狀態(tài)防止設(shè)備卡死導(dǎo)致長(zhǎng)時(shí)間運(yùn)行。這套保護(hù)邏輯在論文的“系統(tǒng)可靠性設(shè)計(jì)”小節(jié)里撐得起至少兩頁(yè)的篇幅。6. 平臺(tái)軟件設(shè)計(jì)數(shù)據(jù)庫(kù)、后端與前端實(shí)現(xiàn)6.1 數(shù)據(jù)庫(kù)設(shè)計(jì)與時(shí)序數(shù)據(jù)建模服務(wù)端我建議用Spring Boot配合MySQL數(shù)據(jù)庫(kù)這套組合在運(yùn)維和源碼展示上都很成熟。數(shù)據(jù)庫(kù)設(shè)計(jì)是整個(gè)后端開發(fā)的地基表格規(guī)劃得好后續(xù)寫接口效率翻倍。核心表我總結(jié)了五張用戶信息表、設(shè)備信息表、環(huán)境監(jiān)測(cè)數(shù)據(jù)表、控制日志表、報(bào)警記錄表。設(shè)備信息表里記錄設(shè)備編號(hào)、設(shè)備類型、安裝位置、在線狀態(tài)、啟用狀態(tài)環(huán)境監(jiān)測(cè)數(shù)據(jù)表是核心時(shí)序表字段包括采集時(shí)間、溫度、濕度、氨氣濃度、光照度、信號(hào)強(qiáng)度控制日志表負(fù)責(zé)記錄每條指令是自動(dòng)發(fā)出還是人工操作這是系統(tǒng)安全追溯的關(guān)鍵。所有表的主鍵我用自增ID同時(shí)給采集時(shí)間字段建普通索引因?yàn)榘磿r(shí)間范圍查數(shù)據(jù)是最常見的操作。這里有個(gè)優(yōu)化點(diǎn)環(huán)境監(jiān)測(cè)表的查詢不要做跨表的復(fù)雜關(guān)聯(lián)寧可多寫兩條查詢語(yǔ)句再在代碼里組裝也不要在數(shù)據(jù)量上去之后讓MySQL做大量關(guān)聯(lián)查詢速度是天壤之別。6.2 后端接口設(shè)計(jì)與規(guī)則引擎實(shí)現(xiàn)后端接口又分成兩類給前端管理頁(yè)面展示查詢的接口以及給設(shè)備端接入的通信接口。設(shè)備端接入接口比較特殊它不直接暴露HTTP接口而是作為MQTT客戶端訂閱設(shè)備上行主題消息進(jìn)入后由后臺(tái)服務(wù)完成解析、入庫(kù)和規(guī)則判斷。管理端接口則是一組RESTful API包括設(shè)備列表接口、最新環(huán)境數(shù)據(jù)接口、歷史趨勢(shì)數(shù)據(jù)接口、控制指令下發(fā)接口、報(bào)警記錄查詢接口。規(guī)則引擎是后端代碼中帶智能的部分。我實(shí)現(xiàn)時(shí)用的不是復(fù)雜的規(guī)則引擎框架最開始就是一組策略模式的調(diào)度器每種控制對(duì)象對(duì)應(yīng)一個(gè)策略類策略類內(nèi)部讀取最新環(huán)境數(shù)據(jù)結(jié)合預(yù)設(shè)閾值輸出控制狀態(tài)。這種實(shí)現(xiàn)方式代碼結(jié)構(gòu)清晰好調(diào)試最關(guān)鍵的是答辯時(shí)可以說清楚??刂浦噶钕掳l(fā)接口有嚴(yán)格的權(quán)限控制管理員登錄后獲得合法會(huì)話下單指令時(shí)后端要記錄下發(fā)人、下發(fā)時(shí)間、指令內(nèi)容。前端頁(yè)面上的按鈕不能直接暴露設(shè)備的協(xié)議細(xì)節(jié)后端完成業(yè)務(wù)校驗(yàn)、生成協(xié)議報(bào)文、通過MQTT主題下發(fā)才能把安全和可追溯性都兼顧到。6.3 前端展示與預(yù)警推送管理前端我用Vue加ECharts完成頁(yè)面圍繞三個(gè)核心視圖展開。第一個(gè)是總覽儀表盤展示各棟舍的實(shí)時(shí)溫濕度、氨氣濃度和在線狀態(tài)卡片式布局異常數(shù)據(jù)用紅色高亮第二個(gè)是歷史曲線按時(shí)間段聚合展示任意傳感器的變化趨勢(shì)用于分析通風(fēng)策略是否合理第三個(gè)是控制臺(tái)用開關(guān)組件控制風(fēng)機(jī)、燈光和閥門每次操作后列出操作記錄。預(yù)警推送是系統(tǒng)價(jià)值最容易感知的功能。我實(shí)現(xiàn)了兩級(jí)推送機(jī)制第一級(jí)是Web端實(shí)時(shí)推送通過WebSocket與后端保持長(zhǎng)連接觸發(fā)閾值時(shí)頁(yè)面立即彈出紅色告警條第二級(jí)是移動(dòng)端通知和短信通知短信只在嚴(yán)重級(jí)別觸發(fā)比如氨氣濃度超過30ppm或者設(shè)備離線超過10分鐘避免高頻短信造成騷擾。在真實(shí)使用場(chǎng)景里短信報(bào)警確實(shí)能讓飼養(yǎng)員在半夜及時(shí)處理一次風(fēng)機(jī)停擺等于挽回了整欄豬的損失。注意閾值配置頁(yè)面要開放給管理員自己調(diào)整不要寫死在數(shù)據(jù)庫(kù)中。因?yàn)槎酿B(yǎng)殖策略不同冬季和夏季的通風(fēng)量目標(biāo)完全不一樣寫死閾值會(huì)讓這套系統(tǒng)變成“半年好用半年瞎折騰”的半成品。7. 論文寫作要點(diǎn)從項(xiàng)目代碼到合格論文7.1 論文框架與章節(jié)安排論文結(jié)構(gòu)我建議嚴(yán)格按七章走緒論、相關(guān)技術(shù)介紹、系統(tǒng)需求分析、系統(tǒng)總體設(shè)計(jì)、系統(tǒng)詳細(xì)設(shè)計(jì)、系統(tǒng)實(shí)現(xiàn)與測(cè)試、總結(jié)與展望。這種結(jié)構(gòu)最契合高校畢業(yè)設(shè)計(jì)的評(píng)審習(xí)慣也能把工作量充分展示出來。緒論部分的國(guó)內(nèi)外研究現(xiàn)狀不要大規(guī)模堆砌參考文獻(xiàn)重點(diǎn)是引出“現(xiàn)有方案成本高/不適用中小型養(yǎng)殖場(chǎng)”這個(gè)切入點(diǎn)讓后面的設(shè)計(jì)有立足之處。每章的內(nèi)容配比要控制好需求分析要結(jié)合現(xiàn)場(chǎng)調(diào)研數(shù)據(jù)最好放一張真實(shí)的養(yǎng)殖環(huán)境數(shù)據(jù)采集表格和一個(gè)養(yǎng)殖戶訪談?wù)到y(tǒng)總體設(shè)計(jì)放三層系統(tǒng)架構(gòu)圖和功能模塊圖詳細(xì)設(shè)計(jì)是重點(diǎn)篇幅把傳感器選型表、通信協(xié)議格式、數(shù)據(jù)庫(kù)建表SQL、控制流程圖、接口定義完整展開測(cè)試部分必須有系統(tǒng)功能測(cè)試用例表和環(huán)境監(jiān)測(cè)數(shù)據(jù)對(duì)比折線圖。在分配內(nèi)容時(shí)下面這張參考表能幫你快速把握各章節(jié)的篇幅和側(cè)重點(diǎn)緒論與背景3至5頁(yè)點(diǎn)明痛點(diǎn)與論文工作不深入技術(shù)相關(guān)技術(shù)介紹4至6頁(yè)簡(jiǎn)要介紹傳感器、MQTT、Modbus、Vue避免整段復(fù)制教材系統(tǒng)需求分析5至8頁(yè)功能需求、非功能需求、數(shù)據(jù)流圖重點(diǎn)結(jié)合現(xiàn)場(chǎng)調(diào)研系統(tǒng)總體設(shè)計(jì)6至8頁(yè)架構(gòu)圖、模塊劃分、通信鏈路設(shè)計(jì)系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)12至18頁(yè)數(shù)據(jù)庫(kù)設(shè)計(jì)、協(xié)議實(shí)現(xiàn)、規(guī)則控制、界面設(shè)計(jì)放核心源碼片段系統(tǒng)測(cè)試與結(jié)果5至8頁(yè)功能測(cè)試、性能測(cè)試、環(huán)境控制效果分析7.2 源碼與圖的規(guī)范問題論文里放源碼要注意兩個(gè)原則只貼核心片段所有源碼必須引入代碼解釋。我當(dāng)時(shí)把完整源碼提交到附件里正文只保留了Modbus報(bào)文組包方法、MQTT消息處理函數(shù)、溫度控制策略類、數(shù)據(jù)庫(kù)查詢方法這幾個(gè)關(guān)鍵片段。用等寬字體排版行號(hào)規(guī)范注釋必須是中文。圖的規(guī)范是最容易被答辯老師挑刺的地方。每個(gè)圖都要有圖號(hào)和圖題圖號(hào)格式為“圖2-1 系統(tǒng)總體架構(gòu)圖”這種圖題放圖下方居中每個(gè)表都要有表號(hào)表題放表上方居中。數(shù)據(jù)流圖、ER圖、系統(tǒng)截圖、硬件接線圖、傳感器實(shí)物圖這幾類圖是必備的缺一不可。硬件實(shí)物圖拍完以后記得用圖片處理工具把拍攝時(shí)間戳和無(wú)關(guān)背景裁掉看起來正式很多。7.3 答辯準(zhǔn)備重點(diǎn)答辯時(shí)老師最常問的問題集中在三個(gè)方面為什么選用這種通信方式、系統(tǒng)出了故障如何排查、系統(tǒng)數(shù)據(jù)準(zhǔn)確性和可靠性如何保證。針對(duì)第一個(gè)問題可以拿通信選型對(duì)比表來說話。針對(duì)第二個(gè)問題直接回答設(shè)計(jì)了三層異常檢測(cè)終端自檢、網(wǎng)關(guān)心跳、平臺(tái)超時(shí)判斷每一層都有對(duì)應(yīng)的報(bào)警策略。針對(duì)第三個(gè)問題強(qiáng)調(diào)傳感器校準(zhǔn)方法、濾波算法、采集器端人工比對(duì)實(shí)驗(yàn)。還有一個(gè)高頻考點(diǎn)是系統(tǒng)的實(shí)際控制效果。如果測(cè)試環(huán)境條件有限我的經(jīng)驗(yàn)是用可編程加熱電阻模擬溫度變化在實(shí)驗(yàn)室環(huán)境下完成控制邏輯驗(yàn)證再把現(xiàn)場(chǎng)部署方案作為后續(xù)工作寫進(jìn)去。這樣既保證了論文實(shí)驗(yàn)的可實(shí)現(xiàn)性也展示了完整思考過程。切忌在論文和答辯里虛構(gòu)一個(gè)根本沒有運(yùn)行過的實(shí)際養(yǎng)殖場(chǎng)效果數(shù)據(jù)這種硬傷一旦被追問出來很難圓場(chǎng)。8. 調(diào)試過程常見問題與排查實(shí)錄8.1 傳感器數(shù)據(jù)跳變與人為誤操作現(xiàn)場(chǎng)調(diào)試遇到最多的問題就是傳感器數(shù)據(jù)跳變。RS485總線上如果地址重復(fù)網(wǎng)關(guān)輪詢時(shí)會(huì)收到兩個(gè)節(jié)點(diǎn)的響應(yīng)解析出的數(shù)據(jù)完全是亂的表現(xiàn)為同一條總線上不同點(diǎn)位的數(shù)據(jù)來回互串。處理方法很簡(jiǎn)單設(shè)備安裝階段就對(duì)每個(gè)采集器編好物理地址做成一張地址對(duì)照表貼在現(xiàn)場(chǎng)控制柜里。另一種跳變來自供電不足。一塊電源模塊同時(shí)給傳感器、繼電器和網(wǎng)關(guān)供電風(fēng)機(jī)一啟動(dòng)電流拉低傳感器瞬間失壓上報(bào)數(shù)據(jù)直接掉到零。后來我改成各路電源模塊獨(dú)立供電在網(wǎng)關(guān)和傳感器之間加了DC-DC隔離模塊電流波動(dòng)的問題才整改掉。從這里吸取的教訓(xùn)是現(xiàn)場(chǎng)調(diào)試時(shí)可以用手機(jī)充電寶單獨(dú)給一塊傳感器模塊供電快速判斷是不是電源共地問題。8.2 通信鏈路掉線與執(zhí)行器故障設(shè)備離線問題排查思路可以整理成一套快速倒查法先看網(wǎng)關(guān)本身是否在線再看LoRa模塊指示燈是否正常然后看RS485總線上是否有個(gè)別從站拉低了整條鏈路最后確認(rèn)云服務(wù)器上的MQTT連接是否被斷掉。很多時(shí)候是總線末端某臺(tái)采集器短路把整個(gè)RS485段干趴逐段斷開排查能很快定位故障節(jié)點(diǎn)。執(zhí)行器故障里繼電器觸點(diǎn)粘死是高發(fā)問題。風(fēng)機(jī)長(zhǎng)期頻繁啟停繼電器觸點(diǎn)打火積碳最終粘住無(wú)法斷開表現(xiàn)為平臺(tái)已經(jīng)下發(fā)停風(fēng)機(jī)指令但設(shè)備仍在運(yùn)行。排查時(shí)可以把手動(dòng)開關(guān)切到手動(dòng)擋現(xiàn)場(chǎng)強(qiáng)制操作確認(rèn)是否是繼電器損壞如果確實(shí)是繼電器壽命到了就換用更大容量的繼電器或者升級(jí)成固態(tài)繼電器一勞永逸。8.3 問題排查速查表故障現(xiàn)象、可能原因、排查方向是運(yùn)維里最實(shí)用的知識(shí)沉淀下面整理成一張速查表故障現(xiàn)象可能原因優(yōu)先排查步驟單個(gè)傳感器無(wú)數(shù)據(jù)接線脫落、從站地址沖突檢查接線端子看總線輪詢?nèi)罩救總鞲衅鳠o(wú)數(shù)據(jù)網(wǎng)關(guān)離線、電源跳閘檢查網(wǎng)關(guān)電源與網(wǎng)絡(luò)連接數(shù)據(jù)顯示但明顯漂移傳感器未校準(zhǔn)、受潮老化重新校準(zhǔn)更換傳感器做比對(duì)控制指令下發(fā)無(wú)響應(yīng)繼電器損壞、控制邏輯未觸發(fā)切手動(dòng)擋測(cè)試設(shè)備本身是否完好前端頁(yè)面數(shù)據(jù)不更新MQTT消息未解析入庫(kù)查看服務(wù)端日志看心跳主題消息歷史曲線出現(xiàn)斷層網(wǎng)關(guān)斷線緩存未補(bǔ)傳檢查補(bǔ)傳開關(guān)確認(rèn)本地隊(duì)列堆積8.4 環(huán)境防腐與長(zhǎng)期運(yùn)維經(jīng)驗(yàn)畜禽舍的氨氣對(duì)裸露的PCB和金屬端子有很強(qiáng)的腐蝕作用。我一開始的采集器置于開口塑料盒里三個(gè)月后打開看接線端子已經(jīng)出現(xiàn)綠色銹跡。后來所有采集節(jié)點(diǎn)的PCB全部噴涂三防漆接線端子加裝密封防水接頭并朝下安裝再用鈑金防護(hù)箱整體密封箱體底部開排水口長(zhǎng)期部署后腐蝕問題大幅緩解。軟件運(yùn)維層面平臺(tái)需要做一個(gè)每日配置備份和每周數(shù)據(jù)健康檢查任務(wù)。監(jiān)測(cè)數(shù)據(jù)表增長(zhǎng)很快盡量定時(shí)清理過期明細(xì)避免數(shù)據(jù)庫(kù)無(wú)限膨脹。每次現(xiàn)場(chǎng)維護(hù)后都要在平臺(tái)的運(yùn)維記錄欄里寫清楚更換了哪個(gè)傳感器、是什么時(shí)候校準(zhǔn)的這些記錄在論文的測(cè)試章節(jié)中都是真實(shí)的過程數(shù)據(jù)比憑空寫的用例表有價(jià)值得多。這套系統(tǒng)的設(shè)計(jì)落點(diǎn)說到底不是把傳感器接上、數(shù)據(jù)傳到網(wǎng)頁(yè)上就完事兒而是要讓每個(gè)數(shù)據(jù)點(diǎn)都能轉(zhuǎn)化成明確的管理動(dòng)作。我在做整套系統(tǒng)的時(shí)候最深的體會(huì)是“控制策略永遠(yuǎn)比采集功能難做”因?yàn)椴杉皇且欢炎x數(shù)的搬運(yùn)而控制需要你真正理解養(yǎng)殖環(huán)境的動(dòng)態(tài)變化。如果你現(xiàn)在正要?jiǎng)邮肿鲱愃频念}目先把需求調(diào)研做扎實(shí)把控制邏輯在前端模擬器里反復(fù)測(cè)幾遍再寫代碼也不遲——省下來的返工時(shí)間足夠你再寫幾章論文了。