HaaS轻应用(Python): si7006温湿度传感器案例

1、概述

si7006是一个SILICON LABS生产的温湿度传感器, 具有低功耗,高精度的温湿度检测,它是工厂校准,I2C接口的数字芯片。可检测温度-10~85°C (误差+1°C), 湿度 0~90% RH(误差5%RH)。

HaaS EDU K1物联网教育开发板已经集成了这款芯片, 用于温湿度检测的演练。

AliOS Things 3.3系统提供了Python轻应用框架,其包括对底层设备驱动的封装,开发者可以利用python轻松实现对底层设备的编程。

下面演示如何通过简短的python代码实现对I2C设备si7006的编程。

 

2、硬件环境

HaaS EDU K1中自带si7006传感器,相关购买链接如下:
HaaS EDU K1购买链接

 

3、软件环境

下载和烧录Python轻应用的最新的EDK固件。参考 HaaS EDU K1 Python轻应用固件下载

 

4、SI7006驱动代码

利用python控制外设的前提是需要把外设的相关信息,提供给python轻应用框架。  我们提供了board.json配置文件,用来描述板子的配置信息。
HaaS EDU K1开发板的board.json 中si7006的配置片段如下, 里面包含这款芯片的I2C的关键配置包括I2C port, devAddr等。

  "si7006": {

      "type": "I2C",

      "port": 1,

      "addrWidth": 7,

      "freq": 400000,

      "mode": "master",

      "devAddr": 64

    },

  

si7006的主要实现代码模块在si7006.py。 AliOS Things 3.3的python轻应用框架,提供driver的模块,实现对底层设备驱动的封装, 要想操作底层设备需要导入这个模块。

si7006芯片是I2C接口的,所以主要依赖driver模块中的I2C class提供的方法。 如果你操作的设备也是I2C接口的,可以参考本示例如下代码。

# -*- coding: UTF-8 -*-


"""
The driver for Si7006 chip, it is a temperature and humidity sensor.
"""


from driver import I2C
from utime import sleep_ms



# The register address in Si7006 controller.
Si7006_MEAS_REL_HUMIDITY_MASTER_MODE    = 0xE5
Si7006_MEAS_REL_HUMIDITY_NO_MASTER_MODE = 0xF5
Si7006_MEAS_TEMP_MASTER_MODE            = 0xE3
Si7006_MEAS_TEMP_NO_MASTER_MODE         = 0xF3
Si7006_READ_OLD_TEMP                    = 0xE0
Si7006_RESET                            = 0xFE
Si7006_READ_ID_LOW_0                    = 0xFA
Si7006_READ_ID_LOW_1                    = 0x0F
Si7006_READ_ID_HIGH_0                   = 0xFC
Si7006_READ_ID_HIGH_1                   = 0xC9
Si7006_READ_Firmware_Revision_0         = 0x84
Si7006_READ_Firmware_Revision_1         = 0xB8


class SI7006Error(Exception):
    def __init__(self, value=0, msg="si7006 common error"):
        self.value = value
        self.msg = msg


    def __str__(self):
        return "Error code:%d, Error message: %s" % (self.value, str(self.msg))

    __repr__ = __str__


