摘要:為了防止數據沖突采用輪詢的方式,輪詢發送數據。使用作為核心的開發板,需要的資源定時器中斷,外部中斷,串口接受中斷。定時器負責輪詢發送關鍵字給模塊,并由發送給各終端節點的模塊。
實現功能:
(1)能夠實時檢測顯示土壤濕度,當需要澆水的時候自動打開灌溉系統,土壤濕度滿足要求后,關閉灌溉系統;
(2)檢測顯示二氧化碳濃度,過高時,通過繼電器打開通風排氣扇,同時將二氧化碳濃度數值傳輸到終端進行提示;
(3)能夠實時檢測顯示土壤酸堿度,超標時候能給出報警并提示;
(4)遠程異地和檢測與控制:傳感器所采集到的信息,通過LoRa模塊發送給網關,網關以有線連接的方式通過WiFi模塊發送給云端,APP可以隨時查看大棚內的二氧化碳濃度、土壤濕度與酸堿度的情況;
(5)系統平時可以處于自動模式工作,當需要修改參數時,可以進行手動模式,手動控制可以通過手機和前端按鍵進行修改,并設置閾值。修改后,將按照新的參數進行工作。
本系統由LoRa節點,LoRa網關,智能手機3部分組成,整體結構如圖2-1所示。兩個大棚通過LoRa模塊傳輸數據到網關,網關將所有數據整理后上傳到云端。
本次使用的是正點原子的LoRa模塊,具體配置可以參考手冊進行。為了方便我使用的模式為廣播,只需要將三個LoRa模塊地址、信道、速率相同就可以通信了。由于處于廣播模式下,當一個模塊發送指令時其他另外兩個模塊都會接受到信息,所以在開發板接受到數據的時候需要做一下驗證處理。為了防止數據沖突采用輪詢的方式,輪詢發送數據。例如:將終端節點A1和A2的關鍵字設置為‘DataA1’和‘DataA2’,網關發送關鍵字‘DataA1’給終端節點A1和A2同時接受到了關鍵字‘DataA1’,此時終端節點都進入串口中斷中判斷關鍵字是否需要回復,終端A1判斷為是則回復采集的數據到網關。
網關的主要功能就是接受終端節點的數據、通過WiFi模塊發送數據到云端、下發閾值到終端節點。使用STMF407作為核心的開發板,需要的資源:定時器中斷,外部中斷,串口接受中斷。
按鍵的任務就是負責增加或者減少下發的閾值
串口2中斷接受和處理LoRa模塊發送的數據,串口3中斷是接受和處理WiFi模塊發送的數據(設計思路同串口2)。
定時器4負責輪詢發送關鍵字給LoRa模塊,并由LoRa發送給各終端節點的LoRa模塊。定時器3負責定時發送數據給WiFi模塊,WiFi模塊發送數據到云端。
#include "lora.h"void LoRa_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOC,GPIOF時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG時鐘 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //MD0引腳 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//輸出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉 GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOE2,3,4 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //AUX引腳 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通輸入模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉 GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource6);//PC0 連接到中斷線0 /* 配置EXTI_Line0 */ NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;//外部中斷0 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//搶占優先級0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優先級2 NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;//使能外部中斷通道 NVIC_Init(&NVIC_InitStructure);//配置 LORA_MD0=0; LORA_AUX=0; while(LORA_AUX)//確保LORA模塊在空閑狀態下(LORA_AUX=0) { delay_ms(100); } Lora_uart_init(115200);//初始化串口3 LORA_MD0=1;//進入AT模式 delay_ms(15); while(Lora_setCmd("AT/r/n","OK",0)) ; delay_ms(5); Lora_Clear(); delay_ms(5); while(Lora_setCmd("AT+ADDR=01,23/r/n","OK",0)) ; delay_ms(5); while(Lora_setCmd("AT+WLRATE=24,5/r/n","OK",0)) ; delay_ms(5); LORA_MD0=0; //進入透傳模式 Lora_uart_init(9600); delay_ms(10);}
void USART3_IRQHandler() //串口3中斷服務程序{ u8 Res; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中斷(接收到的數據必須是0x0d 0x0a結尾) { Res =USART_ReceiveData(USART3);//(USART1->DR); //讀取接收到的數據 //printf("%d",Res); if(counts == 0) { Lora_Clear(); } read_bufs[counts++] = Res; //判斷格式 if(Res == 0xfe) { counts = 0; } else if(Res == "}") { counts = 0; USART_Cmd(USART3, DISABLE);//關閉 #if 0 printf("%s/r/n",read_bufs); #endif Lora_Rx_data();//解析數據 USART_Cmd(USART3, ENABLE);//打開 } if(counts>500) { counts = 0; } USART_ClearFlag(USART3, USART_IT_RXNE); } }
void USART2_IRQHandler(void) //串口2中斷服務程序{ u8 Res; if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中斷(接收到的數據必須是0x0d 0x0a結尾) { Res =USART_ReceiveData(USART2);//(USART1->DR); //讀取接收到的數據 if(counts_2 == 0) { wifi_Clear(); } read_bufs_HC[counts_2++] = Res; //判斷數據格式 if(Res == "{") { counts_2 = 0; } else if(Res == "}") { counts_2 = 0; USART_Cmd(USART2, DISABLE);//關閉 printf("%s/r/n",read_bufs_HC); HC25_Rx_Data(); //解析數據 USART_Cmd(USART2, ENABLE);//開啟 } if(counts_2>200) { counts_2 = 0; } USART_ClearFlag(USART2, USART_IT_RXNE); } }
void TIM3_IRQHandler(void){ if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中斷 { if(STA==0){ //Jason數據格式 sprintf(jason," {/n " "/"CO2_1/":%d," "/"CO2pre_1/":%d," "/"PH_1/":%d," "/"PHpre_1/":%d," "/"SoilHum_1/":%d," "/"SoilHumpre_1/":%d," "/"CO2_2/":%d," "/"CO2pre_2/":%d," "/"PH_2/":%d," "/"PHpre_2/":%d," "/"SoilHum_2/":%d," "/"SoilHumpre_2/":%d" "/n}",data.CO2_data,data.CO2_data_Pre,data.PH,data.PH_Pre,data.Soil,data.Soil_Pre ,data1.CO2_data,data1.CO2_data_Pre,data1.PH,data1.PH_Pre,data1.Soil,data1.Soil_Pre); HC25_setData(jason); //發數據 } } TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中斷標志位}
void TIM4_IRQHandler(void){ char tx_buff[80]; char tx_buf2[80]; if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET) //溢出中斷 { TX_time++; //輪詢標志位 switch(TX_time){ case TX_TIME://等于1 if(TX_1){//判斷預設值發送標志位 sprintf(tx_buff,"0xfeDATA:%d:%d:%d:%d:%d:%d}",CO2Pre1,SoilPre1,PHPre1,Water_IT1,Fan_IT1,Beef_IT1); Lora_setData(tx_buff); TX_1=0; TXcope1=1; }else Lora_setData("0xfeTX1:A}/r/n");//輪詢關鍵字1 break; case TX_TIME+TIME_ADD://等于2 if(TX_2){//判斷預設值發送標志位 sprintf(tx_buf2,"0xfedataer:%d:%d:%d:%d:%d:%d}",CO2Pre2,SoilPre2,PHPre2,Water_IT2,Fan_IT2,Beef_IT2); Lora_setData(tx_buf2); TX_2=0; TXcope2=1; } else Lora_setData("0xfetxer:b}/r/n"); TX_time=0;//輪詢標志位 break; default: break; } } TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //清除中斷標志位}
有問題私信或評論區-_-
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/122282.html
摘要:本文分享幾種典型具有實際應用過的智慧農業物聯網解決方案,供大家參考。智慧農業物聯網解決方案由三部分組成智慧農業物聯網平臺智慧農業物聯網網關無線節點。 智慧農業是現代農業發展的必然趨勢,也是科學技術發展的必然結果。本文分享幾種典型具有實際應用過的智慧農業物聯網解決方案,供大家參考。 結合多年與...
摘要:所幸,鄙人所在的硬件專業,指導老師并不懂軟件,他只是想要一個農業物聯網的監測系統,能提供給我的就是一個數據庫,帶著一個物聯網系統運行一年所保存的傳感器數據。該物聯網監測系統整體上可分為三層數據庫層,服務器層和客戶端層。的執行是同步的。 畢設大概是大學四年里最坑爹之一的事情了,畢竟一旦選題不好,就很容易浪費一年的時間做一個并沒有什么卵用,又不能學到什么東西的雞肋項目。所幸,鄙人所在的硬件...
摘要:國際物聯網博覽會蘇州站于月日日蘇州國際博覽中心順利舉行。優锘科技非常榮幸地受邀,帶著最高性能的產品亮相此次展會,優質的商務接待及專業技術展示,為廣大行業客戶帶來最佳的產品體驗。 IOTE 2019國際物聯網博覽會--蘇州站于3月13日-15日蘇州國際博覽中心順利舉行。優锘科技非常榮幸地受邀,帶著最高性能的ThingJS產品亮相此次展會,優質的商務接待及專業技術展示,為廣大行業客戶帶來最...
閱讀 2409·2021-11-19 09:40
閱讀 3575·2021-10-12 10:12
閱讀 1883·2021-09-22 15:04
閱讀 2897·2021-09-02 09:53
閱讀 761·2019-08-29 11:03
閱讀 1122·2019-08-28 18:11
閱讀 1724·2019-08-23 15:28
閱讀 3579·2019-08-23 15:05