Python轻应用实战系列【1】:传感器数据采集

Python轻应用
连云、控端、AI、多媒体、UI
回复
yong.jy
帖子: 8
注册时间: 2021年 3月 26日 15:55

Python轻应用实战系列【1】:传感器数据采集

#1

帖子 yong.jy » 2021年 5月 20日 20:33

前言

本实验将向大家介绍如何使用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-90%RH
    温度传感器:±1.0℃的精确度(最大)@ -10至+ 85°C
    可达-40至+125°C的工作范围
    工作电压范围宽(1.9〜3.6V)
    低功耗:2.2μW平均功率为3.3V和每秒1个样本
    I2C主机接口
    片上集成加热器
    采用3mm x 3mm QFN封装
    卓越的长期稳定性
    支持工厂校准
    在回流和运行寿命的保护

代码实现 

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

结尾

关于Python轻应用的更多资料,请参考《Python轻应用手册》。

欢迎加入Python轻应用钉钉群,探讨更多技术问题。

图片

 
 
 
 

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章