Windows Phone 7 控制家電

  • 27654
  • 0
  • 2010-11-29

Windows Phone 7 控制家電

    你是否有在冬天的時候從暖暖的被子跑起來息燈就寑,或是跟老婆推來推去誰去關燈,或者是家人按電鈐要去按電眼開門等情境這些事我相信大家一定都有碰過。當科技越來越發達的世代我們可以從身旁取得很材料來幫助我們解決上面所述的情境事件,必境科技使終來自人類的惰性哈哈,不多說來講一下今天DIY的主題使用最新科技的東西WP7透過網路方式連線到Arduino 控制板來發送訊號給Relay達到控制110V家電電源。首先我們要取得下列材料清單如下:

1.Arduino Duemilanove :Arduino是一塊基與開放原始代碼的簡單I/O控制界面平台,並且具有使用類似java,C語言的開發環境,可以簡單應用控制電子元件例如Switch或Sensors或其他控制器、LED、步進馬達或其他輸出裝置互通溝通。

image

2.Ethernet Shield:以W5100為核心的DFRduino Ethernet網路擴展模塊,讓Arduino成為簡單的Web伺服器或者透過網路控制讀寫Arduino的I/O界面等網路應用,該擴展板採用了可堆疊的設計可直接插到Arduino上,同時我們的其他擴展板也可以插上去。

image

3.OMRON G5LA-14 Relay:使用Arduino設計控製大電流或者高電壓的設備通常無法直接用Arduino的數位I/O界面進行控制,此時採用Omron G5LA繼電器來推動250V的交流/直流設備,因此能夠用來實現控制電燈等效果。

image

以上這些東西可以到sparkfun藝科等地方取得

 

Step1:首先把Arduino跟Ethernet Shield上下pin腳相疊,接著使用粗銅線來引電到家電插頭及Relay接頭,接法如下所示基本交流沒有正負極之分,在來用細電線把Ethernet Shield跟Relay接起來分別接到5v及地線還有第四根pin腳

image

Step2:撰寫Arduino程式碼在把程式碼po到控制板執行,如果不懂的人可以參考http://arduino.cc/en/Guide/HomePage教學,程式碼如下所示基本上此控制碼是利用http格式取得參數PW的值來開啟pin腳第四根腳的電流高低,測示方法可以使用ie在網址列輸入http://192.168.16.55/?PW=ON打開家電若要關http://192.168.16.55/?PW=OFF ,接著Arduino接到指令處理後判斷第四根腳位是高或低來回傳ON或OFF字串來表示目前電源控制狀態,另外程式碼裡面的ip192, 168, 16, 55 是固定ip寫死的所以你要設定跟你的pc或是手機是同樣網段。

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 16, 55 };         

Server server(80);
int pin=4;                         
String readString = String(50);

 

void setup(){
  Ethernet.begin(mac, ip);
  pinMode(pin, OUTPUT);
  server.begin();
  Serial.begin(9600);
}
void loop(){

Client client = server.available();
  if (client) {
    while (client.connected()) {
   if (client.available()) {
    char c = client.read();
      readString.concat(c);
      if (c == '\n')
            {
         if (readString.substring(6,11) == "PW=ON")
         {

         digitalWrite(pin, HIGH);   

         }
         else if (readString.substring(6,12) == "PW=OFF")
        {

         digitalWrite(pin, LOW);    
        }

     client.println("HTTP/1.1 200 OK");
   client.println("Content-Type: text/html");
      client.println();

if (digitalRead(pin)==1)
        {
   client.println("ON");
        }
        else
        {
    client.println("OFF");
        }
        readString="";
        client.stop();
        }
        }
      }
    }
    }

 

Step3:開啟VS2010新增WindowsPhoneApplication專案在UI界面拉一個ToggleSwitch控制項,如果在工具箱沒有這元件代表你沒安裝你可以連線到http://silverlight.codeplex.com/releases/view/55034下載安裝

image

Step4:接著在MainPage貼下列程式碼來運作,我們利用toggleSwitch的Checked事件來當做打開電源Unchecked事件來關閉電源,如何透過http來發送指令及接收Arduino所回覆訊息,我們使用HttpWebRequest 及HttpWebResponse 來實作此機制。

private void Switch(string Status)
       {
           try
           {
              System.Uri uri = new Uri("http://192.168.16.55/?PW=" + Status);
              HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
              request.Method = "GET";
              request.BeginGetResponse(
                  result =>
                  {
                      HttpWebResponse response = (HttpWebResponse)((HttpWebRequest)result.AsyncState).EndGetResponse(result);
                      using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                      {
                          string responseString = reader.ReadToEnd();
                          Dispatcher.BeginInvoke(() =>
                          {
                              toggleSwitch1.IsChecked = responseString.Equals("ON");

                          });
                      }
                  }, request);
           }

           catch (Exception ex)
           {
               MessageBox.Show(ex.Message);
           }
       }

       private void toggleSwitch1_Checked(object sender, RoutedEventArgs e)
       {
           toggleSwitch1.Content = "ON";
           Switch("ON");
       }

       private void toggleSwitch1_Unchecked(object sender, RoutedEventArgs e)
       {
           toggleSwitch1.Content = "OFF";
            Switch("OFF");

       }

Step5:把程式放到模擬器上執行記得要接上網路還有ip要設定正確才有電源開關動作

 

以上是簡單應用就可以達到電源控制的問題,希望有在玩arduino的人可以來一起討論