课程导入

温湿度监测的运用非常广泛,比如天气预报,我们每天都会关注天气的温度,尤其是季节变换的时候,根据气温的变化及时添衣、减衣;智慧农业,种植农作物的人会时刻关注农作物的生长环境,最基本的就是监测农作物生长环境的温度是否适宜,土壤的湿度是否足够;医疗,最常见的就是体温计,当病人体感不适,我们需要用温度计来测量病人的体温等等。本节课,我们就来制作一个智能温湿度计,用以监测周围的温度和湿度。

知识锦囊

温湿度传感器

温湿度传感器顾名思义,就是可以检测环境中温度和湿度的传感器,温湿度传感器的种类较多,其中最常用的就是 DHT 系列的,该类传感器可自动校准,并且是数字输出,传感器包括一个电容式传感器元件可测量相对湿度,以及一个 NTC 热敏电阻可测量温度。在本课程中,我们最初选择了 DHT11 温湿度传感器,但由于DHT11 已经停产并升级到 DHT20,所以您拿到的可能是DHT20型号的温湿度传感器,DHT20采用I2C总线输出,精度更高,测量范围更大,两者的区别请参考以下链接:https://www.seeedstudio.com/blog/2021/05/25/introducing-dht20-temperature-and-humidity-sensor-and-comparing-it-with-dht11/

第10课 温湿度监测 - 图1企业微信截图_16232068743453.png
注意:如果您拿到的模块为DHT20,请参考思维拓展内容。

逻辑运算符

在前面的课程中,我们已经学习并使用了常用的运算符,如比较运算符,算术运算符,以及逻辑运算符中的 “and” ,也就是布尔“与”。先来回顾一下这些常用的逻辑运算符:

运算符 逻辑表达式 描述
and x and y 布尔”与” - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。
or x or y 布尔”或” - 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值。
not not x 布尔”非” - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。

本节课,我们将使用新的逻辑运算符 “or”, 布尔“或”,示例如下:

  1. if x or y :
  2. print "变量 x 和 y 都为 true,或其中一个变量为 true"
  3. else:
  4. print "变量 x 和 y 都不为 true"

以上实例输出结果为“变量 a 和 b 都为 true,或其中一个变量为 true”。我们要用布尔“或”来判断环境中的温度或者湿度是否在适宜的范围,只要其中一项未达标则发出警报声。

实践操作

项目一:LCD 屏显示温湿度值

本项目我们将使用 Pico 扩展板连接温湿度传感器和 LCD 屏模块,将温湿度传感器获取到的温度和湿度数值显示在 LCD 屏幕上。

硬件连接

首先我们要用 LCD 屏显示温湿度的数值。在该项目中,我们所需要使用的硬件有:

  • 树莓派 Pico
  • 树莓派 Pico 拓展板
  • Grove - 温湿度传感器
  • Grove - 16 x 2 LCD 显示屏

插接好 Pico 和拓展板,使用 Grove 数据线将 LCD 显示屏连接到 I2C1 接口,将温湿度传感器连接到D18接口。
页面_13.png

编写程序

该项目我们除了要用到已经保存到 Pico 中的第三方函数库 lcd1602 ,还要用到一个新的库dht11.py,用上节课同样的方式下载好库文件并保存在 Pico 中。完成之后,我们就可以开始引入需要使用的函数库了。

  1. from lcd1602 import LCD1602
  2. from dht11 import *
  3. from machine import I2C,Pin,ADC
  4. from utime import sleep

回顾上节课我们如何给 I2C 引脚进行定义,I2C 引脚需要分别定义 SCL 和 SDA 两条数据线,并且标注好数据类型,行数和每一行的字符数,再加上温湿度传感器的引脚设定。

i2c = I2C(1,scl=Pin(7), sda=Pin(6), freq=400000)
d = LCD1602(i2c, 2, 16)
d.display()
dht = DHT(18)

接下来我们需要读取温湿度传感器检测到的数值并分别保存在变量 “temp” 以及 “humid” 中:

 temp,humid = dht.readTempHumid()

最后,将读取到的数值显示在 LCD 显示屏上,因为有温度和湿度两个数值,所以需要在屏幕上同时显示温度和湿度的名称以区别,呈现效果如:
Temp:25
Humid:40
“Temp” 和 “Humid” 的字符可以直接显示在LCD显示屏上,而 “temp” 和 “humid” 读取的数值则不能直接显示在 LCD 显示屏上,需要用 str() 函数将其转化为字符串类型函数。这里还需要注意,温度和湿度显示在不同行,需要设置坐标位置,如下所示:

