STM32-土壤湿度传感器

2023-10-27

目录

0 说明

1 传感器介绍

 2 代码说明

  2.1 ADC初始化函数(adc.c)

  2.2 GPIO初始化函数

  2.3 主函数


0 说明

        本篇文章主要是说明怎么使用STM32单片机读取土壤湿度传感器采集到的数据,包括模拟和数字数据,并且附带着STM32所需要的全部代码,所使用的土壤湿度传感器如下图所示。

附:使用单片机STM32f103系列

1 传感器介绍

        该传感器具有数字开关量输出(0和1)和模拟量AO电压输出两种输出形式。     

        接上5V电源,电源灯亮,当湿度低于设定的阈值时,DO输出为高电平,开关指示灯灭;高于设定的阈值时,DO输出为低电平,开关指示灯亮。AO模拟输出,可以连接单片机的AD口检测土壤湿度精确数值。

        电位器是用于土壤湿度的阀值调节,顺时针调节,控制的湿度会越大,逆时针越小,通过电位器调节土壤湿度阈值,当土壤湿度低于设定的阈值时,模块输出高电平,高于设定的阈值时,模块输出低电平。

2 代码说明

代码主要包括主函数(main.c)、ADC初始化函数(adc.c)、GPIO初始化函数

   2.1 ADC初始化函数(adc.c)

ADC的初始化都差不多,需要注意的是ADC的采集函数

这里采用ADC1通道的PA5进行采集AO的信息

#include "stm32f10x.h"    //包含需要的头文件
#include "delay.h"	      //包含需要的头文件
 
 
/*函数名:初始化ADC */									   
void Adc_Init(void)
{    
	GPIO_InitTypeDef      GPIO_InitStructure;                             //定义一个设置GPIO的变量
	ADC_InitTypeDef       ADC_InitStructure;                              //定义一个设置ADC的变量
 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );	              //使能GPIOA通道时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );	              //使能ADC1通道时钟
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);                                      //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;        //准备设置PA5
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		                   //模拟输入引脚
	GPIO_Init(GPIOA, &GPIO_InitStructure);                                 //设置PA5
    	
	ADC_DeInit(ADC1);                                                      //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
 
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	                   //ADC工作模式:ADC1和ADC2工作在独立模式
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;	                       //模数转换工作在单通道模式
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;	                   //模数转换工作在单次转换模式
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	   //转换由软件而不是外部触发启动
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	               //ADC数据右对齐
	ADC_InitStructure.ADC_NbrOfChannel = 1;	                               //顺序进行规则转换的ADC通道的数目
	ADC_Init(ADC1, &ADC_InitStructure);                                    //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   
 
	ADC_Cmd(ADC1, ENABLE);	                                               //使能指定的ADC1	
	ADC_ResetCalibration(ADC1);	                                           //使能复位校准  	 
	while(ADC_GetResetCalibrationStatus(ADC1));                     	   //等待复位校准结束	
	ADC_StartCalibration(ADC1);	                                           //开启AD校准
	while(ADC_GetCalibrationStatus(ADC1));	                               //等待校准结束
}
 
/*-------------------------------------------------*/
/*函数名:获得ADC结果                              */
/*参  数:ch: 通道数                               */
/*-------------------------------------------------*/	
int Get_Adc(int ch)   
{	
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC通道,采样时间为239.5周期	  			    
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		                        //使能指定的ADC1的软件转换启动功能	
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));                     //等待转换结束
	return ADC_GetConversionValue(ADC1);	                            //返回最近一次ADC1规则组的转换结果
}
/*-------------------------------------------------*/
/*函数名:平均多次ADC结果,提高精度                */
/*参  数:channel: 通道数                               */
/*参  数:count: 平均次数                          */
/*-------------------------------------------------*/	
int Get_Adc_Average(int channel,int count)
{
	int sum_val=0;
	char t;
	
	for(t=0;t<count;t++)             //循环读取times次
	{
		sum_val+=Get_Adc(channel);       //计算总值
		Delay_Ms(5);                 //延时
	}
	return sum_val/count;           //返回平均值
} 

  2.2 GPIO初始化函数

本个例程采用的是PA0读取DO的状态,使用#define宏定义

        2.2.1 gpio.h

#ifndef __GPIO_H
#define __GPIO_H 
 
#define gpio_readA  GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)  //读取GPIOA的P0口电平(0/1)
 
