2016-07-18 11:12 | カテゴリ:PIC応用回路
LCD表示器に文字を表示するところまでなんとかできるようになりましたので、今度はメインのセンサーです。

今回使用するのは、BME280というセンサーです。

BME280.jpg

Sensors.jpg

プログラミングを進めます、、、

このセンサーは、小さな本体一つで、気圧気温湿度を連続的に計測し、結果をi2c通信でPICなどに読み込む事ができます。
計測自体は、外部から設定された回数で平均化されて、高精度に観測することができます。

今回の最終目的は、昔、購入してリビングで使用している大型のLEDデジタル時計のLED表示器を利用して、これらの計測値と、ついでに時計もPICで計測して表示し、リビングルームのアクセサリーにしようという目論見です。

その一環として、まずは、計測したデータを表示して、確認できるように、まず、LCD表示器(i2c通信対応)を完成させ、そのあとで、i2cセンサーを制御し、結果の読み取りが確認できたら、時計機能を追加し、最終的に、もともとの大型LED表示機に接続するという手順を予定しています。
前回にLCD表示器の接続、表示テストができましたので、次は、センサーの接続です。

LCD03.jpg

センサーは、i2c接続、動作の初期設定、補正係数の読み出し、計測値の読み込み、データの補正計算、結果をLCDに表示する、という手順になります。

ハード的な接続ですが、じつはこのセンサーは3.3Vで動作します。使用するPICは5Vです。
このままではi2c接続ができません。
この様に動作電圧が異なるi2c機器を接続するときに便利な電圧変換ICがあります。(上記の写真参照。秋月さんで購入しました)
これを使用すれば、簡単に電源電圧の異なる複数のi2c機器を接続できます。

さて、ソフトウエアの方ですが、WEBで検索すると、良いものが見つかりました。

「SWITCHSCIENCE」というサイトで、センサーなどの販売をされています。
そこに、このセンサーの使用方法が詳細に書かれていましたので、可能な限り使わせていただきました。

SWITCHSCIENCE


手順としては、

1、センサー固有の校正パラメータを内部のROMからPICへ読み出す。
2、センサーの各計測パラメータの生のデータを所定のメモリからPICへ読み込む。
3、所定の計算式に応じて、生のデータから、気温(摂氏)、気圧(hPa)、湿度(%)を計算で求める。(PIC側で)
となります。

PICのXC8とは、若干仕様が異なるようですが、変数の長さ(バイト型、2バイト型、4バイト型など)を注意して置き換えていきました。
データの校正の部分の説明を見ると、

TrimPara1.jpg

計算説明

補正用のパラメータはここのレジスタに書き込んであります。それを読み出します。
おまけに、この計算では、32ビット整数型の変数や、場合によっては64ビット型の変数も使用することが前提となっています。
PICのXC8では、最大で、signed double intですから、4バイト型になります。

その後、計測の設定を所定のレジスタに書き込むと計測が開始されます。
結果は、それぞれの結果収納レジスタに格納されますので、それを読み込み、補正計算に進みます。

計算式がとても複雑で、マニュアルを読んで、自分でXC8上でプログラムを書く自信がなかったので、このサイト「SWITCHSCIENCE」のプログラムを利用させていただきました。(感謝!)
自分で組んだのは、校正用のパラメータの読み込みや、計測数値の読み込み、動作設定パラメータの書き込みは、i2c通信で行います。
この部分は、今回作成した入出力部分を使用しました。
また、結果の数値(整数型)を、文字に変換しLCDやLEDに表示する部分は作成しました。(前回紹介させていただきました)

こちらが、今回、気候センサーの計算部分のプログラムの例です。(かなり複雑です!)
結果は、こちらの様に結果レジスターに格納されますので、それを読み出します。

結果の読み出しは、

計測データ読み出し

それらを校正計算します(気圧の校正計算の例)

気圧校正

簡単にお話ししていますが、実際のプログラムはかなり複雑怪奇で、ご説明しきれません(汗)

実際に、私がブレッドボード上で、センサーからの数値を読み込んで計算し、それをLCD表示器に出力させる部分まで完成しましたので、そのプログラムをご参考までにここにアップします。

プログラム(TEXT形式)
気候表示1

これが動作状況の動画です。

初めに、i2cでちゃんとセンサーと接続されているか、センサーのIDが書かれているレジスターを読み込んで確認します。
今回は、「60」が表示できればOKです。
続いて、センサーの個別校正のためのパラメータを所定のレジスターから32バイト分読み取ります。
それらは、プログラム中の変数に代入していきます。

完了すると、いよいよ気候データの表示です。



表示は数秒ごとに更新されるように設定しています。

ここまで何とかできましたが、途中、結構はまりました。
校正部分のミスや、読み込むレジスタをプログラム上で間違ったりして、気圧が変になったりしていました。(笑)



管理者のみに表示する