TMP006超小型赤外線サーモパイルセンサモジュールを使ってみよう

これはStrawberry Linuxで販売している温度センサーです。
8個までのアドレス設定ができるので、複数利用するには便利です。
また、簡単な計算で摂氏の温度を得ることができます。
ピン配置は下図のようになります。
I2Cアドレスの設定は左図のようになります。
ここではADR0,ADR1はグラウンドに接続して用いています。

TMP006クラス



TMP006.cs
using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;

namespace BoeBotLib
{
    public class TMP006
    {
        const byte TMP006_ADDRESS = 0x40;
        private I2CDevice.Configuration _slaveConfig;
        private const int TransactionTimeout = 1000; //ms
        private const byte ClockRateKHz = 100;
        // プロパティ
        public byte Address { get;  set; }

        // addressは0~7
        public TMP006(byte address)
        {
            Address = (byte)(TMP006_ADDRESS+address);
            _slaveConfig = new I2CDevice.Configuration(Address, ClockRateKHz);
        }

        public int Read(byte pointer)
        {       
            //                                               V/T     dummy
            I2CBus.GetInstance().WriteRegister(_slaveConfig, pointer, 0x00, TransactionTimeout);
            // get MSB and LSB result
            byte[] data = new byte[2];
            I2CBus.GetInstance().Read(_slaveConfig, data, TransactionTimeout);
            int temp = data[0] << 8 | data[1];
            return temp;
        }

        public double ReadTemperature()
        {
            while (!DataRady()) ;
            double temp = Read(1);
            //            4 * 32 
            return temp / 128;
        }

        private bool DataRady()
        {
            int data = Read(2);
            if ((data & 0x80)!=0) return true;
            return false;
        }

        public bool ConversionRate(byte n)
        {
            int now = Read(2);
            now &= 0xffff1ff;
            now |= n << 9;
            byte[] data = new byte[2];
            // 値 rate
            // 0: 1/4
            // 1: 1/2
            // 2: 1
            // 3: 2
            // 4: 4
            data[0] = (byte)((now >> 8)&0xff);
            data[1] = (byte)(now & 0xff);
            return I2CBus.GetInstance().WriteRegister(_slaveConfig,2,data,TransactionTimeout);
        }
    }
}
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 


他のソースファイルはAzimusMotionなどを参考にしてください。

メインプログラム



Program.cs
using System;
using Microsoft.SPOT;
using System.Threading;         // 追加
using Microsoft.SPOT.Hardware;  // 追加、参照設定にも追加
using GHI.OSHW.Hardware;        // 追加、参照設定にも追加
using System.IO.Ports;
using BoeBotLib;

namespace TMP006Test
{
    public class Program
    {
        public static void Main()
        {
            TMP006 ondo = new TMP006(0);
            ondo.ConversionRate(0);         // 0.5秒ごとのサンプリング
            while (true)
            {
                Debug.Print(Std.sprintf("%f",ondo.ReadTemperature()));
            }
        }
    }
}