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

可以看到,此元件組由一個檢測闆和控制子產品組成,兩部分分開連接配接,便于将檢測闆放置到合适的檢測位置,且檢測闆面積大,易于進行雨滴檢測。
此傳感器子產品工作電路圖如下所示:
在使用時,先将檢測闆的兩個引腳與子產品的隻有兩個引腳一側的引腳相連(可以将檢測闆了解為兩根不想交的導線,有雨水落下時,導線會聯通)。
觀察控制子產品,可以看到其上封裝了兩個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)
在樹莓派上運作上面程式,即可檢測水滴情況。