基于STM32的土壤湿度传感器使用

news2024/11/26 16:25:41

基于STM32的土壤湿度传感器使用

最近在学习中用到了ADC数据采集这里使用的硬件模块为土壤湿度传感器,下面为土壤传感器相关的使用方法和代码介绍。

1、土壤湿度传感器实物图

在这里插入图片描述

土壤湿度传感器一共有4个引脚分别为:
GND VCC DO AO,在本次实验中使用的为A0模拟引脚,因此在单片机资源上需要使用到ADC,模数转换,将模拟量进行数字的形式输出。当然也可以直接接DO数字引脚,通过调节模块上的电位器进行数字阈值的改变。

2、代码介绍

在代码部分这里不详细介绍ADC的使用,有需要的可自行去查看相关adc的知识,这里使用的是单片机内部资源ADC2,对于STM32F103C8T6这款单片机来讲内部一共有三个ADC,每个ADC又对于着多个通道的采集,引脚参考如下所示。

在这里插入图片描述

adc.c

#include "delay.h"
#include "sys.h"
#include "adc.h"
//编写ADC2_Init初始化函数//                  
void  ADC2_Init(void)
{      
 ADC_InitTypeDef ADC_InitStructure; 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE );    //使能ADC2通道时钟//   
 RCC_ADCCLKConfig(RCC_PCLK2_Div6);                         //设置ADC时钟//
 ADC_DeInit(ADC2);                                         //复位ADC2,将外设ADC2的全部寄存器重设为缺省值// 
 //ADC2_InitStructure参数设置//
 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                   //独立模式//
 ADC_InitStructure.ADC_ScanConvMode = DISABLE;                        //关闭扫描模式//
 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;                  //单次转换模式//
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  //软件触发启动//
 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;               //数据右对齐//
 ADC_InitStructure.ADC_NbrOfChannel = 1;                              //顺序进行规则转换的ADC通道的数目//
 ADC_Init(ADC2, &ADC_InitStructure);   
 ADC_Cmd(ADC2, ENABLE);                                               //使能指定的ADC2//
 //下面四个函数用于校准//
 ADC_ResetCalibration(ADC2);                                          //使能复位校准//   
 while(ADC_GetResetCalibrationStatus(ADC2));                          //等待复位校准结束//
 ADC_StartCalibration(ADC2);                                          //开启AD校准//
 while(ADC_GetCalibrationStatus(ADC2));                               //等待校准结束//
}   
//编写Get_ADC2函数//
u16 Get_ADC2(u8 ch)   
{
 //设置指定ADC的规则组通道,四个入口参数//
 ADC_RegularChannelConfig(ADC2, ch, 1, ADC_SampleTime_239Cycles5 );        
 ADC_RegularChannelConfig(ADC2, ch, 2, ADC_SampleTime_239Cycles5 );     
 ADC_SoftwareStartConvCmd(ADC2, ENABLE);         //使能指定的ADC2的软件转换启动功能//   
 while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC )); //等待转换结束//
 return ADC_GetConversionValue(ADC2);            //返回最近一次ADC2规则组的转换结果//
} 

adc.h

#ifndef __ADC_H
#define __ADC_H 
#include "stm32f10x.h"
void  ADC2_Init(void);    //ADC3初始化//
u16 Get_ADC2(u8 ch) ;
#endif 

Sensor.c

这里使用了光敏传感器PA4模拟引脚和土壤湿度传感器PA5模拟引脚输入

#include "ldr.h"
#include "delay.h"
//该文件为土壤湿度检测 原理和光敏采集一样//
void Lsens_Soil_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO ,ENABLE);    //使能GPIOF时钟 
 //配置GPIOF参数,引脚4 引脚5,模拟输入//
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;     
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  
 GPIO_Init(GPIOA, &GPIO_InitStructure); 
 ADC2_Init();
}

//范围0-100

