#209 Ktemp I2C Brick
Overview
K型熱電対を接続できるBrickです。 I2Cでデータを取得できます。
Connecting
I2Cコネクタへ接続します。
Support
Arduino | RaspberryPI | IchigoJam | Edison |
---|---|---|---|
◯ | ◯ | ◯ | ◯ |
MCP3421 Datasheet
Document |
---|
MCP3421 Datasheet |
Register
Slave Address |
---|
0x68 - 0x6F |
MCP3421のSlave Addressは0x68〜0x6Fのものが存在し、その値は工場出荷時に決まっており、後から変更することはできません。 FaBoBrickでは、0x68、または0x69の2種類を使用しています。
Schematic
Library
for Arduino
-
ライブラリ名:「FaBo 209 KTemp MCP3421」
- Library Document
for RapberryPI
- pipからインストール
pip install FaBoKTemp_MCP3421
- Library GitHub
- Library Document
Sample Code
for Arduino
I2Cコネクタに接続したKtemp BrickにK型熱電対を接続し、熱電対から取得した値を温度に変換してシリアルモニタに出力します。
//
// FaBo Brick Sample
//
// #209 Ktemp I2C Brick
//
#include <Wire.h>
// スレーブデバイスのアドレス
int device_addr;
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("Device Check");
device_addr = address_check();
if (device_addr == 0)
{
Serial.print("device not found");
while(1);
}
Wire.beginTransmission(device_addr);
Wire.write(0x9f); // 初期設定
Wire.endTransmission();
}
byte address_check(){
byte addr;
byte error;
// MCP3421のアドレスチェック 0x68-0x6F
for(addr = 0x68; addr < 0x70; addr++ )
{
Wire.beginTransmission(addr);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device address 0x");
Serial.println(addr, HEX);
return addr;
}
}
return 0;
}
void loop() {
int32_t data;
uint8_t *p = (uint8_t *)&data;
uint8_t stat;
double mv;
int32_t uv;
uint16_t mvuv = 1 << (3+2*3);
int cp = 407; // プローブ補正値
double temp;
Wire.requestFrom(device_addr, 4);
if (Wire.available() != 4) {
Serial.println("read failed");
delay(1000);
}
for (int8_t i = 2; i >= 0; i--) {
p[i] = Wire.read();
}
p[3] = p[2] & 0x80 ? 0xff : 0;
stat = Wire.read();
Wire.endTransmission();
if ((stat & 0x80) == 0) {
mv = (double)data/mvuv;
uv = (data*1000L)/mvuv;
temp = (uv + cp) / 40.7;
Serial.print(mv);Serial.print(" mv, ");
Serial.print(uv);Serial.print(" uv, ");
Serial.print(temp);Serial.println(" C");
}
delay(500);
}
for Raspberry PI
KTemp Brickはデバイスアドレスはサンプルプログラムと異なることがあります。 (0x68〜0x6F)
i2cのセンサーを接続後、下記コマンドにて確認して下さい。
サンプルでは0x69となっていますので、異なる場合は対象のアドレスに変更してご使用下さい。
sudo i2cdetect -y 1
このサンプルは、I2Cコネクタに接続したKtemp BrickにK型熱電対を接続し、熱電対から取得した値を温度に変換してコンソールに出力します。
# coding: utf-8
#
# FaBo Brick Sample
#
# #209 Ktemp I2C Brick
#
import smbus
import time
ADDRESS = 0x69 #MCP3421 device address 環境に合ったデバイスアドレス
CHANNEL = 1
CTLREG = 0x9f
mvuv = 1 << (3+2*3)
cp = 407 #プローブ補正値
class MCP3421:
def __init__(self, bus, addr):
self.bus = smbus.SMBus(bus)
self.addr = addr
def writebyte(self, cmd, data):
self.bus.write_byte_data(self.addr, cmd, data)
def readblock(self, cmd, len):
return self.bus.read_i2c_block_data(self.addr, cmd, len)
if __name__ == '__main__':
dev = MCP3421(CHANNEL, ADDRESS)
#初期化
dev.writebyte(CTLREG,0)
while True:
#データ取得
read_data = dev.readblock(CTLREG, 4)
#取得データを結合
data = (read_data[0] << 16) + (read_data[1] << 8) + read_data[2]
#取得データを温度に変換
temp = (data *1000/mvuv + cp) / 40.7
#温度出力
print "temp:%3.2f C" % (temp)
print
time.sleep(1)
for Ichigojam
このサンプルは、I2Cコネクタに接続したKtemp BrickにK型熱電対を接続し、熱電対から取得した値を温度に変換し画面上に出力します。
10 'FaBo Brick Sample
20 '#209 Ktemp I2C Brick
30 CLS
100 'slave address #68-#6F
110 D=#68
200 'address set
210 POKE #800,#9f,0,4
300 'init
310 A=I2CW(D,#800,1,#801,1)
400 'read
410 A=I2CR(D,#800,1,#810,4)
420 IF PEEK(#810) & 0xFF THEN S=1 ELSE S=0
430 T=PEEK(#811)<<8 | PEEK(#812)
440 T=T/128*125+T%128*125/128 +500:'(T*1000)/1024+500
450 T=T/3
500 'output
510 LOCATE 0,3
520 ?"KTEMP:";
530 IF T<0 THEN T=T*-1:?"-";
540 ?T/10;".";T%10;" ":'T/10
600 'loop
610 WAIT 5
620 GOTO 410
for Edison
このサンプルは、I2Cコネクタに接続したKtemp BrickにK型熱電対を接続し、熱電対から取得した値を温度に変換してコンソールに出力します。
//
// FaBo Brick Sample
//
// #209 Ktemp I2C Brick
//
var m = require('mraa');
var i2c = new m.I2c(0);
i2c.address(0x68);
var CTLREG = 0x9f;
var mvuv = 1 << (3+2*3);
var cp = 407;
var read_data = new Buffer(4);
// init
i2c.writeReg(CTLREG, 0);
loop();
function loop()
{
// data read
read_data = i2c.readBytesReg(CTLREG, 4);
var data = (read_data[0] << 16) + (read_data[1] << 8) + read_data[2];
var temp = Math.floor((data * 1000 / mvuv + cp) / 40.7*100)/100;
console.log("temp:" + temp);
console.log("");
setTimeout(loop, 1000);
}
Parts
- Microchip Technology MCP3421