5.8 温湿度传感器

BlueFi上有关检测温度和湿度的传感器一共有两种,一种是集成式的温湿度传感器,位于BlueFi的背面,用来检测环境的温湿度,另一种是检测CPU温度的温度传感器, 位于BlueFi内部。本节中,我们了解如何编程使用它们。

5.8.1 CPU温度检测

BlueFi使用的是低功耗的32位处理器,主时钟速度仅仅64MHz,与仅仅是桌面计算机CPU速度的2~5%,所以工作电流极小,处理一般性的I/O控制事物, BlueFi的主CPU几乎不发热,或者更准确地说其发热量小于环境对其散热量。使用下面的示例程序,我们能够得到主CPU内部的温度:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import time
import microcontroller
from hiibot_bluefi.screen import Screen
screen = Screen()
mcu = microcontroller.cpu
show_data = screen.simple_text_display(title="BlueFi Main CPU", title_scale=1, text_scale=2)
while True:
    show_data[2].text = "Frequency: {}MHz".format(mcu.frequency/1000000)
    show_data[2].color = screen.RED
    show_data[3].text = "Voltage: {:.2f}".format(mcu.voltage)
    show_data[3].color = screen.YELLOW
    show_data[4].text = "Temperature: {:.2f}".format(mcu.temperature)
    show_data[4].color = screen.GREEN
    show_data.show()
    time.sleep(0.1)

将上示例程序保存到BlueFi的/CIRCUITPY/code.py,BlueFi将实时地显示主CPU的时钟频率、工作电压、芯片温度。

下面是程序分析:

  • 第1行,导入一个Python内建的模块“time”。
  • 第2行,导入一个Python内建的模块“microcontroller”。
  • 第3行,从“/CIRCUITPY/lib/hiibot_bluefi/screen.py”模块中导入一个名叫“Screen”的类。
  • 第4行,将导入的“Screen”类实例化为一个实体对象,名叫“screen”。
  • 第5行,定义一个名叫“mcu”类变量代表microcontroller模块的cpu子类。
  • 第6行,定义一个名叫“show_data”的Screen类的多行文本显示子类,设置文本显示的标题为“BlueFi Gyroscope”,标题字体放大1倍,文本字体放大2倍。
  • 第7行,一个无穷循环的程序块。
  • 第8行,(无穷循环程序块的第1行),设置多行文本显示子类的第2行的文本内容为mcu.frequency/1000000的值 (主时钟频率)。
  • 第9行,(无穷循环程序块的第2行),设置多行文本显示子类的第2行的文本颜色为红色。
  • 第10行,(无穷循环程序块的第3行),设置多行文本显示子类的第3行的文本内容为mcu.voltage的值 (工作电压)。
  • 第11行,(无穷循环程序块的第4行),设置多行文本显示子类的第3行的文本颜色为绿色。
  • 第12行,(无穷循环程序块的第5行),设置多行文本显示子类的第4行的文本内容为mcu.temperature的值 (芯片温度)。
  • 第13行,(无穷循环程序块的第6行),设置多行文本显示子类的第4行的文本颜色为蓝色。
  • 第14行,(无穷循环程序块的第7行),更新多行文本显示。
  • 第15行,(无穷循环程序块的第8行),执行time的sleep方法。

当BlueFi的主CPU工作任务非常繁重时,消耗的电流也会增加,芯片温度也会随之增加。我们使用microcontroller模块的cpu子类能够获取主CPU的温度, 当CPU温度超过某个设定阈值时,我们可以给出警示。

5.8.2 环境温度检测

我们可以使用BlueFi背面的环境温湿度传感器监测环境温度,当环境温度超过设定阈值时给予报警或其他处理。 示例程序如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import time
from hiibot_bluefi.sensors import Sensors
from hiibot_bluefi.screen import Screen
from hiibot_bluefi.soundio import SoundOut
spk = SoundOut()
spk.enable = 1
screen = Screen()
sensors = Sensors()
temp = sensors.temperature
maxTemp = 38
warning = False
show_data = screen.simple_text_display(title="Temp monitor", title_scale=1, text_scale=3)
while True:
    temp = sensors.temperature
    show_data[2].text = "T: {:.2f}".format(temp)
    if temp<maxTemp:
        show_data[2].color = screen.GREEN
        warning = False
    else:
        show_data[2].color = screen.RED
        warning = True
    show_data.show()
    if warning:
        spk.play_midi(72, 8)
    time.sleep(0.2)

本示例程序的具体细节不再详细赘述,设法改变BlueFi的温度传感器附近的温度,譬如靠近燃烧的火柴或打火机,温度上升至设定阈值(示例程序中设定为38度)后, 你看到多行文本显示的温度变成红色,且伴有急促的声音警示。

实际应用的警报器的声音提示是可以关闭的,就像闹钟响起后,我们被闹钟叫醒后第一件事就是关闭闹钟的声音提示, 当我们发现温度监视器的警示音响起后,也会先关闭警示音再处理温度超高。你能修改程序实现:当温度超过设定阈值时,将温度显示为红色, 并响起警报,如果按下A按钮则关闭声音警报,直到下次温度再次从低温到高温变化且超过设定阈值时警示音才会再次响起。

