.NET Gadgeteer デモ ~ 簡易ウェザーステーション

.NET Gadgeteer のデモ、今回は簡易ウェザーステーションです。周囲の気温、気圧を測定していて Webサーバーとしても動作しているので、クライアントからの要求に応じて測定値を返します。
それっぽい(?)デモで、.NET Gadgeteer の実力を見ていただけると思います。
※しかも、後ろに載せるソースコードを見ると、この程度のデバイスならば簡単に作れるかが分かると思います。

このデモは Windows 女子部の勉強会でお見せしたかったんですが、当日は動作しませんでした。多分接続するソケットを間違えたとか差し込み方が不十分だったかのどちらかだと思います。残念・・・。

 

今回使うのはもっとも低スペックの Cerberus ですが、複数のモジュールを接続して Webサーバーとしても動作させるデバイスをコストをかけなくても簡単に作れますよという実例で、これなら Gadgeteer を始めてみようかなとと思っていただけるようなデモにしてみました。

 

接続はこんな風にします。

image

Visual Studio のデザイナー画面では Ethernet モジュールは配置できないのですが 6番ソケットに接続するとちゃんと動作します。これについては ドキュメント を見ると書いてあります。
※Ethernet モジュールをデザイナー画面で使えないのはメインボードに TCP/IP のスタック層までのライブラリーが含まれているからというのが理由です。

 

ソースコードは以下の通り。これが全てのソースコードです。キャラクターディスプレイに IP アドレスを表示したり、Web のリクエストが来たら LED のアニメーションをしたりと、本質以外の処理も含まれていますが、それでもこれだけのコードで完成です。

 

  1. using System;
  2. using System.Net;
  3. using System.Text;
  4. using System.Threading;
  5. using Microsoft.SPOT;
  6. using Microsoft.SPOT.Net.NetworkInformation;
  7. using GTM = Gadgeteer.Modules;
  8.  
  9. namespace WeatherDemo01
  10. {
  11.     public partial class Program
  12.     {
  13.         private double _pressure;
  14.         private double _temperature;
  15.  
  16.         // This method is run when the mainboard is powered up or reset.   
  17.         void ProgramStarted()
  18.         {
  19.             InitializeNetwork();
  20.  
  21.             barometer.ContinuousMeasurementInterval = new TimeSpan(0, 0, 1);
  22.             barometer.MeasurementComplete += barometer_MeasurementComplete;
  23.             barometer.StartContinuousMeasurements();
  24.  
  25.             new Thread(RunWebServer).Start();
  26.  
  27.             // Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
  28.             Debug.Print("Program Started");
  29.         }
  30.  
  31.         void barometer_MeasurementComplete(GTM.Seeed.Barometer sender,
  32.             GTM.Seeed.Barometer.SensorData sensorData)
  33.         {
  34.             _pressure = sensorData.Pressure;
  35.             _temperature = sensorData.Temperature;
  36.         }
  37.  
  38.         private void DoResponse(HttpListenerContext context)
  39.         {
  40.             var str = "<html><head><title>Barometer</title><body><h1>Barometer</h1>" +
  41.                 "<p>Pressure    = " + _pressure.ToString() + "</p>" +
  42.                 "<p>Temperature = " + _temperature.ToString() + "</p>" +
  43.                 "</body>";
  44.             var outBuffer = Encoding.UTF8.GetBytes(str);
  45.  
  46.             var response = context.Response;
  47.             response.OutputStream.Write(outBuffer, 0, outBuffer.Length);
  48.         }
  49.  
  50.         private void RunWebServer()
  51.         {
  52.             var listener = new HttpListener("http");
  53.             listener.Start();
  54.  
  55.             while (true)
  56.             {
  57.                 HttpListenerResponse response = null;
  58.                 try
  59.                 {
  60.                     var context = listener.GetContext();
  61.                     response = context.Response;
  62.                     var request = context.Request;
  63.                     if (request.HttpMethod.ToUpper() == "GET")
  64.                     {
  65.                         led7r.Animate(100, true, true, false);
  66.                         DoResponse(context);
  67.                     }
  68.                 }
  69.                 finally
  70.                 {
  71.                     if (response != null)
  72.                     {
  73.                         response.Close();
  74.                     }
  75.                     led7r.Animate(100, true, true, false);
  76.                     led7r.TurnLightOff(6);
  77.                 }
  78.             }
  79.         }
  80.  
  81.         private void InitializeNetwork()
  82.         {
  83.             char_Display.SetBacklight(false);
  84.             char_Display.Clear();
  85.  
  86.             Debug.Print("Initializing network…");
  87.             var netif = NetworkInterface.GetAllNetworkInterfaces()[0];
  88.             netif.EnableStaticIP("192.168.10.201", "255.255.255.0", "");
  89.  
  90.             Debug.Print("Network ready.");
  91.             Debug.Print("  IP Address: " + netif.IPAddress);
  92.             Debug.Print("  Subnet Mask: " + netif.SubnetMask);
  93.  
  94.             Thread.Sleep(1000);
  95.             char_Display.PrintString(netif.IPAddress.ToString());
  96.             char_Display.SetBacklight(true);
  97.         }
  98.     }
  99. }

今回は環境の都合で(というか、このデモのために DHCP を組むのが面倒だったからw)固定IP を使いましたが、DHCP にすることもできます。いずれにしても InitializeNetwork メソッドがネットワーク周りの初期化の参考になると思います。

Web サーバー機能については、RunWebServer メソッドおよび DoResponse メソッドです。RunWebServer は専用のスレッドで実行しています。

 

・・・くらいしか説明できない程度に簡単なコードです。それでこんなデバイスの完成です。

 

ブラウザーからのリクエストで LED がクルクルしたり、センサーを指先で温めるとちゃんと温度(と気圧)が上がっていくのが分かると思います。

今回は Webサーバーとして動作させていますが、HttpClient を使って Azure 上の Web サービスにデータを定期的に送信する、とすればセンサークラウドを実現できますね。

 

「こんなに簡単に作れていいの?」というくらい簡単なコーディングです。.NET Micro Framework と .NET Gadgeteer の実力ですね。これで組み込み開発の敷居が下がってたくさんの人が興味を持ってくれるといいなと思ってます。

広告
カテゴリー: .NET Micro Framework タグ: , パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中