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 | 9(6)番ピン 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
●実行例