MCP9808は、I2C通信規格を利用して連続的にポーリングされた温度を送信する温度センサです。アラーム機能と待機モードをサポートしています。この説明では、センサから温度を取得するためにいくつかのpythonコマンドを実行します。
I2C on MCP9808
Microchipはこのボードのプライマリアドレスに 0x18 を使用しており、チップ上の 3 つのピンは I2C アドレスの衝突防止のためにアドレスを変更することができます。センサ内の任意のレジスタを呼び出す際には、2バイトのレスポンス(MSBが最初、LSBが最後)を書き込むか、取得する必要があります。すでにプルアップ抵抗を実装したAdafruit [1528-1032-ND] のブレークアウトボードを使用しました。
注意すべきレジスタ:
0x01 : 0000000X 00011111: Xはコンフィギュレーションのスタンバイビットで、デフォルトは0で、連続ポーリングモードです。温度レジスタは常に更新されますが、消費電力が大きい欠点があります。このビットを1に設定するとポーリングが停止し、消費電力を節約できます。
0x05 : AAASMMMM LLLLLLLL: このレジスタには12ビットの浮動小数点温度が含まれています。「A」はアラート情報、「S」は符号ビット、「M」と「L」はそれぞれMSBとLSBを表します。 最終的な出力はMMMMLLLL.LLLLとして表示されます。
この説明では、符号ビットとアラートビットは未実装のままにしていますが、氷点下の温度を測定する場合は必要です。
Raspberry Piでの実装:
Raspberry Piを使用してI2Cとインターフェースすることの良い点は、Pythonターミナルの対話性です。 RaspbianディストリビューションでI2Cを有効にしたRaspberry Pi 4を使用しました。 GPIOが3V3、GND、SDAに接続されていることを、およびSCLがMCP9808の正しいピンに接続されていることを確認してください。 Raspbianでターミナルを開き、次の3つのコマンドを実行します。
python
from smbus import SMBus
bus = SMBus(1)
これにより、インターフェースするバスオブジェクトが作成され、要求されたI2Cデータが収集されます。 つぎに、チップに温度データを要求します。
temp_binary = format(bus.read_word_data(0x18, 0x05),‘016b’)
bus.read_byte_data(Address, Register)
はセンサからデータを取得します。情報を2進数で読み取るためにはformat( )関数を使用しますが、これは2バイトを取り出すのが簡単になるようにするためです。Pythonは通常intやfloatを使用するのを好むので、1バイト以上の戻り値があると邪魔になります。 これらを、配列の後半には MSB が存在する [0:8][8:16] の順番でインデックス化します。
アウトプットを正しく出力させる:
以下のような関数を実装することで、正しく出力することができます。
def word_To_LSB_MSB(word):
return word[0:8], word[12 :16] // note that word indices [8,9,10,11] are not used in this example.
希望する出力については、この図を参照してください。
残っているのは、2つを元に戻し、浮動小数点演算を少し行うことだけです。
LSB, MSB = word_To_LSB_MSB(temp_binary)
float(int(MSB + LSB,2)) / 16
16で除算すると、結果はMMMMMLLLL.LLLLにシフトし、十進数の値が得られます。結果は摂氏で戻ってくることに注意してください。上の写真のケースでは、2進数0001010111.0101から計算した温度は摂氏23.3125度でした。
測定が終了したら電力を節約する:
測定が完了してデバイスの電源をオフにしたい場合は、省電力モードの電源用のスタンバイビットを設定してください。
bus.write_byte_data(0x18,0x01,0b00000001)
MCP9809のコンフィギュレーション・レジスタのMSBを変更するだけなので、レジスタのLSBデータを変更しないようにワードを短くすることでバイトを書き込みます。
MCP9808をフル機能動作に戻すには、センサの電源を切るか、ゼロでレジスタをフラッシュする必要があります。
Microchip社のデータシート は、このセンサを使用したアプリケーションで引き続き役立ちます。MCP9808を実装する場合は、定期的に参照してください。 割り込み、負温度の符号ビット、スタンバイ動作など、センサのいくつかの重要な機能は触れられていないことに注意してください。
使用した部品:
Raspberry Pi:1690-RASPBERRYPI4B/4GB-ND
ブレッドボード用ワイヤ メス-オス:1568-1511-ND
MCP9808用Adafruit ブレークアウトボード:1528-1032-ND
eliza007
こんにちは。
サーモスタットの代わりにこの温度センサを使用できますか?
サーモスタットと同じように動作しますか? そしてそのデータを監視することは可能ですか?
PaulHutch
TechForumにようこそ
建物の暖房用のサーモスタットをお尋ねになっていると仮定します。
可能ですが、マイクロコントローラ、ディスプレイ、キーパッド、ハウジングを追加すると、市販のユニットよりもコストがかかります。 また、損害保険会社によっては、独自のサーモスタットを使用すると、冷凍パイプの損傷を請求する際に問題が発生する場合があります。
DavidG
この例で使用されているコードの作業用コピーを持っている人はいますか? 写真ではなく、コピーして貼り付けることができるもの。 私は何度もそれを入力しようとしましたが、常にエラーメッセージが表示されます。 何かが足りないと感じます。 変数は事前に何か定義されていますか。
Michael_Rudi DigiKey Employee
MCP9808.txt (1.7 KB)
しばらくコードを実行していませんが、Raspberry Piファウンデーションがしっかり管理している場合は、Python 2.7ターミナルを使用して実装されているため、動作しない可能性があります。
私は以前Python 3ターミナルが動作していたのを漠然と覚えています。 問題が発生した場合はお知らせください(写真付き!)。問題が発生した場合は、喜んでサポートさせていただきます。
PaulHutch
最新のRaspberry Pi OS(以前のRaspbian)には、Python 2.7.16がまだインストールされています。T
DavidG
完璧です、ありがとうございます。私はPythonを学び始めたばかりなので、このプロジェクトを使って色々試してみるつもりです。冷凍庫の温度が低くなったらメールで警報を出すようなものにしたいと思っています。
もう一度ありがとう。 現在、Raspbianの新しいコピーをダウンロードしています。
David G.
DavidG
そのコードは正常に動作しました。正しいアドレスを入れればいいだけでした。0x18
新しいコードでは、
#Pool the contents of Register 0x05 for temperature data as a MSB, LSB pair;
#This comes back as a 16bits, so we use 16bit_to_MSB_LSB above to separate the binary string data
temp_MSB, temp_LSB = a16bit_to_MSB_LSB(format(bus.read_word_data(MCP9808,0x5), “016b”))
ビット12~15、符号、および温度アラームビットをどのように削除して、表示温度に影響を与えないようにしますか?
上記の説明書に記載されている最初のコードでは、つぎのようにしています。
def word_To_LSB_MSB(word):
return word[0:8], word[12 :16] // note that word indices [8,9,10,11] are not used in this example.
これは、上限温度を省略したように見えますが、アラームビットを読み取りました。
PaulHutch
Pythonを学んでいるということなので、私が数年前にPythonを学び始めたときと同じことをお勧めします。
Python 3で試してみて、うまくいかなかったらコードを修正して実行するようにします。私にとっては一般的にとても簡単なことです。私が2から3に変換したコードの約90%は、変換しないか、単にprint文のパラメータの周りに括弧をつけるだけで済みました。
Python 2は1月に終了し、Pythonチームから重要なセキュリティバグの修正も受けられなくなりました。 https://www.python.org/doc/sunset-python-2/
(2006年にお客様全員に9年以内のアップグレードをお願いし、その後、その期限をそれからさらに5年延長しました。)
私は、Raspberry Pi OS のような、Debian とその下流のすべてが、すぐにデフォルトのPython を 3 に変更して、さらに良いことにデフォルトのデストリビューションから Python 2 を完全に削除してくれることを期待しています (まだ Python 2 が必要だと感じている少数の愛好者たちは、いつでも自分でインストールすることができます。)