温度計
使用目的:機器内の温度検知用に小さい温度計を探していたところ このICを見つけ 試しに制作しました。
-25℃〜85℃温度計 (補正なし精度2℃)のI2C規格でシリアル通信ができるICです。1.7mm角高さ0.6mmの大きさの大きさ。待機電流1uA 電源電圧3.3v の性能です。

使用目的:機器内の温度検知用に小さい温度計を探していたところ このICを見つけ 試しに制作しました。
-25℃〜85℃温度計 (補正なし精度2℃)のI2C規格でシリアル通信ができるICです。1.7mm角高さ0.6mmの大きさの大きさ。待機電流1uA 電源電圧3.3v の性能です。
趣味で作った測定システムを動かしてみました。
1300分位の位置が今、左に向かって過去を表しています。約1日分です。気圧は上昇、湿度は乾燥、温度は下降に向かっています。空調の効いた部屋内の測定なので気温は外気でないので変化はわかりません。気圧が上昇しているので高気圧が近づき、湿度が乾燥しているので北風が吹いていることを表しています。
IOTと言う言葉を耳にしますが、このように時間の流れで変化をみると色々なものが想像できます。
こんなこと考えるの面白いと思うんだけどなあ〜 興味ある人いるのかなあ〜
0.0625℃の分解能で測定される温度計(ADT7310)で 実験場所の温度を22時間程測定してみました。実際には、60秒で60回測定して平均したものを測定結果(60分x24時間で1440個)としています。
緑色が1日、青色が1分、橙色が1時間の測定結果を表示している。青色より1秒間隔の測定差が判り、橙色より1分単位の変化が、緑色より24分単位の変化が判ります。
起床時から少し増えたのは私が部屋に入ったから。メモリ20(8時頃)から太陽の光が部屋に入ったので。メモリ25の付近は曇ったため。メモリ35(14時頃)から下がり始めています。21℃から23.5℃で推移していることが分かりました。
一応の結果が得れたので、今度は気温、気圧と湿度の3つを測定できると面白いと考えています。
1日(22時間)、RaspberryPiで温度計測をした結果が出ました。太陽の光が差し込むと温度が上昇し夕方になると下降しています。途中の下がっているところは光が雲により遮られた時です。起床した時が最低温度で側にしばらく座っていると上昇が始まっています。人間ってすごく発熱するんだとびっくりです。
エアコン風の影響を受けない所で測定の試験を初めて約6時間経過した。緑色の1日を1分単位で測定した結果は、22.8->21.1℃と下がった。橙色は、1時間を1分単位で表示、青色は、1分を1秒単位で測定したものです。
.
SPIやI2Cで温度計測ができるようになりました。しかし、データを記録したいことは多いので、CSVファイルに測定データを格納するプログラクをPythonで作ることにした。
を目標に作っている途中です。ファイルは1日1回なので実働テストに時間がかかってしまう。
SPIとI2Cの通信手段を確認できました。
下記にRaspberryPi3B+ で動作させた PythonのプログラムをPDFにしています。このセンサーは電源電圧と測定温度で誤差が -40℃〜105℃(2.7V-3.6v)では±0.5℃、カタログの表から 0-100℃(3.3v)では±0.2℃程度と考えることができるので、私には十分です。
coding: utf-8
#
import spidev
import time
class Adt7310:
def init(self): #インスタンス作成時に呼び出し 確認2018/12/29
self.spi = spidev.SpiDev()
self.spi.open(0,0)
self.spi.max_speed_hz = 10 # 通信速度の設定
self.spi.bits_per_word = 8 # 送信文字(bit)単位の設定
self.spi.mode = 3 # [CPOL|CPHA]
CPOL 0:正理論 ポジパルス --_-
0 CPHA 0: CPOL立上りで読込
1 CPHA 1: CPOL立下りで読込
CPOL 1:負理論 ネガパルス -----_--
2 CPHA 0: CPOL立下りで読込
3 CPHA 1: CPOL立上りで読込
参考資料 http://dlnware.com/theory/SPI-Transfer-Modes
#
def spi_close(self): #動作未確認
self.spi.close()
シャットダウン
ADT7310は、コンフィギュレーション・レジスタ(レジスタ・アドレス0x01)のビット[6:5]を11にする。
シャットダウン前の最後の変換からの変換結果は、シャットダウン・モードのときでもADT7310から読み取ることができます。
コンフィギュレーション・レジスタ(レジスタ・アドレス0x01)のビット[6:5]に00にするとシャットダウン・モードから抜けることができます。
シャットダウン・モードから出るのに1ms(0.1μFデカップリング・コンデンサで)必要です。
デバイスがシャットダウンモードから抜け出ると、内部クロックが開始され、変換が開始されます。
def spi_shutdown(self): #動作未確認 self.spi.xfer([0b00001000,0b01100000]) # Register:01へ シャットダウンコマンドdata:0x60 の書き込み
#
xfer CS端子が転送中は activate され 未使用時は解放される。
xfer2 CS端子は解放されている。
参考資料 https://pypi.org/project/spidev/
#
ワンショットモード
ワンショット・モードでは、ADT7310はただちに変換を完了してからシャットダウン・モードなる。
ワンショットモードは、消費電力を削減する。
ワンショットモードを有効にするには、
コンフィギュレーションレジスタ(レジスタアドレス0x01)のビット[6:5]を01に設定します。
動作モードビットに書き込んだ後、温度値レジスタから温度を読み出す前に、少なくとも240ms待機が必要。
この遅延により、ADT7310は起動して変換を完了するのに十分な時間を確保できる。
更新された温度変換を得るには、
コンフィギュレーションレジスタ(レジスタアドレス0x01)のビット[6:5]を01にリセットします。
1 SPSモード
このモードでは、パーツは1秒あたり1回の測定を実行します。
一回の変換はわずか60msしかかからず、残りの940msの間はアイドル状態のままです。
このモードは、コンフィギュレーションレジスタ(レジスタアドレス0x01)のビット[6:5]を10にする。
def spi_oneshot(self): #動作未確認 self.spi.xfer([0b00001000,0b10100000]) # Register:01へ ワンショットコマンドdata:0xa0 の書き込み def spi_SPS(self): #確認2018/12/29 self.spi.xfer([0b00001000,0b01000000]) # Register:01へ SPSコマンドdata:0x40 の書き込み
温度データの読込
読取りは、ADT7310に書込み/読込みビットを1にセットして開始すると、
アドレス指定されたレジスタに応じて8または16クロック・パルスを供給し、
ADT7310はアドレス指定されたレジスタからデータをクロック・アウトしますDOUTに出力される。
データは、コマンドバイトに続くSCLKの最初の立ち下がりエッジでクロック出力されます。
マスターがCSをハイにすると、読み出しは終了します。
マスタは、読み込まれたレジスタごとにバス上で新しい読み取りを開始する必要があります。
1つの読み取りにつき 1つのレジスタのみが読み出されます。
ただし、連続リードモードでは、コマンドバイトC2 = 1となり、連続して温度値レジスタを読み出すことができます。
マスタはSCLKで16クロック・パルスを送信し、温度値はDOUTでクロック出力されます。
def spi_read(self): #確認2018/12/29 e = self.spi.xfer([0b01010000,0xff,0xff])[1:] # Register:02へ データ呼び出しコマンドdata:0x50 の書き込み er = e[0]<<8 | e[1] if(er >= 0x8000): er = er - 0x10000 er = er / 128.0 return er # 2バイトの0xffはダミーデータです。
Status Register (Register Address 0x00)
Bit Default Type Name
[3:0] 0000 R unused
4 0 R Tlow
5 0 R Thigh
6 0 R Tcrit
7 0 R _RDY
4このビットは、温度がTLOW温度制限を下回ると1に設定されます。
ステータスレジスタが読み出されたとき、
および/または測定された温度が限界を超えたときに、
ビットは0にクリアされます
TLOW + THYST設定値レジスタに設定します。
5このビットは、温度がTHIGHの温度制限を超えると1に設定されます。
ステータスレジスタが読み出されたとき、
および/または測定された温度が制限値を下回ったとき、
ビットは0にクリアされます
THIGH-THYST設定値レジスタに設定します。
6このビットは、温度がTCRITの温度制限を超えると1に設定されます。
ステータスレジスタが読み出されたとき、
および/または測定された温度が制限値を下回ったときに
0にクリアされます
TCRIT - THYST設定値レジスタに設定します。
7温度変換結果が温度値レジスタに書き込まれると、このビットはローになります。
温度値レジスタを読み出すと1にリセットされます。
ワンショットモードと1つのSPSモードでは、
このビットはワンショット・ビットへのライト後にリセットされます。
def spi_status(self): #確認2018/12/29 d = self.spi.xfer([0b01000000,0xff]) ## Register:00へ ステータス呼び出しとダミーdata:0xff の書き込み return d[1]
------------------------ サブルーチン -----------------------
one SPSモードでは、1秒間に1回の測定が行われるから、測定の終了を待って読み出す部分が必要です。
def spi_read_SPS(self): #確認2018/12/29 while self.spi_status() & 0x80 != 0: # データの準備ができるまで time.sleep(0.4) # 間隔で待つ。 ret = self.spi_read() # 温度データを読み出す。 return ret
#
#
ADT7310 の概要
●高性能:
温度精度±0.5℃@-40℃~+105℃(2.7V~3.6V) ±0.4℃@-40℃~+105℃(3.0V)
16ビット温度分解能:0.0078℃
高速な最初の温度の変換時間:パワアップ後6ms
●低消費:
パワーセービング・モード:1サンプル/1秒
ノーマル・モード:700μW@3.3V
シャットダウン・モード:7μW@3.3V
●容易な導入:
温度校正 / 補正は不要
直線性補正の不要
●広い動作範囲:
温度範囲:-55℃~+150℃
電圧範囲:2.7V~5.5V
●プログラマブル割り込み:
高精度な温度過熱割り込み 温度上昇 / 温度低下割り込み
●SPI互換インターフェース
●8ピン狭幅SOIC、RoHS準拠パッケージ
#
SPI コマンド Byte
0 0 (固定)
1 0 (固定)
2 1:温度連続読出 0:
[5:3] 7-0:レジスターアドレス
6 1:読み出し 0:書き込み
7 0 (固定)
#
コンフィギュレーション・レジスタ(レジスタ・アドレス0x01)
[1:0] これらの2つのビットは、
INTピンとCTピンを設定する前に発生する可能性のある低温/過温度フォルトの数を設定します。
これにより、誤ったトリガーを避けることができます
温度ノイズ。
00 = 1フォルト(デフォルト)。
01 = 2フォルト。
10 = 3フォルト。
11 = 4フォルト。
2 このビットは、CTピンの出力極性を選択します。
0 =アクティブロー。1 =アクティブハイ。
3 このビットは、INTピンの出力極性を選択します。
0 =アクティブロー。1 =アクティブハイ。
4 このビットは、コンパレータモードと割り込みモードを選択します。
0 =割り込みモード。1 =コンパレータモード。
[6:5] これら2つのビットは、ADT7310の動作モードを設定します。
00 =連続変換(デフォルト)。 1つの変換が終了すると、ADT7310は別の変換を開始します。
01 =ワンショット。変換時間は通常240ミリ秒です。
10 = 1 SPSモード。変換時間は通常60msです。この動作モードは平均消費電流を低減します。
11 =シャットダウン。インターフェイス回路を除くすべての回路がパワーダウンされます。
7 このビットは変換時にADCの分解能を設定します。
0 = 13ビット分解能。符号ビット+12ビットは0.0625℃の温度分解能を与えます。
1 = 16ビット分解能。符号ビット+ 15ビットは0.0078125℃の温度分解能を与えます。
#
pythonのプログラムを見よう見まねで初めますが、我流のソフトは難解かもしれません。もし 必要になり見られる方がありましたら、こんなように思って書いたと参考にしてください。
社員5人のベンチャー企業に就職し、最高270日/年の出張日々で車中や機内でソフトを作る状態で
データの記録方法に絶対アドレスと相対アドレスがあると考えてます。例えば 郵便の住所はその場所しかないので絶対アドレス、説明で使う「xxx商店の3つ隣の家」を相対アドレスと呼んでます。
データ記録用のメモリは、絶対アドレスでなく相対アドレスをなるべく使うようにしています。プログラムの中で、機能の少ないプログラムの塊をサブルーチンと呼んだとき、サブルーチンにxxx商店とY番目と知らせると同じ影響を異なるアドレスに及ぼすことができるからです。これで、プログラムとメモリを一まとまりと考えることができるようになります。この方法を使うようにしています。
個人的ですが 今回 改めて考えてみたら、こんな分類になってしまいました。
友達同士で通信をキャッチボールのように送受信を行う(半二重)ものと各々勝手に喋っている通信(全二重)の方法。使用信号 TXD,RXDと表示されていることが多い
送信と受信を同時に同数のbit’s dataでおこなう方法。使用信号:SI,SO,SCLK (と選択CE0,CE1…CEn)を使うことが多い
強い親と弱い子の会話みたいな通信方法。信号内容で「誰かにこれを命令する」、「誰かに問い合わせする」ように通信する。使用信号は、SDA,SCLです。
ハードに利用できるのは、SPI 、SIO 、I2Cの順と考えますがSPIが一番簡単です。
できなかった原因:opencvをコンパイルして作成したとき、必要なライブラリーを忘れていた。そこであらかじめできている python3とopencvを新しい参考先を見つけてインストールしました。
参考先をコメントとして書いたプログラムshow_camera
————————- 以下 2018/12/14 以前 —————————–
RaspberryPi3B+でカメラを使うには Python3+opencvを使う記事を参考にしています。
そこに出ている説明で入力するものを TXTに書きましたので ご利用ください。
コピペしたいので、MacとRaspberryP13B+をVNCを使って接続してMacで操作しています。cmakeがなかったので、raspberrypi設定のアプリケーションでcmakeを検索して選択の後 OKして得ました。
安易な方法:opencv-installの1行を選択してコピーして VNCのコマンド行に貼り付ける方法で行いました。
準備 raspberrypi設定でシリアル通信の使用を宣言する。
送信TXD信号と受信RXD信号を接続する。
プログラムを書く
raspberryPi3 コネクタピン
動かしてみる
python3を動かし、作成したプログラムをpython3のfileにある「open」を使って開く。開いたプログラムの[RUN]=>[Run Module]で動作させると写真のように 送信したデータが受信されたことがわかる。
コメントを投稿するにはログインしてください。