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()