2289|3

1万

帖子

25

TA的资源

版主

楼主
 

MicroPython的HTS221驱动移植 [复制链接]

 

HTS221的MicroPython驱动,其实几年前就做过(https://bbs.eeworld.com.cn/thread-488307-1-1.html),但是现在看当时的程序写得不太好,通用性也不够好,因此借这次活动得机会重新修改了驱动程序,使用更加方便了。

 

# HTS221 Humidity and temperature micropython drive
# ver: 2.0
# License: MIT
# Author: shaoziyang (shaoziyang@micropython.org.cn)
# v1.0 2016.4
# v2.0 2019.7

from machine import I2C

HTS_I2C_ADDR = const(0x5F)

class HTS221(object):
    def __init__(self, i2c):
        self.i2c = i2c
        # data buffer
        self.tb = bytearray(1)
        self.rb = bytearray(1)
        self.irq_v = [0, 0]
        # HTS221 Temp Calibration registers
        self.T0_OUT = self.int16(self.get2reg(0x3C))
        self.T1_OUT = self.int16(self.get2reg(0x3E))
        t = self.getreg(0x35) % 16
        self.T0_degC = self.getreg(0x32) + (t%4) * 256
        self.T1_degC = self.getreg(0x33) + (t//4) * 256
        # HTS221 Humi Calibration registers
        self.H0_OUT = self.int16(self.get2reg(0x36))
        self.H1_OUT = self.int16(self.get2reg(0x3A))
        self.H0_rH = self.getreg(0x30) * 5
        self.H1_rH = self.getreg(0x31) * 5
        self.K1 = (self.T1_degC - self.T0_degC) / (self.T1_OUT - self.T0_OUT)
        self.K2 = (self.H1_rH - self.H0_rH) / (self.H1_OUT - self.H0_OUT)
        # set av conf: T=4 H=8
        self.setreg(0x10, 0x81)
        # set CTRL_REG1: PD=1 BDU=1 ODR=1
        self.setreg(0x20, 0x85)
   
    def int16(self, d):
        return d if d < 0x8000 else d - 0x10000

    def setreg(self, reg, dat):
        self.tb[0] = dat
        self.i2c.writeto_mem(HTS_I2C_ADDR, reg, self.tb)

    def getreg(self, reg):
        self.i2c.readfrom_mem_into(HTS_I2C_ADDR, reg, self.rb)
        return self.rb[0]
   
    def get2reg(self, reg):
        return self.getreg(reg) + self.getreg(reg+1) * 256

    # calculate Temperature
    def temperature(self):
        try:
            return (self.T0_degC + (self.int16(self.get2reg(0x2A)) - self.T0_OUT) * self.K1)/8
        except MemoryError:
            print('##')
            return self.temperature_irq()

    # calculate Humidity
    def humidity(self):
        try:
            return (self.H0_rH + (self.int16(self.get2reg(0x28)) - self.H0_OUT) * self.K2)/10
        except MemoryError:
            print('##')
            return self.humidity_irq()

    def get(self):
        try:
            return self.temperature(), self.humidity()
        except MemoryError:
            print('##')
            return self.get_irq()

    def temperature_irq(self):
        return (self.T0_degC + (self.int16(self.get2reg(0x2A)) - self.T0_OUT) * (self.T1_degC - self.T0_degC) // (self.T1_OUT - self.T0_OUT)) >> 3

    def humidity_irq(self):
        return (self.H0_rH + (self.int16(self.get2reg(0x28)) - self.H0_OUT) * (self.H1_rH - self.H0_rH) // (self.H1_OUT - self.H0_OUT))//10

    def get_irq(self):
        self.irq_v[0] = self.temperature_irq()
        self.irq_v[1] = self.humidity_irq()
        return self.irq_v




此内容由EEWORLD论坛网友dcexpert原创,如需转载或用于商业用途需征得作者同意并注明出处

点赞 关注(1)
 
 

回复
举报

1万

帖子

25

TA的资源

版主

沙发
 

使用方法:

from machine import I2C
import HTS221

i2c = I2C(1)
hts = HTS221.HTS221(i2c)
hts.get()

 

回调函数(中断)里的使用方法:

from machine import I2C
import HTS221
from pyb import Timer

i2c = I2C(1)
hts = HTS221.HTS221(i2c)

def tim_irq(t):
    print(hts.get_irq())

tim = Timer(1, freq = 1)
tim.callback(tim_irq)

 

 
 
 

回复

1万

帖子

25

TA的资源

版主

板凳
 

驱动改进说明

本帖最后由 dcexpert 于 2019-7-15 09:35 编辑

新的驱动主要改进有:

  • 使用machine库,具有更好的通用性
  • 增加了get()函数,一次获取温度和湿度数据
  • 改用writeto_mem()/readfrom_mem_into()方法设置和读取寄存器,可以在中断里调用
  • 增加temperature_irq()/humidity_irq()/get_irq()函数,方便再中断里调用
  • 优化了代码效率

因为在MicroPython中,回调函数中不允许在heap中分配内存,因此不能进行浮点运算。为了让驱动兼容回调函数,特别设置了temperature_irq()/humidity_irq()/get_irq()函数,这样驱动就可以在回调函数中使用了。不过为了避免内存分配问题,将浮点计算改为了整数计算,这样的代价就是回调函数中的数据精度会降低。

 

 

点评

如果希望在回调函数中有更高的精度,可以将self.T0_OUT、self.T0_OUT等数据乘以10的N次方,这样返回数据就会同样扩大,最后将结果除以10的N次方就可以得到更好的精度。不过需要注意N不能太大,避免进行超大整数计算  详情 回复 发表于 2019-7-15 09:41
 
 
 

回复

1万

帖子

25

TA的资源

版主

4
 
dcexpert 发表于 2019-7-15 09:26 新的驱动主要改进有: 使用machine库,具有更好的通用性 增加了get()函数,一次获取温度和湿度数据 ...

如果希望在回调函数中有更高的精度,可以将self.T0_OUT、self.T0_OUT等数据乘以10的N次方,这样返回数据就会同样扩大,最后将结果除以10的N次方就可以得到更好的精度。不过需要注意N不能太大,避免进行超大整数计算,这样也会造成内存分配错误。

 

此外HTS221本身也是使用插值计算的,因此传感器原始精度就不算特别高,因此增加太多的小数位意义也并不大,不如多次采样,使用过采样法提高精度。

 

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表