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 轻应用中使用
-
"" "
-
-
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易学易用的特点,同时提供了基于嵌入式硬件的基础库封装,让开发者可以很方便的通过交互式的环境,实时进行嵌入式开发,让嵌入式开发也变得简单方便。
如需更多技术支持,可加入钉钉开发者群,享受一对一的技术支持。