引言
近几日北方天气十分炎热,居家时的室内温度成了我们关注的重点。因此本文重点说明如何通过树莓派测量室内温度并通过蜂鸣器实现高温报警。
一、本文所需材料
1.1 本文所需的硬件
●DHT11温湿度传感器
DHT11温湿度传感器包含一个感湿元件、测温元件和一个高性能单片机,图1所示的DHT11温湿度传感器有三个引脚,左侧引脚接高电位,电源为3.3V~5.5V直流电源,中间引脚接GPIO引脚,右侧引脚接地,即0V。
●有源蜂鸣器
这里有源蜂鸣器的“源”指的不是电源,而是震荡源,即有源蜂鸣器内部带有震荡源,只要通直流电即可发声。与有源蜂鸣器相对的是无源蜂鸣器,由于无源蜂鸣器内部没有震荡源,需要接收不同频率的方波才可发声。
●母对母杜邦线
●树莓派
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()
说明:释放该程序代码所使用的引脚,并清除引脚编码规则。
ps:笔者自己也是树莓派爱好者,会在公众号“树莓派对rasparty”中持续更新树莓派相关的文章,欢迎关注交流!