基于Lora的遠程農業(yè)監(jiān)測與控制系統(tǒng)
如需源碼或成品可以私我~
一、基本信息
題目:基于Lora的遠程農業(yè)監(jiān)測與控制系統(tǒng)
目的:通過Lora子節(jié)點采集好各種傳感器的信息,發(fā)送給匯聚節(jié)點,匯聚節(jié)點將數(shù)據(jù)通過ESP8266上傳至云端,使用了微信小程序進行監(jiān)測與控制
元器件:正點原子lora模塊3個、正點原子STM32F103ZET6最小系統(tǒng)開發(fā)板3個、MQ2氣敏傳感器(替代二氧化碳傳感器)、雨滴傳感器、土壤濕度傳感器、光照傳感器、DHT11溫濕度傳感器、水位傳感器、三路繼電器、12V轉5V、3.3V電源模塊
成品:
主要元器件圖片:


二、設計思路
下面的過程略微有點長,不過算是記錄了我詳細的思考過程,有需要的小伙伴可以看看
其實我覺得設計思路是整個畢設最重要的部分,因為它決定著你后續(xù)工作的展開,這里我僅提供自己的設計思路做以參考,希望大佬多多指點。
子節(jié)點:采集各種傳感器數(shù)據(jù),在接收到匯聚節(jié)點的指令后發(fā)出數(shù)據(jù)
匯聚節(jié)點:發(fā)送指令與接收子節(jié)點返回的數(shù)據(jù)
整體思路:匯聚節(jié)點發(fā)出獲取A節(jié)點數(shù)據(jù)的指令后立馬開啟接收函數(shù),并且對收到的值進行判斷以確保沒有丟包,如果數(shù)據(jù)不完整會再次重復發(fā)送過程,三次不成功后將跳過對A節(jié)點的詢問,直接開始對B節(jié)點進行詢問。
子節(jié)點采集好各種傳感器數(shù)據(jù)后,在接收到子節(jié)點的查詢指令后,使用串口3通過Lora發(fā)出,同時會在末尾加上校驗數(shù)據(jù),比如0X55,當匯聚節(jié)點收到數(shù)據(jù)后可以直接判斷末尾是否為0x55,確保數(shù)據(jù)的完整性。
這里我們有一個需要注意的問題,如果不對子節(jié)點進行地址和信道的單獨設置會使得數(shù)據(jù)在發(fā)送時存在干擾問題。通過研究正點原子Lora使用手冊,可以使用定向傳輸,在進行Lora配置時,對每個子節(jié)點進行信道、地址單獨配置,發(fā)送數(shù)據(jù)時攜帶上目標節(jié)點的信道和地址即可。
參考下圖(來源AN1801A ATK-LORA-01 無線串口模塊使用說明):

最重要部分:個人認為最重要的就是匯聚節(jié)點對子節(jié)點的輪詢,因為我們不可能同時訪問到兩個子節(jié)點,就算可以也會存在數(shù)據(jù)干擾,因此我們需要輪流詢問子節(jié)點,簡單理解就是一次只能跟一個人交流,面對一群人時我們只能一個一個的交流。
我的初步想法是在一個while循環(huán)里通過判斷一個節(jié)點是否接收完畢然后開始下一個節(jié)點,這樣的話感覺理論上是沒有什么問題的,但是和導師說完我的想法后,導師直接說我想的過于簡單,建議我使用一個實時操作系統(tǒng)來完成輪詢。
后面我經過思考發(fā)現(xiàn),如果只是在while里面輪詢,對于數(shù)據(jù)上傳和命令下發(fā)是非常不友好的。因為我們的要求是對子節(jié)點的控制命令優(yōu)先級要高于對節(jié)點數(shù)據(jù)采集。并且我們在收到數(shù)據(jù)后還要進行數(shù)據(jù)上云的步驟,如果只是普通while循環(huán)的話是遠遠不夠的。
最終通過網上查詢相關資料,和簡單了解之后我是用了FreeRTOS系統(tǒng),另一部分原因也是正點原子官方提供的開發(fā)板資料里面有一些FreeRTOS的使用教程,可以作為學習的起點。

