2011年6月17日金曜日

Netduinoで温度計

Netduinoで温度計を試してみました
使った温度センサは
MCP9700というもの
秋月で売ってます

さて
ソースコード↓

using System.IO.Ports;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;

namespace NetduinoPlusApplication1
{
    public class Program
    {
        public static AnalogInput an = new AnalogInput(Pins.GPIO_PIN_A0);

        public static SerialPort serial1 = new SerialPort(SerialPorts.COM1, 9600, Parity.None, 8, StopBits.One);

        public static void Main()
        {
            serial1.Open();

            for (; ; )
            {
                byte[] bu = new byte[1];
                serial1.Read(bu, 0, 1);
                if (bu[0] == (byte)'S')
                {
                    string s = (((an.Read() * 0.00322265625) - 0.5) * 100).ToString();
                    while (s.Length > 6) { s = s.Substring(0, s.Length - 1); }
                    s += "\r\n";
                    SerialWrite(s);
                }
            }
        }

        public static void SerialWrite(string text)
        {
            byte[] data = new byte[text.Length];

            for (int i = 0; i < text.Length; i++) { data[i] = (byte)text[i]; }

            serial1.Write(data, 0, data.Length);
        }
    }
}

COM1に S (半角大文字のエス)を受け取った場合に温度データを返します

Netduinoの場合
0Vが0 / 3.3Vが1023 を返します
使用した温度センサは0Vの時に0.5Vを出力し (0Vじゃなくて0℃です:2011/06/22)
温度が1度上がるごとに0.1V上昇するので
(((アナログ数値 * (3.3 / 1024)) - 0.5) * 100) == 温度
となります
例えば220が出てきた場合
((220 * (3.3 / 1 024)) - 0.5) * 100 = 20.8984375
となり 約21度ということです

SerialWrite関数は文字列を渡すだけでシリアル送信するようにしています

また送信する文字列に\r\nを含めることによりPC側のプログラムを簡略化しています


PC側は今回はコードを載せませんが
serialPort1.Write("S");
string data = serialPort1.ReadLine();
としておけば文字列dataに温度データが入ります
ただしButtonをトリガにした場合正常に接続されていないとフォームが固まる可能性があります
(試してはいません)

以前にこのブログで書いたようにC#でTwitterにポストするコードを組み合わせれば
温度を計測しTwitterにつぶやくことも可能です
ただし気象庁から許可されていない計測機器を使用して不特定多数に公開した場合罰せられる場合があるようですので各自自己責任でお願いします


温度センサのデータシート
http://ww1.microchip.com/downloads/en/DeviceDoc/21942e.pdf
(日本語版もありますがパッケージが違うのであまり役に立ちませんでした)

1ピン Netduino3.3
2ピン NetduinoA0
3ピン NetduinoGND
に接続します
また1ピンと3ピンの間にパスコン(0.1μF)を接続することが推奨されているようです

0 件のコメント:

コメントを投稿