打印
[应用相关]

(转)MicroPython的HTS221驱动移植

[复制链接]
375|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2021-3-10 09:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

HTS221的MicroPython驱动,其实几年前就做过(http://bbs.**/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


使用特权

评论回复
沙发
一刀一级| | 2021-3-10 10:27 | 只看该作者
新的驱动主要改进有:
使用machine库,具有更好的通用性
增加了get()函数,一次获取温度和湿度数据
改用writeto_mem()/readfrom_mem_into()方法设置和读取寄存器,可以在中断里调用
增加temperature_irq()/humidity_irq()/get_irq()函数,方便再中断里调用
优化了代码效率
因为在MicroPython中,回调函数中不允许在heap中分配内存,因此不能进行浮点运算。为了让驱动兼容回调函数,特别设置了temperature_irq()/humidity_irq()/get_irq()函数,这样驱动就可以在回调函数中使用了。不过为了避免内存分配问题,将浮点计算改为了整数计算,这样的代价就是回调函数中的数据精度会降低。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1327

主题

3834

帖子

0

粉丝