三、整體設計方案及結構圖
1、系統(tǒng)整體設計
系統(tǒng)整體是基于STM32、Lora和FreeRTOS、微信小程序、onenet開發(fā),分別由終端節(jié)點、匯聚節(jié)點、云平臺、小程序用戶端四大部分組成。每個終端節(jié)點由STM32和Lora模塊組成,其主要任務是完成對農田溫濕度、土壤濕度、水位、二氧化碳、降雨量、光照等數(shù)據(jù)量的采集、完成對數(shù)據(jù)的簡單處理,保證數(shù)據(jù)的可用性,同時也要也要完成對灌溉設備、補光設備、換氣設備的控制實現(xiàn)人工干預創(chuàng)造適合農作物生長的環(huán)境。終端節(jié)點在采集到數(shù)據(jù)后通過低耗能Lora將數(shù)據(jù)上傳至匯聚節(jié)點。匯聚節(jié)點在通過Lora接收到數(shù)據(jù)后將數(shù)據(jù)上傳至云平臺,用戶端可以隨時通過小程序鏈接云平臺完成對數(shù)據(jù)的讀取和對設備的控制。

2、匯聚節(jié)點設計
匯聚節(jié)點硬件主要是由STM32、Lora和ESP8266組成。在FreeRTOS的系統(tǒng)中,分別設置五個主要任務,并且按照一定的優(yōu)先級執(zhí)行,同時也要響應ESP8266接收到的云端下發(fā)數(shù)據(jù)。在輪詢到Lora任務時,接收到子節(jié)點數(shù)據(jù)后進行判斷,如果數(shù)據(jù)完整則進行簡單處理后上傳云平臺。

3、子節(jié)點設計
子節(jié)點主要是通過STM32采集各種傳感器數(shù)據(jù)和控制設備,采集到的數(shù)據(jù)通過簡單處理后在接受到查詢命令時通過Lora發(fā)給匯聚節(jié)點。同時也要接收匯聚節(jié)點的控制命令,對控制設備進行操作。

四、系統(tǒng)軟件設計(部分代碼)
雖然整個軟件設計比較簡單或者說大多是重復工作,比如傳感器的ADC采集,但是我盡可能多用集中方式來實現(xiàn),感興趣的小伙伴可以做個參考。如果有不對的地方或者更優(yōu)解歡迎指出。
1、子節(jié)點A流程圖

上面這個過程可能有些許復雜,我自己畫的可能也有點問題。下面我會再詳細的敘述一遍代碼執(zhí)行過程。
B節(jié)點的流程與這個類似,只是在最終命令判斷部分有所不同,這里就不重復展示了。
時間2022年3月10日,忙完了一些事有點空了,接著上面的繼續(xù)。
如果你沒有看明白上面的流程圖,那么沒關系,可以看看我下面的文字敘述,及主要代碼分析
2、模塊配置
這個地方我們可以參考正點原子的ATK-LORA配置軟件 V1.2,軟件的下載地址可以去這里面尋找:
指令幫助一欄里面有相應配置指令的使用方式,我這里的配置代碼如下所示:
//為防止通信產生干擾可以自己修改這里的模塊配置參數(shù),如果另一側是用上位機接收,
?//就在上位機調試APP中修改為對應的參數(shù)即可,不然兩個模塊無法通信
?lora_send_cmd((u8 *)"AT+ADDR=FF,F1",(u8 *)"OK",200); //設置地址
?lora_send_cmd((u8 *)"AT+CWMODE=0",(u8 *)"OK",200); //設置為省電模式
?lora_send_cmd((u8 *)"AT+TMODE=1",(u8 *)"OK",200); //設置為定向傳輸
?lora_send_cmd((u8 *)"AT+TPOWER=3",(u8 *)"OK",200); //設置發(fā)射功率20db
?lora_send_cmd((u8 *)"AT+WLRATE=24,2",(u8 *)"OK",200); //設置信道為24,空中速率2.4
?lora_send_cmd((u8 *)"AT+WLTIME=0",(u8 *)"OK",200); //設置休眠時間為1S
?lora_send_cmd((u8 *)"AT+UART=7,0",(u8 *)"OK",200);//設置波特率115200,無校驗

我們要特別注意地址、信道、傳輸模式、空中速率的配置,這里有必要說一下傳輸模式的區(qū)別。
傳輸模式一共有三種,分別是{0 一般模式}、{1 喚醒模式}、{2 省電模式}、{3 信號強度模式},信號強度模式我并未測試,但是前面兩種我已經測試完畢。
一般模式:這個模式下可以進行無線透明、定向傳輸數(shù)據(jù),接收方必須是工作在一般模式和喚醒模式。
3、Lora發(fā)送
在終端節(jié)點接收到發(fā)送數(shù)據(jù)的命令時,子節(jié)點會調用各個傳感器相應的函數(shù)獲取數(shù)據(jù),然后將數(shù)據(jù)填裝到對應數(shù)組的位置,最后將數(shù)據(jù)數(shù)組與目標地址和信道組合,通過串口使用Lora發(fā)出。
未完待續(xù)