雨滴传感器详解(STM32)

目录

一、介绍

二、传感器原理

1.原理图

2.引脚描述

三、程序设计

main文件

rain.h文件

rain.c文件

四、实验效果

五、资料获取

项目分享


一、介绍

雨滴传感器是一个利用湿度方式检测有无水分的传感器,可用于天气状况的监测,可以检测有没有下雨。将传感器放置在室外,当有雨水滴到检测面上时,湿度将增大,随之电压升高,并转成数字信号DO和模拟信号AO输出。除了检测雨水外,雾水和水蒸气也都能检测。

以下是雨滴传感器的参数:

|------|---------------------------|
| 名称 | 雨滴传感器 |
| 工作电压 | DC 3.3~5V |
| 比较器 | LM393 |
| 工作电流 | 15mA |
| 输出方式 | AO/DO |
| 尺寸 | 大:5.0*4.0cm 小:3.2*1.4cm |

哔哩哔哩视频链接:

雨滴传感器(AD/DO STM32)

(资料分享见文末)

二、传感器原理

1.原理图

输出端:感应板上没有水滴时,DO输出为高电平,开关指示灯灭;有水滴时DO输出低电平,开关指示灯亮。AO模拟输出,可以连接单片机的AO口检测滴在上面的雨量大小

小板的尺寸是3.2cm*1.4cm,电位器可以调节灵敏度。

2.引脚描述

|------|--------------|
| 引脚名称 | 描述 |
| VCC | 接电源正极(3~5V) |
| GND | 接电源负极 |
| DO | TTL开关信号输出 |
| AO | 模拟信号输出 |

三、程序设计

1.使用STM32F103C8T6读取雨滴传感器采集的数据,通过OLED上显示

|----------|------|
| AO | PA0 |
| DO | PA1 |
| OLED_SCL | PB11 |
| OLED_SDA | PB10 |

main文件

cpp 复制代码
#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "rain.h"
#include "adcx.h"

/*****************辰哥单片机设计******************
											STM32
 * 项目			:	雨滴传感器实验                     
 * 版本			: V1.0
 * 日期			: 2025.1.28
 * MCU			:	STM32F103C8T6
 * 接口			:	参看rain.h							
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥 

**********************BEGIN***********************/

u16 value;
u8 buff[30];//参数显示缓存数组

int main(void)
{ 
	
  SystemInit();//配置系统时钟为72M	
	delay_init(72);
	LED_Init();
	LED_On();
	RAIN_Init();
	USART1_Config();//串口初始化
	
	OLED_Init();
	printf("Start \n");
	delay_ms(1000);
	
	OLED_Clear();
	//显示"雨量:"
	OLED_ShowChinese(0,0,0,16,1);
	OLED_ShowChinese(16,0,1,16,1);
	OLED_ShowChar(32,0,':',16,1);
	
	

  while (1)
  {
		LED_Toggle();
		value = RAIN_GetData();  
		
		printf("雨量: %d\r\n",value);
		OLED_ShowNum(80,0,value,1,16,1);
		

		delay_ms(200);

  }
	
}

rain.h文件

cpp 复制代码
#ifndef __RAIN_H
#define	__RAIN_H
#include "stm32f10x.h"
#include "adcx.h"
#include "delay.h"
#include "math.h"

/*****************辰哥单片机设计******************
											STM32
 * 文件			:	雨滴传感器h文件                   
 * 版本			: V1.0
 * 日期			: 2025.1.28
 * MCU			:	STM32F103C8T6
 * 接口			:	见代码							
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥

**********************BEGIN***********************/

#define RAIN_READ_TIMES	10  //雨滴传感器ADC循环读取次数

//模式选择	
//模拟AO:	1
//数字DO:	0
#define	MODE 	0

/***************根据自己需求更改****************/
// RAIN GPIO宏定义
#if MODE
#define		RAIN_AO_GPIO_CLK								RCC_APB2Periph_GPIOA
#define 	RAIN_AO_GPIO_PORT								GPIOA
#define 	RAIN_AO_GPIO_PIN								GPIO_Pin_0
#define   ADC_CHANNEL               			ADC_Channel_0	// ADC 通道宏定义

