课程3:昉·星光开发板温湿度传感器使用
本次课程为昉·星光开发板IoT开发系列课程的第三讲,将带领同学们在昉·星光开发板上,使用SHT3X温湿度传感器。
一、学习目标
- 学习昉·星光开发板上使用SHT3X温湿度传感器,并根据温度设置指示灯不同的颜色。
二、准备工作
在开始本次课程的实际操作之前,同学们需要做好一些准备工作,课程中涉及到的硬件如下:
-
开发板:昉·星光开发板
-
LED:RGB三色灯模块
-
温湿度传感器:SHT3X(i2c)
-
杜邦线:若干
三、Ubuntu系统设备权限设置
在默认情况下,只有root用户可以使用I2C设备。大多数时候,我们希望在普通用户环境下,也能编程控制I2C设备。
在Ubuntu系统中,可以通过设置合适的udev规则,来使得普通用户也可以得到所需的权限。
类似GPIO设备的udev权限设置,I2C设备权限设置如下如下:
# 添加i2c用户组
sudo groupadd -f -r i2c
# 将当前用户添加到i2c组
sudo usermod -a -G i2c $USER
# 设置i2c的udev权限规则
sudo vim /etc/udev/rules.d/99-i2c.rules
KERNEL=="i2c-[0-9]*", GROUP="i2c"
# 重置udev规则使其生效,但对i2c控制器不起作用
# sudo udevadm control --reload-rules
# i2c控制器不能热插播,所以需要重启生效
sudo reboot
# 重启后,查看规则:列出文件的用户和组均为root i2c
ls -lh /dev/i2c*
四、设备连接
本次课程使用的SHT3X为I2C接口的,参考下图,将SHT30X连接到昉·星光开发板的I2C接口,RGB三色灯模块连接到昉·星光开发板的GPIO0、GPIO2、GPIO4:
实物连接如下:
注意:
- SHT3X的SDA、SCL要与开发板的SDA、SCL一一对应
- RGB三色灯模块的RGB对应GPIO0、GPIO2、GPIO4
连接好设备后,我们先使用i2c工具,检测SHT3X是否连接成功了。
# 安装i2c工具
sudo apt install i2c-tools
# 查看系统的i2c控制器
sudo i2cdetect -l
# 查看/dev/i2c-1上挂载的设备
sudo i2cdetect -y -r 1
昉·星光开发板的40Pin上的I2C接口,对应于系统设备中的i2c-1。
SHT3X连接正确时,上图中第二条命令中,就会显示出来44(十六进制值),表示检测到了。否则不会显示,此时应检查连线是否正确。
五、程序编写
本次程序的基本逻辑如下:
- 读取温湿度数据
- 根据温湿度数据,计算是否舒适,然后控制三色灯
- 舒适:绿色
- 超过舒适区:红色
- 低于舒适区:黄色
在网上查找到一段关于不适指数的计算公式,可供对舒适度进行参考:
不适指数 = 0.81 * 温度 + 0.01 * 湿度 * ( 0.99 x 温度 - 14.3 ) + 46.3 = 80.387
根据这个公示,舒适区取值为70~80。
然后,编写如下的程序:
# -*- coding: utf-8 -*-
# file: ~/projects/sht3x/sht3x_test.py
import time
import gpio as GPIO
from sensirion_i2c_driver import I2cConnection
from sensirion_i2c_sht.sht3x import Sht3xI2cDevice
from sensirion_i2c_driver.linux_i2c_transceiver import LinuxI2cTransceiver
# 设置三色灯连接的GPIO接口
LED_RED = 448
LED_GREEN = 450
LED_BLUE = 452
# 设置对应GPIO均为输出模式
GPIO.setup(LED_RED, GPIO.OUT)
GPIO.setup(LED_GREEN, GPIO.OUT)
GPIO.setup(LED_BLUE, GPIO.OUT)
# 打开SHT3X设备
i2c_transceivervice = LinuxI2cTransceiver('/dev/i2c-1')
sht3x = Sht3xI2cDevice(I2cConnection(i2c_transceivervice))
while True:
# 读取温湿度值
temperature, humidity = sht3x.single_shot_measurement()
# 计算不适指数
value = 0.81 * temperature.degrees_celsius + 0.01 * humidity.percent_rh * ( 0.99 * temperature.degrees_celsius - 14.3 ) + 46.3
# 清除指示灯
GPIO.output(LED_RED, GPIO.LOW)
GPIO.output(LED_GREEN, GPIO.LOW)
GPIO.output(LED_BLUE, GPIO.LOW)
# 根据指数,点亮不同的灯
if value>80:
# 超过舒适区
GPIO.output(LED_RED, GPIO.HIGH)
elif value<70:
# 低于舒适区
GPIO.output(LED_BLUE, GPIO.HIGH)
else:
# 处于舒适区
GPIO.output(LED_GREEN, GPIO.HIGH)
# 打印当前数据的数据和计算结果
print("{:0.2f} °C , {:0.2f} %RH, {:0.1f}".format(
temperature.degrees_celsius,
humidity.percent_rh, value))
time.sleep(1.0)
在上述代码中,使用到了之前安装的gpio模块,以及专门操作sht系列温湿度的sensirion-i2c-sht模块,使用如下指令进行安装:
pip install pip install sensirion-i2c-sht
然后,运行 sht30_test.py ,即可读取温湿度值并显示对应的指示灯了
python3 sht30_test.py
实际输出和显示结果如下:
六、总结
在本次课程中,我们学习了SHT3X温湿度传感器数据的读取,并根据读取的数据计算是否处于舒适区,以便显示对应的指示灯。
虽然只是一个实例,但是已经和实际生活相关联了。
本次课程中,使用的python-i2c-sht模块,其详细的使用信息,可以查看网址:Sensirion/python-i2c-sht: Python driver for Sensirion temperature and humidity sensors with I²C interface (github.com)
七、课后作业
- 了解SHT3X的知识,已经I2C相关的知识
- 进一步了解RGB三色灯的使用,根据温湿度值,进行三色搭配呈现,以便显示更丰富的舒适区范围。