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