質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1814閲覧

Pythonプログラム smbus

raspypy

総合スコア247

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/26 06:34

##教えてほしいこと

BME280センサのデータを取得するためのプログラムについて。
次のコードを実行すれば、データを表示するこはできるのですが、
プログラムコードで分からない箇所があります。

参考url: https://qiita.com/yukataoka/items/8f9046587c978e91f689

  1. def init(self, busNumber=1, i2cAddress=0x76):

ここで、self.と定義されていますが、
selfと定義する理由が分かりません。

  1. 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  1. def init(self, busNumber=1, i2cAddress=0x76):

ここで、self.と定義されていますが、
selfと定義する理由が分かりません。
→pythonのクラスを書く時に一般的なものなので、「python class コンストラクタ」で検索してみてください。説明サイトがたくさん出てきます。
例:Pythonのクラスでコンストラクタを使う方法【初心者向け】

  1. def writeReg(self, regAddress, data):

この関数が、何をしているのかが分かりません。
→下記リンク(smbus2のドキュメントです)には「Write a byte to a given register.」とありますので、self.bus.write_byte_data(self.i2cAddress, regAddress, data)はdataをregAddressに書き込む機能のようです。

write_byte_data(i2c_addr, register, value, force=None)

Write a byte to a given register.
smbus2

投稿2020/05/26 06:52

jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raspypy

2020/05/26 07:09

回答ありがとうございます。 教えてください。 "dataをregAddressに書き込む"とあるのですが、 書き込むdataは、readData(self)関数内にあるdata配列と理解していますが、 書き込む先のregAddressは、def writeReg(self, regAddress, data)関数内にしかでてきません。 勝手なイメージですが、書き込む先のregAddressを、Readすることはないのでしょうか。 dataをregAddressレジスタに書き込むというこの関数の働きが良く理解できずに困っております。 教えていただけると助かります。
jeanbiego

2020/05/26 07:35

先に言っておきますと、私はこのセンサーを使ったことがないので、詳しくはQiita記事にコメントで質問したほうが良いと思います。 regAddressをReadする機能はないようですが、コンストラクタの中でwriteRegが3パターン書かれています。これらの第一引数(0xF2,0xF4,0xF5)がそれぞれのregAddressと思います。 self.writeReg(0xF2,ctrlHumReg) self.writeReg(0xF4,ctrlMeasReg) self.writeReg(0xF5,configReg)
raspypy

2020/05/27 00:43

とてもよく理解できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問