u8 Get_ADC_Val(u8 ch)
{
 u32 temp_val=0;
 u8 t;
 for(t=0;t<LSENS_READ_TIMES;t++)       //LSENS_READ_TIMES在lsens.h文件中设好,默认10//
 {
  temp_val+=Get_ADC2(ch); 
  delay_ms(2);
 }
 temp_val/=LSENS_READ_TIMES;           //计算平均值// 
 if(temp_val>4000)temp_val=4000;       //当计算后的值大于4000时,强制转换为4000//
 return (u8)(100-(temp_val/40));       //将temp_val值归一化到0-100之间//
}
/***************************************************************/

Sensor.h

#ifndef __LDR_H
#define __LDR_H 
#include "sys.h" 
#include "adc.h" 
//定义两个常量//
#define LSENS_READ_TIMES 10              //定义光敏传感器读取次数,读10次,然后取平均值//
#define LSENS_ADC_CHX    ADC_Channel_4  //定义光敏传感器所在的ADC通道编号,即0x06//
#define SOIL_ADC_CHX     ADC_Channel_5  //定义土壤湿度传感器
//申明两个函数//    
void Lsens_Soil_Init(void);              //初始化光敏传感器和土壤湿度传感器函数//
u8 Get_ADC_Val(u8 ch);
#endif 

main.c

#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include "ldr.h"

unsigned char ldr = 0;
unsigned char soil_humi = 0;
void Sensor_Task(void)
{
	 ldr = Get_ADC_Val(LSENS_ADC_CHX);
	 soil_humi = Get_ADC_Val(SOIL_ADC_CHX);
	 delay_ms(500);
	 printf("ldr = %d soli_value = %d\r\n",ldr,soil_humi);
}

int main(void)
{
	LED_Init();                   //led初始化
	Init_Usart();                 //串口初始化
	Lsens_Soil_Init();                 //光敏初始化
	while(1)
	{
			Sensor_Task();              //数据采集任务
	}
}

输出结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/724493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

macbook按u键入笔画

mac自带输入法提供了笔画输入快捷方式&#xff0c;键入u会自动变成笔画输入 当遇到不会念的字的时候还是很有用的 横、竖、撇、捺、折、写 上面的拼音首字母对应了比划&#xff0c;非前五个笔画的时候就用 x&#xff08;写&#xff09;替代 比如&#xff1a;彳亍 第一个字输…

php宝塔部署开源NXCRM客户管理系统开源源码

注意&#xff1a;因为微信最近又改了推送机制&#xff0c;经常有朋友说错过了之前的搭建教程文章&#xff0c;每次都要主动搜索才能搜到公众号。所以建议大家加个星标&#xff0c;就能第一时间收到推送。 大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。本期给大…

【UnityDOTS 十三】Cleanup Component

Cleanup Component 前言 一种特殊的组件&#xff0c;当Entity销毁时&#xff0c;要独立移除这个组件。 意味着当你删除一个Entity后&#xff0c;这个组件还存在&#xff0c;那么该Entity也会存在。 主要用于创建Entity时&#xff0c;进行初始化操作&#xff1b;或者销毁时&a…

Base64码转换成图片

一、在浏览器地址栏输入 data:image/png;base64, 生成的base64码 1、示例&#xff1a; data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAg... 2、访问转换结果&#xff1a; 小结&#xff1a; 1、转换支持 png 格式&#xff1a;data:image/png;base64, 生成的b…

分布式监控zabbix的使用(一)

zabbix 一、添加zabbix客户端主机&#xff0c;测试是否能连接服务端和客户端都设置 hosts 解析设置 zabbix 的下载源&#xff0c;安装 zabbix-agent2修改 agent2 配置文件通过键值测试连通性在 Web 页面中添加 agent 主机 二、自定义监控内容在客户端创建自定义key 三、在web页…

Layui表单table渲染+条件查询

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;点击进入专栏 &a…

计算两个经纬度之间的距离

js 代码 function GetDistance( lat1, lng1, lat2, lng2){var radLat1 lat1*Math.PI / 180.0;var radLat2 lat2*Math.PI / 180.0;var a radLat1 - radLat2;var b lng1*Math.PI / 180.0 - lng2*Math.PI / 180.0;var s 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) …

