首页 > 分享 > 基于STM32F407实现土壤湿度检测

基于STM32F407实现土壤湿度检测

        土壤湿度传感器它利用电磁脉冲原理、根据电磁波在介质中传播频率来测量土壤的表观介电常数,从而得到土壤相对含水量。

代码流程


    1.看原理图确定GPIO与ADC通道        PA5, ADC1IN5
    2.配置GPIO为模拟模式
    3.ADC初始化
        a.结构体申明     ADC_CommonInitTypeDef
        b.时钟使能
        c.结构体配置
        d.初始化
    4.ADC通道初始化
        a.结构体申明         ADC_InitTypeDef
        b.结构体配置
        c.初始化
    5.可以进行中断配置
        记得开中断,规则通道结束中断标志为ADC_IT_EOC
    6.各种使能
        a.ADC通道使能
        b.ADC使能
        c.软件开启ADC转换

ADC结构体的介绍在上一篇文章有讲

ADC等结构体的配置

void ADC_SOIL_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

ADC_CommonInitTypeDef ADC_CommonInitStructure;

ADC_InitTypeDef ADC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);

ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;

ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div6;

ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;

ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_10Cycles;

ADC_CommonInit(&ADC_CommonInitStructure);

ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;

ADC_InitStructure.ADC_ScanConvMode = DISABLE;

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;

ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

ADC_InitStructure.ADC_NbrOfConversion = 1;

ADC_Init(ADC1, &ADC_InitStructure);

ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_84Cycles);

ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);

ADC_Cmd(ADC1, ENABLE);

ADC_SoftwareStartConv(ADC1);

}

土壤湿度检测模块的引脚配置

void Gpio_Soil_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

}

获得 ADC 值

u16 Get_Adc_Soil(u8 ch)

{

ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );

ADC_SoftwareStartConv(ADC1);

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));

return ADC_GetConversionValue(ADC1);

}


平均多次ADC结果,提高精度     


/*参  数:channel: 通道数            
/*参  数:count: 平均次数      

int Get_Adc_Soil_Average(int channel,int count)

{

int sum_val=0;

char t;

for(t=0;t<count;t++)

{

sum_val+=Get_Adc_Soil(channel);

Delay_ms(5);

}

return sum_val/count;

}

实现功能函数

这里我用的是OLED显示汉字和数据(字模可以用取模软件得到),没配置OLED的可以用串口打印一下

void soil_moisture(void)

{

float raindata;    

float    voltage;

    raindata = 90 - (((float)Get_Adc_Soil_Average(3,20))*(3.3/4096)*30);

    printf("雨水值:%.2frn",raindata);

if(raindata > 40)

    {

            printf("有雨水出现!rn");

    }

else

    {

            printf("没有雨水出现!rn");

    }

int i;

for(i = 0;i < 4; i++)

    {

        OLED_ShowSoil(1,i+1,i);

    }

    OLED_ShowString(1,9,":");

    OLED_ShowNum(1,10,(int)raindata,2);

}

相关知识

探索物联网新境界:基于STM32F407与SX1262的LoRa驱动开发资源
基于51单片机土壤湿度检测及自动浇花系统
基于土壤湿度检测的自动浇花系统设计
基于控制土壤湿度的智能花卉浇水系统设计
天地人申请一种基于土壤容重和土壤湿度的菠萝水心病预警方法专利,通过检测土壤容重与湿度预测菠萝水心病发病率,实现提前预警
一种可检测土壤湿度的花盆的制作方法
基于STM32的土壤湿度检测自动浇水系统proteus仿真设计(仿真+程序+设计报告+讲解视频)
337、基于51单片机的智能花盆浇水浇花土壤湿度温度光照检测系统设计
土壤湿度检测新闻
基于控制土壤湿度的智能花卉浇水系统设计.pdf

网址: 基于STM32F407实现土壤湿度检测 https://m.huajiangbk.com/newsview514410.html

所属分类:花卉
上一篇: 基于土壤湿度检测的自动浇花系统设
下一篇: 白兰花的盆栽技术