天天看點

一起玩轉樹莓派(13)——雨滴檢測傳感器

在本系列的前幾篇部落格中,我們有進行過溫度傳感器和光強傳感器的實驗。通過這些傳感器,加上簡單的程式設計技術,我們很容易擷取這些環境資料。通過各種豐富的傳感器,用樹莓派可以非常容易的打造一款”簡易氣象站“。對于一個小型的氣象站來說,除了需要收集溫度和光照強度資料外,目前的天氣狀況也是必不可少的。本篇部落格,我們将通過雨滴檢測傳感器實驗來擷取雨勢資訊。

一、雨滴檢測傳感器

   本次實驗使用的雨滴檢測傳感器子產品如下圖所示:

一起玩轉樹莓派(13)——雨滴檢測傳感器

可以看到,此元件組由一個檢測闆和控制子產品組成,兩部分分開連接配接,便于将檢測闆放置到合适的檢測位置,且檢測闆面積大,易于進行雨滴檢測。

此傳感器子產品工作電路圖如下所示:

一起玩轉樹莓派(13)——雨滴檢測傳感器

在使用時,先将檢測闆的兩個引腳與子產品的隻有兩個引腳一側的引腳相連(可以将檢測闆了解為兩根不想交的導線,有雨水落下時,導線會聯通)。

   觀察控制子產品,可以看到其上封裝了兩個LED,其中一個LED是電源訓示燈,當接通電源後會發光,另一個LED是信号燈,沒有雨水的時候信号燈不亮,檢測闆上有雨水的時候信号燈亮。在檢測是否下雨時,可以将檢測闆傾斜放置,有雨水流過即可改變電平信号的輸出。控制子產品中還自帶一個調節電阻,調節此電阻可以設定傳感器的靈敏度。控制子產品的另一側有4個引腳,分别為AO,DO,GND和VCC。其中,AO為模拟信号輸出,可以通過這個引腳輸出的信号來判斷雨量的大小。DO引腳為數字信号輸出,可以用這個引腳輸出的信号判斷檢測闆上是否有雨水,沒有水滴時此引腳輸出高電平,有水滴時此引腳輸出低電平。

二、實驗連線與編碼

   本次實驗,我們将使用GPIO引腳直接擷取雨滴檢測子產品的數字信号,并通過PCF8591來讀取雨滴檢測子產品的模拟信号。首先,連線如下:

PCF8591與樹莓派連接配接:

PCF8591 樹莓派

SDA SDA

SCL SCL

VCC 5V電源

GND GND

雨滴檢測子產品:

雨滴檢測子產品 樹莓派 PCF8591

VCC 5V  

GND GND  

AO   AIN0

DO GPIO17(BCM編碼)  

完成了基礎的連線,我們就可以開始編碼工作了。關于PCF8591的使用,我們之前的部落格有過詳細的介紹,但是如果每次使用到數模轉換時,都編寫一遍PCF8591的控制代碼會非常的麻煩,而且這也不是我們要核心關注的功能點,對于本實驗來說,我們更多需要關注的是如何處理雨滴檢測子產品的資料,而不是DA轉換相關邏輯,是以我們可以編寫一套通用的PCF8591驅動代碼,之後再使用到有模拟信号輸出的元件時,直接使用此驅動即可。

   需要注意,要使用PCF8591,不要忘記打開樹莓派的I2C接口,接線完成後,使用如下指令可以檢視裝置位址:

sudo i2cdetect -y 1

完整代碼如下:

#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):

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):

temp = val

temp = int(temp)

# 進行寫資料操作

bus.write_byte_data(address, 0x40, temp)

實作水滴檢測的代碼如下:

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)

在樹莓派上運作上面程式,即可檢測水滴情況。

繼續閱讀