Python轻应用实现传感器数据采集¶
前言¶
本实验将向大家介绍如何使用Python语言在HaaS EDK K1上读取温湿度信息。
硬件环境¶
HaaS EDK K1一台,内置SI7006温湿度传感器。
涉及知识点¶
1、IIC通信原理¶
IIC总线是一种最早由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。 它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。 基于Python轻应用采集I2C端口数据不需要关注I2C总线传输信号细节。
2、SI7006传感器简介¶
SI7006 是Silicon Lab公司推出的一款相对湿度及温度传感器,其结合了工厂校准湿度和温度传感器元件、模拟-数字转换器,信号处理和一个I2C主机接口。 使用业界标准低K电介质聚合物提供了出色的精度和长期稳定性,同时具有低漂移和低滞后。同时其创新的CMOS设计还使其具备很低的功耗。
特征:
相对湿度传感器:±5%RH(最大)@ 0-80%RH的
温度传感器:±1.0℃的精确度(最大)@ -10至+ 85°C
可达-40至+125°C的工作范围
工作电压范围宽(1.9〜3.6V)
低功耗:2.2μW平均功率为3.3V和每秒1个样本
I2C主机接口
片上集成加热器
采用3mm x 3mm QFN封装
卓越的长期稳定性
支持工厂校准
在回流和运行寿命的保护
代码实现¶
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | # -*- 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):
def __init__(self):
self.i2cDev = None
def open(self, devid):
self.i2cDev = I2C()
self.i2cDev.open(devid)
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()
|