d.setCursor(0,0)
d.print("Temp:"+str(temp))
d.setCursor(0,1)
d.print("Humid:"+str(humid))

完整程序如下:

from lcd1602 import LCD1602
from dht11 import *
from machine import I2C,Pin,ADC
from utime import sleep

i2c = I2C(1,scl=Pin(7), sda=Pin(6), freq=400000)
d = LCD1602(i2c, 2, 16)
d.display()
dht = DHT(18)

while True:
    temp,humid = dht.readTempHumid()#temp:  humid:
    sleep(1)
    d.clear()
    d.setCursor(0,0)
    d.print("Temp:"+str(temp))
    d.setCursor(0,1)
    d.print("Humid:"+str(humid))
    sleep(1)

image.png
使用 USB 数据线将 Pico 连接到电脑,点击运行按钮将程序保存到任意位置,你就能看到程序的实际运行效果。
IMG_9668-1.png

项目二:加入警报功能

在项目一中,我们实现了让 LCD 屏显示温度和湿度,还可以加入蜂鸣器,实现监测及警报功能。

硬件连接

在该项目中,我们加入了蜂鸣器 Grove - 无源蜂鸣器 作为报警装置,将蜂鸣器连接到D16接口。
页面_14.png

编写程序

在项目一的基础上,我们只需要加入判断温度和湿度的代码以及蜂鸣器发出警报声的代码即可,需要用到逻辑运算符。逻辑运算符可以将两个或多个简单的语句串联起来,形成更为复杂的语句,我们常在各类条件判断语句中使用它们,这里要用到的是or,布尔“或”。当温度 temp 大于30或者湿度 humid 小于30时,蜂鸣器发出警报声,否则蜂鸣器不发声,通过”if…..else….”条件判断语句即可。还记得如何使蜂鸣器发声吗?使用 freq() 函数和 duty_u16() 函数来定义音调与音量,关闭蜂鸣器则是 buzzer.duty_u16(0)。

if temp >30 or humid <30:
    buzzer.freq(1000)
    buzzer.duty_u16(1000)
else:
    buzzer.duty_u16(0)#close

完整程序如下:

from lcd1602 import LCD1602
from dht11 import *
from machine import I2C,Pin,ADC,PWM
from utime import sleep

i2c = I2C(1,scl=Pin(7), sda=Pin(6), freq=400000)
d = LCD1602(i2c, 2, 16)
d.display()
dht2 = DHT(18)
buzzer = PWM(Pin(16))

while True:
    temp,humid = dht2.readTempHumid()#temp:  humid:
    sleep(1)
    d.clear()
    d.setCursor(0,0)
    d.print("Temp:"+str(temp))
    d.setCursor(0,1)
    d.print("Humid:"+str(humid))
    sleep(1)

    if temp >30 or humid <30:
        buzzer.freq(1000)
        buzzer.duty_u16(1000)
    else:
        buzzer.duty_u16(0)#close

image.png
加入报警功能.MOV
image.png
使用 USB 数据线将 Pico 连接到电脑,点击运行按钮将程序保存到任意位置,我们可以用手掌握住温湿度传感器,你会看到 LCD 显示屏上温度和湿度数值的变化,试试看蜂鸣器会发出警报声吗?

思维拓展

模块图.png

DHT20温湿度传感器
DHT20温湿度传感器相比DHT11来说,在供电电压、温湿度测量范围、精度、输出信号都有明显的优化,是一款低功耗、高精度、高稳定性的产品,具有完全校准的数字I2C接口,它与DH11在使用上最大的区别也在于此,在引脚的定义上略有不同,下载dht20.py库,并使用DHT20检测环境中的温度和湿度,将数值打印到交互区。在dht20.py库中,我们可以使用dht20_temperature()以及dht20_humidity()函数分别读取温湿度传感器返回的温度和湿度值,如下所示。

from machine import I2C
from dht20 import DHT20
i2c = I2C(0)
dht20 = DHT20(i2c)
while True:
    temper = dht20.dht20_temperature()
    humidity = dht20.dht20_humidity()
    print("temper : " + str(temper))
    print("humidity : " + str(humidity))

在交互区,可以看到DHT20温湿度传感器检测到的温度和湿度数值。
image.png
接下来,请尝试完成项目一和项目二的程序,完整代码参考:
项目一:LCD 屏显示温湿度值
image.png
项目二:加入警报功能
image.png