树莓派资料
显示屏资料
系统下载
树莓派Pico
首页 动态 发帖 版块 我的
 退出
游客  
等级:
金币:
经验值:

树莓派雨滴传感器模块教程

  5466 
 0
 2
RASPI   RASPI 

Image

一:传感器介绍:

 在雨滴系统中,用雨滴传感器检测降雨量,并转换控制器检测到的信号。然后根据这些信号自动设置雨刮器的时间隔,以方便地控制雨刮器的电机。在智能照明系统中,自动检测驾驶环境并调整照明模式,提高恶劣环境下的行车安全。在智能天窗系统中,检测是否下雨,如果检测到雨滴就自动关闭天窗。

  有两根金属线彼此靠近,但不会在雨水检测板上交叉。当雨水落在电路板上时,两根金属线会导通。因此两根金属线之间会有电压。

  控制板上有两个指示灯,电源指示灯PWR-LED和输出信号指示灯DO-LED。电源指示灯在通电后常亮,没有雨的时候出信号指示灯不亮;雨滴上去,候出信号指示灯亮。雨滴板和控制板是分开的,方便将线引出,大面积的雨滴板,更有利于检测到雨水。

  控制板上有两个输出,数字输出DO,模拟输出AO。接上5V电源电源灯亮,感应板上没有水滴时,DO输出为高电平,滴上一滴水,DO输出为低电平,刷掉上面的水滴,又恢复到输出高电平状态,灵敏度可以通过蓝色的可变电阻调节。

  AO模拟输出,连接到PCF8591的模拟输入AIN0口,通过比对模拟值转化为的数字值大小,可以检测滴在上面的雨量大小,雨水越大,电阻值越小,模拟值转化为的数字值越小。数字值的范围当然是0~255, 不同的值对应是降雨量的多少毫米,则需要实体测量,雨滴板的放置方式不同结果都不同。

雨滴传感器电路原理图

Image

一:硬件连接:

第1步接线:将雨滴传感器DO开关量引脚连接到树莓派GPIO.0(BCM17), AO模拟量引脚接在PCF8591模块AIN0端口。如下图

Image

Image

第2步开启I2C:PCF8591模块采用的是I2C(IIC)总线进行通信的,但是在树莓派的镜像中默认是关闭的,在使用该传感器的时候,我们必须首先允许IIC总线通信。

Image

查看I2C设备地址输入下面命令,我们当前I2C的地址为48

sudo i2cdetect -y 1

Image

第3步开始编程:完成了基础的连线,我们就可以开始编码工作了。关于PCF8591的使用,我们之前的教程有过详细的介绍,但是如果每次使用到数模转换时,都编写一遍PCF8591的控制代码会非常的麻烦,而且这也不是我们要核心关注的功能点,对于本实验来说,我们更多需要关注的是如何处理雨滴检测模块的数据,而不是DA转换相关逻辑,因此我们可以编写一套通用的PCF8591驱动代码,之后再使用到有模拟信号输出的元件时,直接使用此驱动即可。点此查看关于PCF8591模块使用教程

#coding:utf-8
import smbus   #在程序中导入“smbus”模块
# /dev/i2c-1
bus = smbus.SMBus(1)  #创建一个smbus实例

# 初始化驱动模块 定义PCF元件地址
def init(addr):
	global address
	address = addr

# 读取某个通道的数据
def read(chn):
	global address
	if chn == 0:
		#发送一个控制字节到设备 表示要读取AIN0通道的数据
		bus.write_byte(address,0x40)   
	if chn == 1:
		#发送一个控制字节到设备 表示要读取AIN1通道的数据
		bus.write_byte(address,0x41)
	if chn == 2:
		#发送一个控制字节到设备 表示要读取AIN2通道的数据
		bus.write_byte(address,0x42)
	if chn == 3:
		#发送一个控制字节到设备 表示要读取AIN3通道的数据
		bus.write_byte(address,0x43)
	bus.read_byte(address)         # 空读一次,消费掉无效数据
	return bus.read_byte(address)  # 返回某通道输入的模拟值A/D转换后的数字值

def write(val):
	global address
	temp = val
	temp = int(temp) 
	# 进行写数据操作
	bus.write_byte_data(address, 0x40, temp) 


实现水滴检测的代码如下:

#coding:utf-8
import pcf8591 as PCF
import RPi.GPIO as GPIO
import time

DO = 11
# 设置使用的引脚编码模式
GPIO.setmode(GPIO.BOARD)
GPIO.setup(DO, GPIO.IN)
PCF.init(0x48)
while True:
	print('------------分割线-------------')
	rainDO = GPIO.input(DO)
	print('是否检测到水滴:%s'%('否' if rainDO else '是'))
	# 读取AIN0的模拟数据
	rainAO = PCF.read(0) 
	print('雨水程度%d'%(255 - rainAO))
	time.sleep(2)

在树莓派上运行上面程序,即可检测水滴情况。


标签:
作者签名: raspi.cc   楼主  2025-03-24 16:26:15
回复列表
Powered by RASPI _VERSION
© 2017-2025 树莓派极客版权
您的IP: 18.216.224.194 , 2025-04-03 14:58:00
Powered by RASPI _VERSION
© 2017-2025 树莓派极客版权