目錄
0 說明
1 傳感器介紹
?2 代碼說明
? 2.1 ADC初始化函數(shù)(adc.c)
? 2.2 GPIO初始化函數(shù)
? 2.3 主函數(shù)
0 說明
????????本篇文章主要是說明怎么使用STM32單片機(jī)讀取土壤濕度傳感器采集到的數(shù)據(jù),包括模擬和數(shù)字?jǐn)?shù)據(jù),并且附帶著STM32所需要的全部代碼,所使用的土壤濕度傳感器如下圖所示。
附:使用單片機(jī)STM32f103系列
1 傳感器介紹
????????該傳感器具有數(shù)字開關(guān)量輸出(0和1)和模擬量AO電壓輸出兩種輸出形式。 ? ??
? ? ? ? 接上5V電源,電源燈亮,當(dāng)濕度低于設(shè)定的閾值時(shí),DO輸出為高電平,開關(guān)指示燈滅;高于設(shè)定的閾值時(shí),DO輸出為低電平,開關(guān)指示燈亮。AO模擬輸出,可以連接單片機(jī)的AD口檢測(cè)土壤濕度精確數(shù)值。
????????電位器是用于土壤濕度的閥值調(diào)節(jié),順時(shí)針調(diào)節(jié),控制的濕度會(huì)越大,逆時(shí)針越小,通過電位器調(diào)節(jié)土壤濕度閾值,當(dāng)土壤濕度低于設(shè)定的閾值時(shí),模塊輸出高電平,高于設(shè)定的閾值時(shí),模塊輸出低電平。
2 代碼說明
代碼主要包括主函數(shù)(main.c)、ADC初始化函數(shù)(adc.c)、GPIO初始化函數(shù)
? ?2.1 ADC初始化函數(shù)(adc.c)
ADC的初始化都差不多,需要注意的是ADC的采集函數(shù)
這里采用ADC1通道的PA5進(jìn)行采集AO的信息
#include "stm32f10x.h" //包含需要的頭文件
#include "delay.h" //包含需要的頭文件
/*函數(shù)名:初始化ADC */
void Adc_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定義一個(gè)設(shè)置GPIO的變量
ADC_InitTypeDef ADC_InitStructure; //定義一個(gè)設(shè)置ADC的變量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); //使能GPIOA通道時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE ); //使能ADC1通道時(shí)鐘
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設(shè)置ADC分頻因子6 72M/6=12,ADC最大時(shí)間不能超過14M
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //準(zhǔn)備設(shè)置PA5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入引腳
GPIO_Init(GPIOA, &GPIO_InitStructure); //設(shè)置PA5
ADC_DeInit(ADC1); //復(fù)位ADC1,將外設(shè) ADC1 的全部寄存器重設(shè)為缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在獨(dú)立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模數(shù)轉(zhuǎn)換工作在單通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模數(shù)轉(zhuǎn)換工作在單次轉(zhuǎn)換模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //轉(zhuǎn)換由軟件而不是外部觸發(fā)啟動(dòng)
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC數(shù)據(jù)右對(duì)齊
ADC_InitStructure.ADC_NbrOfChannel = 1; //順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目
ADC_Init(ADC1, &ADC_InitStructure); //根據(jù)ADC_InitStruct中指定的參數(shù)初始化外設(shè)ADCx的寄存器
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //使能復(fù)位校準(zhǔn)
while(ADC_GetResetCalibrationStatus(ADC1)); //等待復(fù)位校準(zhǔn)結(jié)束
ADC_StartCalibration(ADC1); //開啟AD校準(zhǔn)
while(ADC_GetCalibrationStatus(ADC1)); //等待校準(zhǔn)結(jié)束
}
/*-------------------------------------------------*/
/*函數(shù)名:獲得ADC結(jié)果 */
/*參 數(shù):ch: 通道數(shù) */
/*-------------------------------------------------*/
int Get_Adc(int ch)
{
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采樣時(shí)間為239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的軟件轉(zhuǎn)換啟動(dòng)功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待轉(zhuǎn)換結(jié)束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1規(guī)則組的轉(zhuǎn)換結(jié)果
}
/*-------------------------------------------------*/
/*函數(shù)名:平均多次ADC結(jié)果,提高精度 */
/*參 數(shù):channel: 通道數(shù) */
/*參 數(shù):count: 平均次數(shù) */
/*-------------------------------------------------*/
int Get_Adc_Average(int channel,int count)
{
int sum_val=0;
char t;
for(t=0;t<count;t++) //循環(huán)讀取times次
{
sum_val+=Get_Adc(channel); //計(jì)算總值
Delay_Ms(5); //延時(shí)
}
return sum_val/count; //返回平均值
}
? 2.2 GPIO初始化函數(shù)
本個(gè)例程采用的是PA0讀取DO的狀態(tài),使用#define宏定義
????????2.2.1 gpio.h文章來源:http://www.zghlxwxcb.cn/news/detail-406559.html
#ifndef __GPIO_H
#define __GPIO_H
#define gpio_readA GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) //讀取GPIOA的P0口電平(0/1)
void Gpio_Init(void); //延時(shí)初始化函數(shù)
int Gpio_read(void); //讀取A0口
#endif
2.2.1 gpio.c文章來源地址http://www.zghlxwxcb.cn/news/detail-406559.html
#include "stm32f10x.h"
#include "delay.h"
#include "gpio.h"
#include "usart1.h"
void Gpio_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定義一個(gè)設(shè)置GPIO的變量
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA端口時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //設(shè)置PA0/1
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉輸入,默認(rèn)狀態(tài)是低電平
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入,默認(rèn)狀態(tài)是高電平
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure); //設(shè)置PA
}
int Gpio_read(void)
{
if(gpio_readA == 1)
{
Delay_Ms(100);
return 1;
}
return 0;
}
? 2.3 主函數(shù)
#include "stm32f10x.h" //包含需要的頭文件
#include "main.h" //包含需要的頭文件
#include "delay.h" //包含需要的頭文件
#include "usart1.h" //包含需要的頭文件
#include "adc.h" //包含需要的頭文件
#include "gpio.h" //包含需要的頭文件
int main(void)
{
float raindata; //接受雨滴數(shù)據(jù)
Delay_Init(); //延時(shí)功能初始化
Usart1_Init(9600); //串口1功能初始化,波特率9600
Gpio_Init(); // PA0,讀取數(shù)字?jǐn)?shù)據(jù)
Adc_Init(); //ADC初始化
while(1) //主循環(huán)
{
u1_printf("DO:%d\r\n",Gpio_read());
if(Gpio_read()){
u1_printf("沒有雨水出現(xiàn)!\r\n");
}
else{
u1_printf("有雨水出現(xiàn)!\r\n");
}
raindata = (float)(Get_Adc_Average(5,20))*(3.3/4096);
u1_printf("rain:%.2f\r\n",raindata);
Delay_Ms(1000); //延時(shí)
}
}
到了這里,關(guān)于STM32-土壤濕度傳感器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!