お知らせ

らずぱいでIoT 第7回(温度、気圧、湿度の計算準備)

以前に、awkで計算した際に計算式で使用したdig_T1~dig_T3の算出を行いましたがBME280のチップ説明書によるとawkのプロラム内でdig_T2とdig_T3はsigned shortのためマイナスの0x8000の符号ビットが1の場合マイナスで扱う必要があるため正常な計算ができない可能性があります。

ただし、何度か読みだしたdig_T2,dig_T3はマイナスの値になることはなく常温程度ならマイナスにはならないのかもしれません。

awkではビット演算がサポートされてないためShift Rotateのような演算関数を作りそのうえでビット演算関数を作らない限り演算できないので実現は難しい(アセンブラにできて高級言語でできないことはあり得ないですが)のですが、pythonの場合は温度、気圧、湿度を計算するためのパラメータを求めるときにビット演算が可能なため肩を合わせることも可能になります。

上の表は各パラメータの算出を行うため、レジスタのどの位置を読むとどのパラメータになるかを示しています。前回のプログラムではcalib をDictにしたのはこのデータを読み出すためにはアドレスを指定して読みだしたほうがわかりやすいプログラムになるためです。

で今回追加した部分は以下のようになります。

ーーーーーーーーーーーーーーーーーーーーーーーー以下プログラム

dig_T[1] = (calib[0x89] << 8 | calib[0x88])
dig_T[2] = (calib[0x8B] << 8 | calib[0x8A])
dig_T[3] = (calib[0x8D] << 8 | calib[0x8C])

dig_P[1] = (calib[0x8F] << 8 | calib[0x8E])
dig_P[2] = (calib[0x91] << 8 | calib[0x90])
dig_P[3] = (calib[0x93] << 8 | calib[0x92])
dig_P[4] = (calib[0x95] << 8 | calib[0x94])
dig_P[5] = (calib[0x97] << 8 | calib[0x96])
dig_P[6] = (calib[0x99] << 8 | calib[0x98])
dig_P[7] = (calib[0x9B] << 8 | calib[0x9A])
dig_P[8] = (calib[0x9D] << 8 | calib[0x9C])
dig_P[9] = (calib[0x9F] << 8 | calib[0x9E])

dig_H[1] = calib[0xA1]
dig_H[2] = (calib[0xE2] << 8 | calib[0xE1])
dig_H[3] = (calib[0xE3])
dig_H[4] = (calib[0xE4] << 4 | calib[0xE5] & 0xf)
dig_H[5] = (calib[0xE6] << 4 | calib[0xE5] >> 4)
dig_H[6] = (calib[0xE7])

ーーーーーーーーーーーーーーーーーーーーーーーーここまで

前回は、dig_T,dig_P,dig_HはListで初期化していましたがプログラムを書く際これらもDictで初期化しておいたほうがわかりやすくかけるため初期化部分をDictにしている事に注意してください。

今回の全体ソースと日本語のチップ説明書をZIPにしてありますのでここからダウンロードしてください。