樹莓派實現室內溫度測量與高溫報警

引言

近幾日北方天氣十分炎熱,居家時的室內溫度成了我們關注的重點。因此本文重點說明如何通過樹莓派測量室內溫度並通過蜂鳴器實現高溫報警。

一、本文所需材料

1.1 本文所需的硬件

●DHT11溫溼度傳感器

樹莓派實現室內溫度測量與高溫報警

圖1 DHT11溫溼度傳感器

DHT11溫溼度傳感器包含一個感溼元件、測溫元件和一個高性能單片機,圖1所示的DHT11溫溼度傳感器有三個引腳,左側引腳接高電位,電源為3.3V~5.5V直流電源,中間引腳接GPIO引腳,右側引腳接地,即0V。

●有源蜂鳴器

樹莓派實現室內溫度測量與高溫報警

圖2 有源蜂鳴器

這裡有源蜂鳴器的“源”指的不是電源,而是震盪源,即有源蜂鳴器內部帶有震盪源,只要通直流電即可發聲。與有源蜂鳴器相對的是無源蜂鳴器,由於無源蜂鳴器內部沒有震盪源,需要接收不同頻率的方波才可發聲。

●母對母杜邦線

樹莓派實現室內溫度測量與高溫報警

圖3 母對母對綁線

●樹莓派

樹莓派實現室內溫度測量與高溫報警

圖4 樹莓派

1.2 本文所需的軟件

●Adafruit DHT11庫

i.安裝Git:sudo apt-get installgit-core

ii.從Git下載Adafruit DHT11庫:git clonehttps://github.com/adafruit/Adafruit_Python_DHT.git

iii.進入Adafruit_Python_DHT文件:cd Adafruit_Python_DHT

iv.輸入安裝命令:sudo python3 setup.py install

注:本文還需要python3與RPi.GPIO庫,安裝方法可參見公眾號“樹莓派對rasparty”的《用樹莓派點亮華爾茲》。

二、樹莓派實現方法

2.1 程序代碼

#!/usr/bin/env python
#encoding: utf-8

import Adafruit_DHT
import RPi.GPIO as gpio
import time

gpio.setmode(gpio.BCM)

sensor = Adafruit_DHT.DHT11

pin_sensor = 23
pin_buzzer = 4

gpio.setup(pin_buzzer,gpio.OUT,initial = gpio.HIGH)
gpio.setup(pin_sensor,gpio.IN)

for i in list(range(5)):
humidity, temperature = Adafruit_DHT.read_retry(sensor,pin_sensor)
print("Number: %d" % (i))
if humidity is not None and temperature is not None:
print("Temperature={0:0.1f}*C Humidity={1:0.1f}%".format(temperature,humidity))
if temperature >= 27:
print("Warning! It is too hot!")
gpio.output(pin_buzzer, gpio.LOW)
time.sleep(1)
gpio.output(pin_buzzer, gpio.HIGH)
else:
print("Failed to get reading. Try again!")

gpio.cleanup()

2.2 程序代碼說明

#!/usr/bin/env python
#encoding: utf-8

說明:#!/usr/bin/env python表示調用系統環境變量中Python解釋器,# encoding: utf-8表示採用utf-8的格式對代碼進行編碼。

import Adafruit_DHT
import RPi.GPIO as gpio
import time

說明:使用RPi.GPIO、Adafruit_DHT與time模塊,這三個模塊中包含我們所需要調用的函數。由於RPi.GPIO名稱過長,這裡使用gpio替代。

gpio.setmode(gpio.BCM)

說明:Adafruit_DHT庫默認採用BCM編號,這裡只能使用BCM編號方式,否則使用Adafruit_DHT庫時會出錯。

sensor = Adafruit_DHT.DHT11

說明:指定DHT11所使用的傳感器類型,DHT11中共有三種傳感器,分別是DHT11,DHT22與AM2302,經過測試DHT11類型傳感器的溫度測量單位是攝氏度。

pin_sensor = 23
pin_buzzer = 4

說明:pin_sensor存儲了與DHT11溫溼度傳感器相連的gpio引腳編號,pin_buzzer存儲了與蜂鳴器的引腳編號

gpio.setup(pin_buzzer,gpio.OUT,initial = gpio.HIGH)
gpio.setup(pin_sensor,gpio.IN)

說明:pin_buzzer設置為輸出模式,由於蜂鳴器為低電平觸發,因此初始電壓設置為高電平。pin_sensor設置為輸入模式,用於接收DHT11溫溼度傳感器發出的測量數據。

for i in list(range(5)):
humidity, temperature = Adafruit_DHT.read_retry(sensor,pin_sensor)
print("Number: %d" % (i))
if humidity is not None and temperature is not None:
print("Temperature={0:0.1f}*C Humidity={1:0.1f}%".format(temperature,humidity))
if temperature >= 27:
print("Warning! It is too hot!")
gpio.output(pin_buzzer, gpio.LOW)
time.sleep(1)
gpio.output(pin_buzzer, gpio.HIGH)
else:
print("Failed to get reading. Try again!")

說明:首先分別用humidity與temperature存儲DHT11的測量數據,隨後判斷humidity與temperature是否為空,如果為空則輸出“Failed to get reading. Try again!"”信息;如果不為空,則輸出溫度與溼度的測量數值,同時判斷溫度是否高於27攝氏度,如果高於27攝氏度,則改變蜂鳴器引腳電平,使其鳴叫1秒鐘,隨後停止鳴叫。該過程會重複5次。

gpio.cleanup()

說明:釋放該程序代碼所使用的引腳,並清除引腳編碼規則。


分享到:


相關文章: