##教えてほしいこと
BME280センサのデータを取得するためのプログラムについて。
次のコードを実行すれば、データを表示するこはできるのですが、
プログラムコードで分からない箇所があります。
参考url: https://qiita.com/yukataoka/items/8f9046587c978e91f689
- def init(self, busNumber=1, i2cAddress=0x76):
ここで、self.と定義されていますが、
selfと定義する理由が分かりません。
- def writeReg(self, regAddress, data):
この関数が、何をしているのかが分かりません。
def getCalibParam(self):
この関数は、BME280の資料をみると、キャリブレーションデータを設定していると理解しています。
他の関数についても、BME280のデータシートをみて、何とか理解できたのですが、↑の2つの関数が理解できません。
python3
1#!/usr/bin/python3 2# -*- coding: utf-8 -*- 3 4from smbus2 import SMBus 5import time 6 7class Bme280: 8 9 def __init__(self, busNumber=1, i2cAddress=0x76): 10 11 self.bus = SMBus(busNumber) 12 self.i2cAddress = i2cAddress 13 self.digT = [] 14 self.digP = [] 15 self.digH = [] 16 self.timeFine = 0.0 17 self.presRaw = 0.0 18 self.tempRaw = 0.0 19 self.humRaw = 0.0 20 21 osrsT = 1 #Temperature oversampling x 1 22 osrsP = 1 #Pressure oversampling x 1 23 osrsH = 1 #Humidity oversampling x 1 24 mode = 3 #Normal mode 25 tSb = 5 #Tstandby 1000ms 26 filter = 0 #Filter off 27 spi3wEn = 0 #3-wire SPI Disable 28 29 ctrlMeasReg = (osrsT << 5) | (osrsP << 2) | mode 30 configReg = (tSb << 5) | (filter << 2) | spi3wEn 31 ctrlHumReg = osrsH 32 33 self.writeReg(0xF2,ctrlHumReg) 34 self.writeReg(0xF4,ctrlMeasReg) 35 self.writeReg(0xF5,configReg) 36 self.getCalibParam() 37 38 self.readData() 39 40 def writeReg(self, regAddress, data): 41 self.bus.write_byte_data(self.i2cAddress, regAddress, data) 42 43 def getCalibParam(self): 44 calib = [] 45 46 for i in range (0x88,0x88+24): 47 calib.append(self.bus.read_byte_data(self.i2cAddress,i)) 48 calib.append(self.bus.read_byte_data(self.i2cAddress,0xA1)) 49 for i in range (0xE1,0xE1+7): 50 calib.append(self.bus.read_byte_data(self.i2cAddress,i)) 51 52 self.digT.append((calib[1] << 8) | calib[0]) 53 self.digT.append((calib[3] << 8) | calib[2]) 54 self.digT.append((calib[5] << 8) | calib[4]) 55 self.digP.append((calib[7] << 8) | calib[6]) 56 self.digP.append((calib[9] << 8) | calib[8]) 57 self.digP.append((calib[11]<< 8) | calib[10]) 58 self.digP.append((calib[13]<< 8) | calib[12]) 59 self.digP.append((calib[15]<< 8) | calib[14]) 60 self.digP.append((calib[17]<< 8) | calib[16]) 61 self.digP.append((calib[19]<< 8) | calib[18]) 62 self.digP.append((calib[21]<< 8) | calib[20]) 63 self.digP.append((calib[23]<< 8) | calib[22]) 64 self.digH.append( calib[24] ) 65 self.digH.append((calib[26]<< 8) | calib[25]) 66 self.digH.append( calib[27] ) 67 self.digH.append((calib[28]<< 4) | (0x0F & calib[29])) 68 self.digH.append((calib[30]<< 4) | ((calib[29] >> 4) & 0x0F)) 69 self.digH.append( calib[31] ) 70 71 for i in range(1,2): 72 if self.digT[i] & 0x8000: 73 self.digT[i] = (-self.digT[i] ^ 0xFFFF) + 1 74 75 for i in range(1,8): 76 if self.digP[i] & 0x8000: 77 self.digP[i] = (-self.digP[i] ^ 0xFFFF) + 1 78 79 for i in range(0,6): 80 if self.digH[i] & 0x8000: 81 self.digH[i] = (-self.digH[i] ^ 0xFFFF) + 1 82 83 def readData(self): 84 data = [] 85 for i in range (0xF7, 0xF7+8): 86 data.append(self.bus.read_byte_data(self.i2cAddress,i)) 87 self.presRaw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4) 88 self.tempRaw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4) 89 self.humRaw = (data[6] << 8) | data[7] 90 91 def getPressure(self): 92 pressure = 0.0 93 94 v1 = (self.timeFine / 2.0) - 64000.0 95 v2 = (((v1 / 4.0) * (v1 / 4.0)) / 2048) * self.digP[5] 96 v2 = v2 + ((v1 * self.digP[4]) * 2.0) 97 v2 = (v2 / 4.0) + (self.digP[3] * 65536.0) 98 v1 = (((self.digP[2] * (((v1 / 4.0) * (v1 / 4.0)) / 8192)) / 8) + ((self.digP[1] * v1) / 2.0)) / 262144 99 v1 = ((32768 + v1) * self.digP[0]) / 32768 100 101 if v1 == 0: 102 return 0 103 pressure = ((1048576 - self.presRaw) - (v2 / 4096)) * 3125 104 if pressure < 0x80000000: 105 pressure = (pressure * 2.0) / v1 106 else: 107 pressure = (pressure / v1) * 2 108 v1 = (self.digP[8] * (((pressure / 8.0) * (pressure / 8.0)) / 8192.0)) / 4096 109 v2 = ((pressure / 4.0) * self.digP[7]) / 8192.0 110 pressure = pressure + ((v1 + v2 + self.digP[6]) / 16.0) 111 return pressure/100 112 113 def getTemperature(self): 114 v1 = (self.tempRaw / 16384.0 - self.digT[0] / 1024.0) * self.digT[1] 115 v2 = (self.tempRaw / 131072.0 - self.digT[0] / 8192.0) * (self.tempRaw / 131072.0 - self.digT[0] / 8192.0) * self.digT[2] 116 self.timeFine = v1 + v2 117 temperature = self.timeFine / 5120.0 118 return temperature 119 120 def getHumidity(self): 121 varH = self.timeFine - 76800.0 122 if varH != 0: 123 varH = (self.humRaw - (self.digH[3] * 64.0 + self.digH[4]/16384.0 * varH)) * (self.digH[1] / 65536.0 * (1.0 + self.digH[5] / 67108864.0 * varH * (1.0 + self.digH[2] / 67108864.0 * varH))) 124 else: 125 return 0 126 varH = varH * (1.0 - self.digH[0] * varH / 524288.0) 127 if varH > 100.0: 128 varH = 100.0 129 elif varH < 0.0: 130 varH = 0.0 131 return varH 132 133if __name__ == '__main__': 134 sensor = Bme280() 135 try: 136 print("pressure : %7.2f hPa" % sensor.getPressure()) 137 print("temperature : %-6.2f ℃" % sensor.getTemperature()) 138 print("humidity : %6.2f %" % sensor.getHumidity()) 139 except KeyboardInterrupt: 140 pass 141
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/26 07:09
2020/05/26 07:35
2020/05/27 00:43