昉·星光系列课程3:昉·星光开发板温湿度传感器使用

课程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

Uploading: 4.i2c设备.png…

昉·星光开发板的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三色灯的使用,根据温湿度值,进行三色搭配呈现,以便显示更丰富的舒适区范围。

八、参考资料

2 Likes