温度センサADT7410を用いた温度測定
前回のDHT11から、時間がたちましたが、ブレッドボードに乗っていたADT7410を用いて、温度測定をしてみたいと思います。DHT11はワンワイヤーで、ESP32自体でライブラリをもっていたので楽でしたが、ADT7410ではしっかりとメーカーの仕様を読んでおかないといけません。
メーカーのアナログデバイシスのホームページから、資料をダウンロードします。https://www.analog.com/media/en/technical-documentation/data-sheets/ADT7410.pdfの12~13ページに書いてありますが、13ビットでの測定では0x00から2バイト拾って、くっつけて、うしろの3ビット分を切ると言う作業が必要になります。
今回はsclを18ピンにsdaを19ピンに設定しました。ADT7410もプルアップが必要なので、まずはプルアップします。
1 2 3 |
>>> from machine import SoftI2C, Pin >>> p18 = Pin(18, Pin.IN, Pin.PULL_UP) >>> p19 = Pin(19, Pin.IN, Pin.PULL_UP) |
その後softi2cでデータを読み込みます。
1 |
>>> data = SoftI2C(scl = Pin(18), sda = Pin(19), freq = 10000).readfrom_mem(0x48, 0x00, 2) |
ここで、2バイト分のデータを見てみます。
1 2 3 4 |
>>> print(data[0]) 10 >>> print(data[1]) 224 |
10進数でプリントされるので、2進数でプリントさせます。
1 2 3 4 |
>>> print(bin(data[0])) 0b1010 >>> print(bin(data[1])) 0b11100000 |
data[0]は00001010、data[1]は11100000となってます。data[0]を左に8ビットずらしてdata[1]をつなげます。
1 2 |
>>> print(bin(data[0]<<8 |data[1])) 0b101011100000 |
0000101011100000となりました。右側3ビットは不要ですから、右に3ビットずらします。
1 2 |
>>> print(bin((data[0]<<8 |data[1]) >>3)) 0b101011100 |
0000101011100になりました。10進数に治すと、
1 2 |
>>> print(((data[0]<<8 |data[1]) >>3)) # temp=print(((data[0]<<8 |data[1]) >>3)) 348 |
これを13ビットですから、資料にあるとおり16で割ります。
1 2 |
>>> print(((data[0]<<8 |data[1]) >>3)/16) 21.75 |
これで温度21.75度が出てきました。
このセンサではマイナスになるとファーストビットに1が立つので、13ビットで1000000000000は10進数で4096ですから、tempがこの数より大きい場合はマイナスの温度になるのでtemp=temp-8192とすればOKです。例フルビット1111111111111は10進数で8191ですから、8191-8192=-1これを16で割って-0.0625度となります。