bmp280

from microbit import *
I2C_ADDR = 0x77

class BMP280():
  def __init__(self,i2c):
    self.i2c = i2c
    self.T1 = self.get2Reg(0x88)
    self.T2 = self.short(self.get2Reg(0x8A))
    self.T3 = self.short(self.get2Reg(0x8C))
    self.P1 = self.get2Reg(0x8E)
    self.P2 = self.short(self.get2Reg(0x90))
    self.P3 = self.short(self.get2Reg(0x92))
    self.P4 = self.short(self.get2Reg(0x94))
    self.P5 = self.short(self.get2Reg(0x96))
    self.P6 = self.short(self.get2Reg(0x98))
    self.P7 = self.short(self.get2Reg(0x9A))
    self.P8 = self.short(self.get2Reg(0x9C))
    self.P9 = self.short(self.get2Reg(0x9E))
    self.setReg(0xF4, 0x2F)
    self.setReg(0xF5, 0x0C)
    self.T = 0
    self.P = 0
  def short(self, dat):
    if dat > 32767: return dat-65536
    else: return dat
  def setReg(self,reg,dat):
    self.i2c.write(I2C_ADDR, bytearray([reg,dat]))
  def getReg(self,reg):
    self.i2c.write(I2C_ADDR,bytearray([reg]))
    t = self.i2c.read(I2C_ADDR,1)
    return t[0]
  def get2Reg(self,reg):
    self.i2c.write(I2C_ADDR,bytearray([reg]))
    t = self.i2c.read(I2C_ADDR,2)
    return t[0]+t[1]*256
  def get(self):
    adc_T = (self.getReg(0xFA)<<12) + (self.getReg(0xFB)<<4) + (self.getReg(0xFC)>>4)
    var1 = (((adc_T>>3)-(self.T1<<1))*self.T2)>>11
    var2 = (((((adc_T>>4)-self.T1)*((adc_T>>4) - self.T1))>>12)*self.T3)>>14
    t = var1+var2
    self.T = ((t * 5 + 128) >> 8)/100
    var1 = (t>>1) - 64000
    var2 = (((var1>>2) * (var1>>2)) >> 11 ) * self.P6
    var2 = var2 + ((var1*self.P5)<<1)
    var2 = (var2>>2)+(self.P4<<16)
    var1 = (((self.P3*((var1>>2)*(var1>>2))>>13)>>3) + (((self.P2) * var1)>>1))>>18
    var1 = ((32768+var1)*self.P1)>>15
    if var1 == 0:
      return
    adc_P = (self.getReg(0xF7)<<12) + (self.getReg(0xF8)<<4) + (self.getReg(0xF9)>>4)
    p=((1048576-adc_P)-(var2>>12))*3125
    if p < 0x80000000:
      p = (p << 1) // var1
    else:
      p = (p // var1) * 2
    var1 = (self.P9 * (((p>>3)*(p>>3))>>13))>>12
    var2 = (((p>>2)) * self.P8)>>13
    self.P = p + ((var1 + var2 + self.P7) >> 4)
    return [self.T, self.P]
  def getTemp(self):
    self.get()
    return self.T
  def getPress(self):
    self.get()
    return self.P
  def getAltitude(self):
    return 44330*(1-(self.getPress()/101325)**(1/5.255))

i2c.init(freq=100000,scl=pin19,sda=pin20)
bmp=BMP280(i2c)
print(str(bmp.getTemp())+' *C')
print(str(bmp.getPress())+' Pa')
print(str(bmp.getAltitude())+' m')

第1行: 导入microbit模块 第2行: BMP280模块的I2C地址 第6行: 将外部参数保存为类成员 第7行到第20行:获取BMP280传感器的配置 第21行到第22行: 初始化温度和压强 第23行到第25行:short函数,参数值大于32767,返回参数减去65336;否则,返回参数值 第26行到第27行:setReg函数,i2c写操作,将数据写到i2c地址 第28行到第31行:getReg函数,将数据写到i2c地址,再返回从i2c地址读取一位数据的值 第32行到第35行:get2Reg函数,将数据写到i2c地址,再从i2c地址读取两位数据,最后返回通过计算的值 第36行到第59行:get函数,获取温度与压强的值,并将值赋值给类成员T和P 第60行到第62行:获取温度值 第63行到第65行:获取压强值 第66行到第67行:获取海拔高度 第69行:i2c初始化,设置scl为pin19,sda为pin20,频率为100000 第70行:初始化BMP280,并将i2c作为参数传递 第71到第73行:打印温度值(摄氏度),压强值(帕),海拔高度(米)

results matching ""

    No results matching ""