本帖最后由 mxkw0514 于 2023-3-2 20:58 编辑
#申请原创#
引言
该项目为土壤墒情和水位监测系统,其用于监测不同土壤层含水量信息和地下水位信息,该系统由水分传感器、水位传感器、数据处理单元和WEB端监测平台四部分组成。多探头的水分传感器利用电磁场感知土壤含水量并将其转换成频率信号;水位传感器基于陶瓷压敏器件感知水压并将其转换成模拟电压信号,数据处理单元对水分传感器和水位传感器进行分时采集,并将采集到的电信号根据对应标定模型转换成数值信息,最后基于4G模块通过MQTT协议将土壤墒情信息和水位信息远程传输到WEB端上;WEB端基于OneNET物联网开放平台并利用View 3.0可视化工具搭建而成,完成对上传数据的解析和显示。
一、硬件设计
土壤墒情和水位监测系统的硬件部分包括水分传感器、水位传感器、数据处理单元、通信模块和电源模块四部分电路,该项目基于立创EDA软件完成原理图和PCB的绘制,并完成PCB的打样、焊接和调试。 水位传感器的压敏陶瓷感知水压信息并将其转化成模拟电压小信号,该小信号通过仪表运算放大器放大得到单片机ADC外设可以测量的电压信号进行输出;水分传感器通过上下环形极板与土壤组成一个等效的谐振电容,LC谐振电路产生的高频振荡信号经过分频得到单片机Timer外设可以捕获的方波进行输出;数据处理单元是基于CH32V307单片机的最小主控系统,其ADC外设和Timer外设分别完成对水位传感器和水分传感器输出信号的采集,并将采集到的信号根据对应标定模型转化成具体数值,通过AT指令将打包的字符串发送给通信模块;通信模块在AT指令的驱动下,利用MQTT指令与OneNET平台建立连接,并将终端感知的环境信息发送到平台上并显示出来;电源模块包括太阳能充电电路、Boost电路和Buck电路,其输出的电压为3.3V和5V,分别为系统其它模块供电。硬件总体框图如下所示。
、 图1 硬件结构框图
图2 硬件实物图 二、软件设计 软件部分包括下位机和上位机两部分组成。软件总体框图如图3所示 下位机程序是基于MounRiver Studio软件进行开发,包括电压信号测量模块、频率信号测量模块、数据滤波模块和数据传输模块四部分组成。电压信号测量模块通过CH32V307的ADC外设对水位传感器输出的模拟电压信号进行采集;频率信号测量模块通过CH32V307的GPIO控制74HC238译码器分时传入不同水分传感器探头频率信号,该信号传入到单片机的Timer进行捕获;数据滤波模块将采集到的电信号值存储到数组中,利用中位值平均滤波算法降低脉冲干扰引起的采样值偏差;数据传输模块将数据滤波模块输出值根据传感器标定模型进行转换和整合打包,通过AT指令串口输出给4G模块。 上位机利用OneNET物联网开放平台的View 3.0组件搭建而成的WEB监测端,包括土壤含水量监测页面和水位监测页面,其所用到的组件包括仪表盘和折线图,仪表盘对上传数据包进行解析并显示实时信息,折线图对上传数据包进行解析并显示一段时间的变化信息。
图3 软件结构框图
2.1 下位机程序
2.1.1 电压信号测量模块
电压测量模块的核心程序如下所示。复用GPIOA0和GPIOA1为ADC采集引脚,以VDD为基准电压,4095为满bit。其中,GPIOA0为采集水位传感器信号输入引脚,GPIOA1为电池电压输入引脚,共用ADC1外设,所使用通道分别为channel0和channel1,采集数据利用DMA传输。
u16 Get_ConversionVal_Waterlevel(void)
{
DMA_Tx_Init( DMA1_Channel1, (u32)&ADC1->RDATAR, (u32)TxBuf, 1024 );
DMA_Cmd( DMA1_Channel1, ENABLE );
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
Delay_Ms(50);
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
if((TxBuf[0]+Calibrattion_Val)<0) return 0;
if((Calibrattion_Val+TxBuf[0])>4095||TxBuf[0]==4095) return 4095;
return (TxBuf[0]+Calibrattion_Val);
}
2.1.2 频率信号测量模块
数据滤波模块是将模拟电压信号和频率信号的采集值存储到数组中,利用冒泡排序将其从小到大进行排序,然后去除两端较大值和较小值,并对剩下的值进行平均得到有效值,这是经典的中位值平均滤波算法,具体代码如下所示。
void Probe1Control()//只开启水分传感器探头1
{
GPIO_ResetBits( GPIOA, GPIO_Pin_4);//低电平
GPIO_ResetBits( GPIOE, GPIO_Pin_3);//低电平
GPIO_ResetBits( GPIOE, GPIO_Pin_2);//低电平
}
void TIM1_CC_IRQHandler(void)
{
if( TIM_GetITStatus( TIM1, TIM_IT_CC1 ) != RESET )
{
TIM_SetCounter( TIM1, 0 );
}
if( TIM_GetITStatus( TIM1, TIM_IT_CC2 ) != RESET )
{
TIM1_CAPTURE_VAL=72000000 /(TIM_GetCapture2( TIM1 ));
TIM_SetCounter( TIM1, 0 );
}
TIM_ClearITPendingBit( TIM1, TIM_IT_CC1 | TIM_IT_CC2 );
}
2.1.3 数据滤波模块
数据滤波模块是将模拟电压信号和频率信号的采集值存储到数组中,利用冒泡排序将其从小到大进行排序,然后去除两端较大值和较小值,并对剩下的值进行平均得到有效值,这是经典的中位值平均滤波算法,具体代码如下所示。
int Get_Frequence( )
{
unsigned int i = 0;
unsigned int j = 0;
unsigned int f_temp = 0;
unsigned int Frequence_All = 0;
/*******************************************输入频率信号采样,长度为N****************************************************/
for(i=0;i<N;i++)
{
Delay_Ms(20);
Frequence_Arr[i] = TIM1_CAPTURE_VAL;
}
/**********************************************冒泡排序****************************************************/
for(j = 0; j < N; j++)
{
for(i = 0; i < N-j; i++)
{
if(Frequence_Arr[i] > Frequence_Arr[i+1] )
{
f_temp = Frequence_Arr[i] ;
Frequence_Arr[i] = Frequence_Arr[i+1];
Frequence_Arr[i+1] = f_temp;
}
}
}
/**********************************************求取采样数组有效部分,去除两旁较大值和较小值*****************************************************/
for(i=n;i<N-n;i++)
{
Frequence_All=Frequence_All + Frequence_Arr[i];
}
Frequence_Ave = (Frequence_All/(N-2*n));//求取有效采样数组平均频率
return Frequence_Ave;
}
2.1.4 数据传输模块
数据处理模块是对数据滤波模块输出的数据进行打包整合,使用到的函数为sprintf,该函数将测量得到的不同土壤层含水量值、水位值、电池电压值组合成一个字符串。此外,因为上传数据的AT指令AT+ZMQPUB发送的报文需要为16进制的字符串,还需要使用一个将ASCII转换成HEX的函数,该函数为string2hexString如下所示。
sprintf(p1,"%2.1f%2.1f%2.1f%2.1f%1.2f",*String_Probe1_Moisture,*String_Probe2_Moisture,
*String_Probe3_Moisture,*String_Waterlevel,*String_Power);//字符串整合
//将ASCII转换成16进制
void string2hexString(char* input, char* output)
{
int loop=0;
int i=0;
while(input[loop] != '\0')
{
sprintf((char*)(output+i),"%02X", input[loop]);
loop+=1;
i+=2;
}
output[i++] = '\0';
}
图4 MounRiver Studio开发环境
2.2 上位机程序
WEB监测端基于OneNET平台搭建而成(如图5所示),每个页面都使用了View 3.0工具的折线图和和仪表盘(如图6所示),折线图和仪表盘对上传数据包解析字符串的拆解和组合,并将组合后的数值显示出来,具体的数据解析代码分别如下所示:
//仪表盘数据解析代码
function filter(data, rootData, variables) {
function last(arr) {
var len = arr ? arr.length : 0;
if (len) return arr[len - 1];
}
return [{
value: (last(data).value[0] + last(data).value[1] + last(data).value[2] + last(data).value[3]) ,//按字符串bit位解析和组合
name: '1层土壤含水率'
}]
折线图数据解析代码
function filter(data, rootData, variables) {
data.forEach((item, index) => {
item.x = item.at
item.y1 = (item.value[0] + item.value[1] + item.value[2] + item.value[3])
item.y2 = (item.value[4] + item.value[5] + item.value[6] + item.value[7])
item.y3 = (item.value[8] + item.value[9] + item.value[10] + item.value[11])
// console.log('元素:', item, ';下标:', index);
});
return data
图5 OneNET物联网开放平台
图6 View 3.0 折线图和仪表盘工具
结果
源代码链接:https://github.com/mxkw0514/Moisture-and-WaterLevel
项目运行示意图如下所示:
图6 系统工作示意图
项目的演示效果如下所示:https://www.bilibili.com/video/BV1Lv4y167YY?t=2.2
|