class SI7006(object):

    """
    This class implements SI7006 chip's functions.
    """

    def __init__(self):
        self.i2cDev = None



    def open(self, devid):
        self.i2cDev = I2C()
        self.i2cDev.open(devid)



    def getVer(self):

        """
        Get the firmware version of the chip.
        """



        reg = bytearray([Si7006_READ_Firmware_Revision_0, Si7006_READ_Firmware_Revision_1])
        self.i2cDev.write(reg)
        sleep_ms(30)
        version = bytearray(1)
        self.i2cDev.read(version)
        return version[0]



    def getID(self):

        """Get the chip ID."""

        reg = bytearray([Si7006_READ_ID_LOW_0, Si7006_READ_ID_LOW_1])

        self.i2cDev.write(reg)

        sleep_ms(30)

        id_buf_low = bytearray(4)

        self.i2cDev.read(id_buf_low)



        reg = bytearray([Si7006_READ_ID_HIGH_0, Si7006_READ_ID_HIGH_1])

        id_buf_high = bytearray(4)

        self.i2cDev.read(id_buf_high)



        return id_buf_low + id_buf_high



    def getTemperature(self):

        """Get temperature."""



        reg = bytearray([Si7006_MEAS_TEMP_NO_MASTER_MODE])

        self.i2cDev.write(reg)

        sleep_ms(30)

        readData = bytearray(2)

        self.i2cDev.read(readData)

        value = (readData[0] << 8 | readData[1])



        if (value & 0xFFFC):

            temperature = (175.72 * value) / 65536.0 - 46.85

            return temperature

        else:

            raise SI7006Error("failed to get temperature.")





    def getHumidity(self):

        """Get humidity."""



        reg = bytearray([Si7006_MEAS_REL_HUMIDITY_NO_MASTER_MODE])

        self.i2cDev.write(reg)

        sleep_ms(30)

        readData = bytearray(2)

        self.i2cDev.read(readData)

        value = (readData[0] << 8) | readData[1]



        if (value & 0xFFFE):

            humidity = (125.0 * value) / 65535.0 - 6.0

            return humidity

        else:

            raise SI7006Error("failed to get humidity.")



    def getTempHumidity(self):

        """Get temperature and humidity."""



        temphumidity = [0, 0]

        temphumidity[0] = self.getTemperature()

        temphumidity[1] = self.getHumidity()

        return temphumidity



    def close(self):

        self.i2cDev.close()

以上是Python轻应用对于SI7006传感器的封装,默认已经集成到了Python轻应用的固件当中,通过以下命令导入到Python 轻应用中使用

from si7006 import SI7006

 

5、Python 轻应用测试代码

"""

Testing si7006 python driver



The below i2c configuration is needed in your board.json.

"si7006": {

  "type": "I2C",

  "port": 1,

  "addrWidth": 7,

  "freq": 400000,

  "mode": "master",

  "devAddr": 64

}

"""



from si7006 import SI7006


print("Testing si7006 ...")
si7006Dev = SI7006()
si7006Dev.open("si7006")
version = si7006Dev.getVer()
print("si7006 version is: %d" % version)


chipID = si7006Dev.getID()
print("si7006 chip id is:", chipID)


temperature = si7006Dev.getTemperature()
print("The temperature is: %f" % temperature)


humidity = si7006Dev.getHumidity()
print("The humidity is: %f" % humidity)


si7006Dev.close()


print("Test si7006 success!")

 

演示过程

 

测试结果

(ash:/data)# python /data/python-apps/driver/i2c/test_si7006.py


Testing si7006 ...

si7006 version is: 32

si7006 chip id is:_space_bytearray(b'\x00\x00?\xeb\xe1\xf0\xbe"')

The temperature is: 53.182993

The humidity is: 17.785000

Test si7006 success!

free python heap mm

测试结果是53°C, 湿度约为17.8%,注意测试使用的HaaS EDU K1物联网教育开发板只是教学用的,不是产品。所以它的温湿度传感器是完全封闭在板子上的,测试结果显示的是板子的温湿度,而不是环境中的温湿度。

 

6、总结

使用Python轻应用框架开发控制一个I2C设备, 只需要很简短的代码就可以实现,而且还可以利用Python语言的简洁和丰富的组件库的能力,省去传统嵌入式开发中编译,烧录等繁琐的步骤,大大缩短产品开发周期,快来一试吧。

 

技术交流

Python轻应用继承了Python易学易用的特点,同时提供了基于嵌入式硬件的基础库封装,让开发者可以很方便的通过交互式的环境,实时进行嵌入式开发,让嵌入式开发也变得简单方便。

如需更多技术支持,可加入钉钉开发者群,享受一对一的技术支持。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值