5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (14) アナログ温度センサ2 LM35DZ 高精度

LM35の分解能は0.2℃

 連載12回では、±1℃の確度でLM35を使いました。使ったのは12ビットA-Dコンバータでした。16ビットA-Dコンバータを使えば、小数点第1位までの表示ができそうです。連載13回目のLTC2450を利用します。

LTC2450は基準電圧ADR4533とともに使う

 連載13回の記事のように、1.0000Vは1.0001Vと測定できました。mV単位まではほぼ正しく測れており、0.01%の誤差です。

 LM35の最小分解能0.2℃(typ)は2mVです。LTC2450と基準電圧源ADR4533の組み合わせで1mV単位は正確に測れているので、LM35の分解能を生かすことができます。

接続

ラズパイのGPIOとの接続

 下記の回路図のGNDはGPIOの9番ピンを使っていますが、I2C-LCDのAQM0802のソケットを挿しているので、実際は6番ピンを使いました。

LM35 ADR4533BRZ LTC2450 AQM0802 ラズパイのGPIO
      Vcc 1番ピン 3.3V
Vcc Vin 2番ピン     2番ピン 5V
      SDA 3番ピン I2C-SDA
      SCL 5番ピン I2C-SCL
GND GND 3番ピン GND GND 96)番ピン GND
    5番ピン OUT   21番ピン SPI-MISO
    6番ピン SCL   23番ピン SPI-CLK
    4番ピン CS   24番ピン CE0

LM35とLTC2450の接続

 LM35は、文字を印字している面を見えるようにして、左から、V+、Vout、GNDです。LM35のVoutとLTC2450のVin 2番ピンをつなぎます。V+は4V以上必要なので、5Vにつなぎます。

ADR4533BRZとLTC2450の接続

 ADR4533BRZのVout 6番ピンとLTC2450のVin 1番ピンをつなぎます。

 すべてのデバイスの配線を示します。ICの方向は、左上が1番ピンです。

プログラム

 SPI接続のA-DコンバータのLTC2450はspidevライブラリを、I2C接続のキャラクタLCD表示器はsmbusライブラリを利用します。変換待ちをするsleep()用にtimeライブラリを使います。

 command()とwriteLCD()はLCD用の関数です。command()は、LCDへ直接命令を送信します。writeLCD()は、引数に入っている文字列を表示します。initLCD()はLCDの初期化コードを送信します。

 プログラムのmainでは、最初に、LT2450から前のデータを読み出し、もう一度読むと最新のA-D変換のデータが読み出されます。LM35の出力電圧を100倍して摂氏に変換し、round()で小数点第3位を四捨五入しディスプレイに表示します。round()で小数点第2位を四捨五入し、LCDへ表示します。

 0.1℃の単位で表示していますが、LM35DZを恒温槽に入れて校正すれば信用できる分解能になります。

#!/usr/bin/env python
import spidev
import smbus
import time
i2c = smbus.SMBus(1) # 1 is bus number
addr02=0x3e #lcd
_command=0x00;_data=0x40;_clear=0x01;_home=0x02;display_On=0x0f;LCD_2ndline=0x40+0x80
Vref = 3.29989
spi = spidev.SpiDev()
spi.open(0,0)

#LCD AQM0802/1602
def command( code ):
i2c.write_byte_data(addr02, _command, code)
time.sleep(0.1)

def writeLCD( message ):
mojilist=[]
for moji in message:
mojilist.append(ord(moji))
i2c.write_i2c_block_data(addr02, _data, mojilist)
time.sleep(0.1)

def initLCD():
command(0x38);command(0x39);command(0x14);command(0x73);command(0x56);command(0x6c);command(0x38);command(_clear);command(display_On)

#main
initLCD()

adcLTC2450 = spi.xfer2([0x00,0x00])
time.sleep(0.05)
adcLTC2450 = spi.xfer2([0x00,0x00])
data = (adcLTC2450[0] << 8) | adcLTC2450[1]
volt1 = Vref*data/65535
tempLM35 = volt1 * 100
print (str(volt1) +"V "+ str(round(tempLM35,2))+"C")
writeLCD("T="+str(round(tempLM35,1)) + "C")
spi.close()

(※)2018年後半から、speedの指定が必須になっています。open後に記述します。
spi.open(0, 0) # port 0,cs 0
spi.max_speed_hz = 1000000 # 1MHz

実行例