雨滴传感器详解(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
}

四、实验效果

五、资料获取

项目分享

相关推荐
数智化管理手记8 小时前
主数据重复、错漏频发?一站式主数据管理平台如何落地?
大数据·运维·数据库·人工智能·数据挖掘
吴声子夜歌9 小时前
MongoDB 4.2——选择片键
数据库·mongodb
天天进步一点点9 小时前
QSqlQuery删除sqlite数据库执行drop数据表报错database table is locked unable to fetch row问题
数据库·oracle·sqlite
音视频工程实战9 小时前
PromptQL 新手入门与实战指南
数据库·sql·算法
清川渡水10 小时前
NL2SQL 的正确打开方式:从「AI 猜 SQL」到「置信度闭环」的工程化落地
数据库·人工智能·sql
TDengine (老段)10 小时前
TDengine Go 与 Rust 连接器 — 高性能异步访问
大数据·数据库·物联网·golang·rust·时序数据库·tdengine
东方佑10 小时前
MA-RMSNorm:打破“缩放换智能”的魔咒,大模型归一化的一次范式革命!
数据库·人工智能·计算机视觉
云和恩墨11 小时前
「云帆计划·长沙站」活动成功举办,云和恩墨与紫薇垣和湖南金悦科技分别签约并授牌,本地伙伴生态建设加速
数据库·科技
千维百策66611 小时前
如何管理错误预算:提升服务可靠性与 SLO 达成率的实践经验
服务器·网络·数据库
Y38153266213 小时前
2026 年 7 月,SERP API 调用的稳定性实战:超时、重试、降级
开发语言·数据库·人工智能·php