5.8.3 环境湿度检测

人体对环境湿度的要求并不高,很多人不仅能适应我国北方的干燥环境,也能适应南方的潮湿环境。今天的我们已经掌握改变局部环境湿度的方法, 譬如加湿器、抽湿机或空调机等都可以改变局部环境的湿度。所有能改变环境湿度的设备或仪器都需要测量环境湿度, 环境湿度的度量常常使用“相对湿度”,记为RH。为什么不使用绝对湿度呢?相对湿度是如何定义?

相对湿度定义为,湿空气中所含水蒸气的质量与同温度和气压下饱和空气中所含水蒸气的质量之比。从定义上看,相对湿度是一个比值, 有效取值范围为0.0~1.0,人类对0~100范围的整数的大小最为敏感,所以我们用百分数来表示相对湿度。如某室内环境的相对湿度为70%。

据实验测定,最宜人的室内温湿度是:冬天温度为20至25℃,相对湿度为30%至80%;夏天温度为23至30℃,相对湿度为30%至60%。 95%以上的人对这样的温度和相对湿度环境感觉为舒适。

相对湿度的定义看起来似乎有点复杂,如何测量环境的相对湿度呢?依然是借助BlueFi背面的环境温湿度传感器, 能够直接给出环境相对湿度值,精度为+/-2%RH。我们修改5.8.2小节的示例程序,实现一个湿度监视器功能。示例代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import time
from hiibot_bluefi.sensors import Sensors
from hiibot_bluefi.screen import Screen
from hiibot_bluefi.soundio import SoundOut
spk = SoundOut()
spk.enable = 1
screen = Screen()
sensors = Sensors()
hum = sensors.humidity
minHum = 30
maxHum = 70
warning = False
show_data = screen.simple_text_display(title="Humi. monitor", title_scale=1, text_scale=3)
while True:
    hum = sensors.humidity
    show_data[2].text = "H: {:.2f}".format(hum)
    if hum>minHum and hum<maxHum:
        show_data[2].color = screen.GREEN
        warning = False
    else:
        show_data[2].color = screen.RED
        warning = True
    show_data.show()
    if warning:
        spk.play_midi(72, 8)
    time.sleep(0.2)

试着改变BlueFi湿度传感器附近环境的相对湿度, 譬如使用加湿器或者对着湿度传感器哈气,你会发现相对湿度传感器的数值会快速变化。

5.8.4 环境温湿度监视器

到目前为止,我们已经完全掌握环境温度和相对湿度的测量,利用已经掌握的这些知识,我们来设计一个完整的环境温湿度监视器,实现目标: 当温度大于设定阈值时,或相对湿度小于设定舒适湿度阈值最小值时,或相对湿度大于设定舒适湿度阈值最大值时,响起警报, 并使用红色字体指示超过设定范围的温度或湿度,在响警报声期间,允许我们按下A按钮关闭警报声,直到下次再报警时才会再次响起。

脚本程序代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import time
from hiibot_bluefi.sensors import Sensors
from hiibot_bluefi.screen import Screen
from hiibot_bluefi.soundio import SoundOut
from hiibot_bluefi.basedio import Button
button = Button()
spk = SoundOut()
spk.enable = 1
screen = Screen()
sensors = Sensors()
temp = sensors.temperature
hum = sensors.humidity
minHum = 30
maxHum = 50
maxTemp = 38
hwarning = False
twarning = False
offspk = False
show_data = screen.simple_text_display(title="T&H Monitor", title_scale=1, text_scale=3)
while True:
    temp = sensors.temperature
    hum = sensors.humidity
    show_data[1].text = "T: {:.2f}".format(temp)
    if temp<maxTemp:
        show_data[1].color = screen.GREEN
        twarning = False
    else:
        show_data[1].color = screen.RED
        twarning = True
    show_data[2].text = "H: {:.2f}".format(hum)
    if hum>minHum and hum<maxHum:
        show_data[2].color = screen.GREEN
        hwarning = False
    else:
        show_data[2].color = screen.RED
        hwarning = True
    show_data.show()
    if button.A:
        offspk = True
    if temp<maxTemp and hum>minHum and hum<maxHum:
        offspk = False
    if hwarning or twarning:
        if offspk:
            time.sleep(0.1)
        else:
            spk.play_midi(72, 8)
    time.sleep(0.2)

虽然看起来这个程序很长,为了更好理解这个示例程序的细节代码功能,建议你将代码保存到BlueFi的/CIRCUITPY/code.py文件中, 当BlueFi执行示例程序期间,尝试改变BlueFi湿度传感器附近的环境温度或湿度,触发警报, 当警报声响起后你可以按下A按钮观察是否可以消除报警声。

示例的逻辑功能在前2个小节中已经提到,实现相同或相似功能的脚本代码没有惟一的写法,本示例程序仅供参考。