软件安全的重要保障手段之漏洞扫描

漏洞扫描是保障软件安全的一项重要手段&#xff0c;它可以帮助发现软件中存在的安全漏洞&#xff0c;并及时修补这些漏洞&#xff0c;以提高软件的安全性。在当前信息时代&#xff0c;软件安全问题日益凸显&#xff0c;因此选择一个靠谱的软件测评中心进行漏洞扫描非常重要。 …

【裴属定理】Wannafly挑战赛22 A

A-计数器_Wannafly挑战赛22 (nowcoder.com) 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn1e510; const int mxe1e510; const int mod998244353; const int Inf0x3f3f3f3f;int N…

ncnn源码阅读(二)----网络模型结构和权重参数的加载

网络模型结构和权重参数的加载 ncnn推理框架中把模型的结构和权重参数分为两个文件进行存储&#xff0c;实现了结构和权重的分离。在xxx.param中存储了模型的结构信息&#xff0c;在xxx.bin中存储了模型的权重信息。xxx.param的文件结构如下&#xff1a; layer&#xff1a;描…

Python_dir+getattr_获取模块下所有属性对象

目录 dir() 执行结果 执行结果 dir() 该方法不带参数时&#xff0c;以列表类型返回当前范围内的变量名&#xff0c;变量包括常量、方法、类等。 带参数时&#xff0c;以列表类型返回参数的属性、方法的变量名。如果参数包含方法__dir__()&#xff0c;该方法将被调用。如果…

软件测试 |网页frame与多窗口如何处理

简介 当我们要定位一个元素时&#xff0c;怎么都定位不到的时候就要考虑是不是浏览器内嵌里一个 frame 窗口或者要找的元素在新打开的窗口里。这时候就需要将进行 frame 的切换以及窗口的切换。 frame 类似于在原有主 html 的基础上又嵌套一个 html&#xff0c;而且嵌套的 ht…

如何打包arch软件并且打包到arch仓库中(超详细教程)

如何打包arch软件并且打包到arch仓库中(超详细教程) 前提一:注册arch账号 略,官网是:https://archlinux.org/ 前提二:将本地的ssh-key放入arch账号的ssh秘钥中 终端执行 生成ssh秘钥 ssh-keygen cd ~/.ssh cat id_rsa.pub将该段复制到arch账号中ssh中 更新 写PKGBUILD&a…

Spring Boot 中的授权是什么,如何使用

Spring Boot 中的授权是什么&#xff0c;如何使用 在现代 Web 应用程序开发中&#xff0c;授权是一项至关重要的安全措施。授权是指在用户登录后&#xff0c;对用户进行身份验证&#xff0c;并授予用户访问应用程序特定资源的权限。在 Spring Boot 中&#xff0c;授权是通过 S…

集群 第三章

1. keepalived 功能

UE5打包SDK未正确安装的问题

正文 Windows&#xff08;笔者之前用的电脑是windows10&#xff0c;最新电脑使用的是windows11&#xff09;下UE5打包项目的需要安装Visual Studio。 而且安装的时候需要选择上C 游戏开发相关模块。如下图所示&#xff1a; 有时候安装了Visual Studio 之后&#xff0c;还是不能…

使用Stable Diffusion生成艺术二维码

在数字艺术的世界中&#xff0c;二维码已经从单纯的信息承载工具转变为可以展示艺术表达的媒介。这是通过使用Stable Diffusion的技术实现的&#xff0c;它可以将任何二维码转化为独特的艺术作品。接下来&#xff0c;我们将一步步教你如何使用Stable Diffusion生成艺术二维码。…

有私域和无私域的区别?

公域流量和私域流量的区别 (1)渠道区别&#xff1a;私域流量的流量池是个体独有的&#xff0c;而公域流量的流量池是公共的。简单说&#xff0c;私域流量是借助个人平台直接获取用户的渠道&#xff0c;而公域流量是要凭借一个公共的平台&#xff0c;依托平台的流量来获取用户。…