void Gpio_Init(void);         //延时初始化函数
int Gpio_read(void);        //读取A0口
 
#endif

2.2.1 gpio.c

#include "stm32f10x.h"
#include "delay.h"
#include "gpio.h"
#include "usart1.h"
 
void Gpio_Init(void)
{    	 
	GPIO_InitTypeDef GPIO_InitStructure;                     //定义一个设置GPIO的变量
	
	
 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);   //使能GPIOA端口时钟
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;       //设置PA0/1
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;   		   //下拉输入,默认状态是低电平
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   		   //上拉输入,默认状态是高电平 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    //浮空输入
 GPIO_Init(GPIOA, &GPIO_InitStructure);            		 //设置PA
	
}
 
int Gpio_read(void)
{
	if(gpio_readA == 1)
	{ 
		Delay_Ms(100);
		return 1;
	}
	return 0;
}

  2.3 主函数

 
#include "stm32f10x.h"  //包含需要的头文件
#include "main.h"       //包含需要的头文件
#include "delay.h"      //包含需要的头文件
#include "usart1.h"     //包含需要的头文件
#include "adc.h"        //包含需要的头文件
#include "gpio.h"       //包含需要的头文件
 
int main(void) 
{
	float raindata;         //接受雨滴数据
		
	Delay_Init();           //延时功能初始化              
	Usart1_Init(9600);      //串口1功能初始化,波特率9600
	Gpio_Init();            // PA0,读取数字数据
	Adc_Init();             //ADC初始化
	
	while(1)                //主循环
	{		
		u1_printf("DO:%d\r\n",Gpio_read());
		if(Gpio_read()){
			u1_printf("没有雨水出现!\r\n");
		}
		else{
			u1_printf("有雨水出现!\r\n");
		}
		raindata = (float)(Get_Adc_Average(5,20))*(3.3/4096);
		u1_printf("rain:%.2f\r\n",raindata);
		Delay_Ms(1000);                                                   //延时
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32-土壤湿度传感器 的相关文章

  • lol数据英雄联盟接口LOL接口电竞api开发比分网分享@

    英雄联盟数据LOL接口电竞api开发比分网分享 TOC 数据来自marz数据alan marzesport com 各大赛区的lol数据都有 1 获取赛事 接口 host1 api series 9870 示例 赛事相关接口 begin a
  • Vmware虚拟机网络模式原理及配置详解

    概述 VMware为我们提供了三种网络工作模式 它们分别是 bridged 桥接模式 host only 仅主机模式 nat 网络地址转换模式 打开VMware Workstation 我们可以在选项栏的 编辑 下的 虚拟网络编辑器 中看到
  • 915. 分割数组-动态规划算法

    915 分割数组 动态规划算法 给定一个数组 nums 将其划分为两个连续子数组 left 和 right 使得 left 中的每个元素都小于或等于 right 中的每个元素 left 和 right 都是非空的 left 的长度要尽可能小

随机推荐

  • 跨境做独立站,如何低成本引流?你的流量密码在这

    大家都知道 海外的消费习惯与国内不同 独立站一向是海外消费者的最喜欢的购物方式之一 这也吸引了许多跨境商家开设独立站 独立站不同于其他的第三方平台 其他平台可以靠平台自身流量来获得转化 而独立站本身没有流量 需要卖家从各大社媒平台进行自主引
  • 史上最牛独立开发者:花20美元狂赚100万美元

    Joe Kaufman 是一个名副其实的独立开发者 只有一个同伴 他一人处理所有的设计 美术 动画 尽管如此 他的游戏还是获得了巨大成功 Grisly Manor 恐怖庄园的秘密 的下载量已达400万 Lost City 失落之城 的也已经
  • 如何统计Visual Studio Code项目的代码行数

    背景 年底到了 公司一年一度做述职报告的时间又到了 每到此时小伙伴们都想方设法的去做一些代码层面的汇总 在此交给大家个小妙招 走过路过不要错过哈 解决方案 使用Visual Studio Code自带的在文件中查找功能中的正则表达式实现代码
  • Android新手入门 FAQ

    Q 什么是Android A Android一词的本义指 机器人 同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称 该平台由操作系统 中间件 用户界面和应用软件组成 号称是首个为移动终端打造的真正开
  • Openstack Qos

    Openstack network qos 1 配置QOS 此处网络为provider网络 无self server网络 无L3 只有控制节点和计算节点 控制节点上 vim etc neutron neutron conf service
  • 立体匹配 -- PSM-Net 网络模型代码剖析

    只熟悉流程跑通代码不重要 重要的是理解网络的思想 GC Net提出了3D CNN编解码的形式做 cost volum 后处理的过程 PSM Net 加入图像金字塔的模块结合3D CNN 输出图像视差图 一 特征提取模块 作者用 3层 33的
  • 2023华为OD机试真题【组装数组】

    题目描述 给你一个整数M和数组N N中的元素为连续整数 要求根据N中的元素组装成新的数组R 组装规则 1 R中元素总和加起来等于M 2 R中的元素可以从N中重复选取 3 R中的元素最多只能有1个不在N中 且比N中的数字都要小 不能为负数 输
  • SpringBoot实现原理

    一 什么是SpringBoot SpringBoot是一个快速开发框架 快速的将一些常用的第三方依赖整合 原理 通过Maven子父工程的方式 简化XML配置 全部采用注解形式 内置Http服务器 Jetty和Tomcat 最终以java应用
  • 二叉树实现按层 s型打印

    题目阐释 s型打印 重要的是将binary tree 逐层遍历 获取每层的node 思路 将树的遍历转化为 压栈出栈 每次将列表内的node全部出栈 获取子元素 然后全部再入栈 如此反复迭代 应用 当树有层次信息时候 可以如此操作 代码如下
  • 【Spring源码】Spring流程

    1 初始化AnnotationBeanDefinitionReader 2 初始化ClassPathBeanDefinitionScanner 3 执行register 注册配置类 4 执行refresh 先初始化比如BeanFactory
  • 在校园网中配置路由器的lan口上网

    使用的是mercury路由器 在配置路由器的时候可以先按重置按钮 几秒之后路由器就重新启动了 在连接的时候可以首先进行登陆 melogin cn 或者 192 168 1 1 不同的路由器可能会有所不同 设置好登陆密码和无线密码之后可以重新
  • E - Dist Max 2(二分)

    E Dist Max 2https vjudge csgrandeur cn problem AtCoder abc215 f AC代码 include
  • jQuery:hasClass() 方法检查被选元素是否包含指定的 class;after()在某元素之后插入新元素

    Html代码1 div class PL20 style display div
  • layui 表格中实现照片预览,点击查看原图

    人员表格中实现照片预览 并且可点击放大 查看原图 table class layui hide table js 定义列 var cols type radio width 60 type numbers width 50 field or
  • Python练习-求两个给定正整数的最大公约数和最小公倍数

    题目描述 求两个给定正整数的最大公约数和最小公倍数 题目要求 输入格式 输入在两行中分别输入正整数x和y 输出格式 在一行中输出最大公约数和最小公倍数的值 例如 输入100 1520 输出20 7600 题目解析 1 几个整数中公有的约数
  • Canal快速入门

    Canal 一 Canal 入门 1 1 什么是 Canal 阿里巴巴 B2B 公司 因为业务的特性 卖家主要集中在国内 买家主要集中在国外 所以衍生出了同步杭州和美国异地机房的需求 从 2010 年开始 阿里系公司开始逐步的尝试基于数据库
  • kettle处理大数据量表-分页抽取数据

    概述 总job 分三步 第一 先清空目标表 第二 根据源表总的数据行 结合服务器配置 kettle每次能抽取插入多少行 算出需要分n次抽取 并生成1到n的序列值列表 ps 生成1 2 3 n 的数据列 然后把每个值赋值给变量var page
  • 5.吴恩达机器学习作业-支持向量机

    1 SVM原理 SVM算法的本质就是最大化离超平面最近点 支持向量 到该平面的距离 如图所示 以二分类为例 转化为数学问题就是 m a x w b
  • c++学习之类模板

    类模板的语法 建立一个通用类 类中的成员数据类型可以不具体指定 用一个虚拟的类型来代表 语法 template 示例 include
  • STM32-土壤湿度传感器

    目录 0 说明 1 传感器介绍 2 代码说明 2 1 ADC初始化函数 adc c 2 2 GPIO初始化函数 2 3 主函数 0 说明 本篇文章主要是说明怎么使用STM32单片机读取土壤湿度传感器采集到的数据 包括模拟和数字数据 并且附带