#else
#define		RAIN_DO_GPIO_CLK								RCC_APB2Periph_GPIOA
#define 	RAIN_DO_GPIO_PORT								GPIOA
#define 	RAIN_DO_GPIO_PIN								GPIO_Pin_1			

#endif
/*********************END**********************/


void RAIN_Init(void);
uint16_t RAIN_GetData(void);

#endif /* __RAIN_H */

rain.c文件

cpp 复制代码
#include "rain.h"

/*****************辰哥单片机设计******************
											STM32
 * 文件			:	雨滴传感器c文件                   
 * 版本			: V1.0
 * 日期			: 2025.1.28
 * MCU			:	STM32F103C8T6
 * 接口			:	见代码							
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥

**********************BEGIN***********************/

void RAIN_Init(void)
{
	#if MODE
	{
		GPIO_InitTypeDef GPIO_InitStructure;
		
		RCC_APB2PeriphClockCmd (RAIN_AO_GPIO_CLK, ENABLE );	// 打开 ADC IO端口时钟
		GPIO_InitStructure.GPIO_Pin = RAIN_AO_GPIO_PIN;					// 配置 ADC IO 引脚模式
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		// 设置为模拟输入
		
		GPIO_Init(RAIN_AO_GPIO_PORT, &GPIO_InitStructure);				// 初始化 ADC IO

		ADCx_Init();
	}
	#else
	{
		GPIO_InitTypeDef GPIO_InitStructure;
		
		RCC_APB2PeriphClockCmd (RAIN_DO_GPIO_CLK, ENABLE );	// 打开连接 传感器DO 的单片机引脚端口时钟
		GPIO_InitStructure.GPIO_Pin = RAIN_DO_GPIO_PIN;			// 配置连接 传感器DO 的单片机引脚模式
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;			// 设置为上拉输入
		
		GPIO_Init(RAIN_DO_GPIO_PORT, &GPIO_InitStructure);				// 初始化 
		
	}
	#endif
	
}

#if MODE
uint16_t RAIN_ADC_Read(void)
{
	//设置指定ADC的规则组通道,采样时间
	return ADC_GetValue(ADC_CHANNEL, ADC_SampleTime_55Cycles5);
}
#endif

uint16_t RAIN_GetData(void)
{
	
	#if MODE
	uint32_t  tempData = 0;
	for (uint8_t i = 0; i < RAIN_READ_TIMES; i++)
	{
		tempData += RAIN_ADC_Read();
		delay_ms(5);
	}

	tempData /= RAIN_READ_TIMES;
	return 4095-tempData;
	
	#else
	uint16_t tempData;
	tempData = !GPIO_ReadInputDataBit(RAIN_DO_GPIO_PORT, RAIN_DO_GPIO_PIN);
	return tempData;
	#endif
}

四、实验效果

五、资料获取

项目分享

相关推荐
DevOpenClub16 小时前
职教高考及高职分类招生控制线 API 接口
java·数据库·高考
funnycoffee12316 小时前
华为S5736交换机3层ECMP负载方式
linux·服务器·数据库
添砖java‘’16 小时前
MySQL复合查询
数据库·mysql
星川水月16 小时前
Access数据库快速入门——外部数据导入和SQL简单查询
数据库·sql·access
清平乐的技术专栏16 小时前
一文读懂Kafka中的“消费”(对标MySQL数据库)
数据库·mysql·kafka
i220818 Faiz Ul16 小时前
智慧养老平台|基于SprinBoot+vue的智慧养老平台系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·毕设·智慧养老平台
IT策士16 小时前
Django 从 0 到 1 打造完整电商平台:登录与登出功能实现
数据库·django·sqlite
程序边界16 小时前
标量子查询消除与向量化:一个被低估的协同效应
数据库
zero.cyx17 小时前
软件设计师(4)数据库
数据库
.小小陈.17 小时前
MySQL 高频考点:表连接与索引全解析
数据库