.NET Gadgeteer – The Cooper-Hofstadter Polarization

Kdo z vás sleduje seriál The Big Bang Theory, tak si jistě pamatuje 9. díl první série, kde čtveřice našich oblíbených geeků připojí osvětlení v místnosti k internetu. Protože budeme v jedné části pracovat s napětím ze zásuvky, je tato část zapojení na vaši vlastní zodpovědnost a neměl by ji provádět nikdo bez příslušného oprávnění.

clip_image002[4]

Jak to celé funguje

Pomocí modulu s relé budeme ovládat až čtyři spotřebiče. Sepnutí jednotlivých relé pak budeme řídit zasláním zprávy na Twitter. Například zpráva 1101 přepne první, druhé a čtvrté relé.

clip_image003[4]

Co budeme potřebovat

  • USBD Client DP – napájecí modul
  • FEZ Spider – ovládání celého systému
  • Display T35 – zde budeme zobrazovat kontrolní údaje, pro aplikaci není zapotřebí
  • Ethernet J11D – modul pro připojení k internetu. Můžete také použít modul Wifi. Levnější a univerzálnější řešení pro bezdrátové připojení je ASUS WL-330gE v režimu adaptér.
  • Relay Module – tento modul obsahuje 4 relé a kontrolní LED

clip_image005[4]

  • Twitter účet
  • Elektroinstalační materiál – zásuvky, svorkovnice, kabely, montážní krabici

Síťová komunikace

Upozornění: V době psaní tohoto článku obsahuje knihovna pro práci s ethernet modulem chybu. Síťová komunikace se nastartuje pouze v případě, když ethernetový kabel připojíte až v době, kdy je aplikace spuštěna. Pokud aplikaci spustíte s připojeným ethernetovým kabelem, tak nebude síťová komunikace fungovat.

.NET Gadgeteer je od začátku určen pro začátečníky, takže i práce se sítí je maximálně zjednodušena pomocí podpůrných objektů. Tyto objekty najdete ve jmenném prostoru Gadgeteer.Networking. V našem příkladu používáme desku FEZ Spider a modul J11D, který je v podstatě jen ethernet konektor. Konektor E je podle specifikace přímo ethernet rozhraní. Pokud byste chtěli použít FEY Hydra musíte mít modul ENC28, který obsahuje i příslušnou elektroniku a připojuje se na konektor S, protože FEZ Hydra nemá konektor E.

Kromě modulů pro ethernet existují i moduly pro Wifi. Wifi modul můžete snadno nahradit externím zařízením. Já jsme použil ASUS WL-330gE, který je nakonfigurován v režimu adaptér, takže se v podstatě chová jako Wifi modul připojený na ethernet.

 _hr = HttpHelper.CreateHttpGetRequest("http://search.twitter.com/search.atom?q=" + _user + "&rpp=5&include_entities=true&result_type=mixed");
 _hr.ResponseReceived += new HttpRequest.ResponseHandler(_hr_ResponseReceived);
 // odeslání požadavku
 _hr.SendRequest();

Ovládání zásuvek

K ovládání zásuvek využijeme modul relé. Tento modul může ovládat čtyři relé, která jsou dostatečně dimenzována i na napětí v zásuvkách a povolují i dostatečný odběr proudu. U každého relé je navíc kontrolní dioda, která indikuje stav relé. Relé má jeden vstup označený jako CO. V základním stavu, je tento vstup spojen s výstupem označeným NC (Normally Connected) . Pokud přepnete relé, tak se rozsvítí LED, výstup NC se odpojí a CO propojí s NO (Normally Open). Při zapojování relé vkládám mezi jednotlivé příkazy malou pauzu kvůli zamezení případné proudové špičky, kterou by mohlo sepnutí čtyř relé vyvolat.

 relays.Relay1 = lastTweet[0] == '1';
 Thread.Sleep(100);
 relays.Relay2 = lastTweet[1] == '1';
 Thread.Sleep(100);
 relays.Relay3 = lastTweet[2] == '1';
 Thread.Sleep(100);
 relays.Relay4 = lastTweet[3] == '1'; 

clip_image007[4]

Zapojení silové části

Twitter API

Tuto část můžete jakkoliv změnit. Já jsem použil Twitter Search API. Hledám jméno uživatele, a pokud zpráva obsahuje jen 4 znaky, tak ji beru jako příkaz pro přepnutí relé. Samozřejmě můžete toto hledání změnit třeba za hledání nějakého hashtag.

Zdrojový kód

 using System;
 using System.Threading;
 using Microsoft.SPOT;
 using Microsoft.SPOT.Presentation;
 using Microsoft.SPOT.Presentation.Controls;
 using Microsoft.SPOT.Presentation.Media;
 using Microsoft.SPOT.Touch;
  
 using Gadgeteer.Networking;
 using GT = Gadgeteer;
 using GTM = Gadgeteer.Modules;
 using Gadgeteer.Modules.GHIElectronics;
 using System.Net;
  
 using System.Xml;
 using Gadgeteer.Modules.Seeed;
  
 namespace NetworkBasics
 {
     public partial class Program
     {
         private HttpRequest _hr = null;
         private uint _line = 1;
         private uint _lineHeight = 14;
  
         private string _lastSetup = string.Empty;
  
         private string _user = "stepanb";
  
         // Časovač
         private GT.Timer _timer = new GT.Timer(30000);
  
         void ProgramStarted()
         {            
             Debug.Print("Program starting...");
  
             _timer.Tick += new GT.Timer.TickEventHandler(_timer_Tick);
  
             // události připojení/odpojení ethernetového kabelu
             ethernet.NetworkUp += new GTM.Module.NetworkModule.NetworkEventHandler(ethernet_NetworkUp);
             ethernet.NetworkDown += new GTM.Module.NetworkModule.NetworkEventHandler(ethernet_NetworkDown);
  
             
             // nepřipojujte ethernetový kabel dřív, než bude na displeji tento text
             display.SimpleGraphics.DisplayText("Program Started", (Font)Resources.GetFont(Resources.FontResources.Arial10), GT.Color.White, 10, _lineHeight * _line++);
             
             Debug.Print("Program Started");
         }
  
         void _timer_Tick(GT.Timer timer)
         {
             // příprava objektu pro http komunikaci
             // Twitter API - https://dev.twitter.com/
             _hr = HttpHelper.CreateHttpGetRequest("http://search.twitter.com/search.atom?q=" + _user + "&rpp=5&include_entities=true&result_type=mixed");
             _hr.ResponseReceived += new HttpRequest.ResponseHandler(_hr_ResponseReceived);
  
             // odeslání požadavku
             _hr.SendRequest();            
         }
  
         // při ztrátě připojení, přepneme včechna relé do výchozí polohy
         void ethernet_NetworkDown(GTM.Module.NetworkModule sender, GTM.Module.NetworkModule.NetworkState state)
         {
             // pozastavení časovače
             _timer.Stop();
  
             _lastSetup = string.Empty;
  
             relays.Relay1 = false;
             relays.Relay2 = false;
             relays.Relay3 = false;
             relays.Relay4 = false;  
         }
  
         
         // připojení k ethernetu
         void ethernet_NetworkUp(GTM.Module.NetworkModule sender, GTM.Module.NetworkModule.NetworkState state)
         {
             // vypsání IP adresy pro kontrolu
             display.SimpleGraphics.DisplayText(ethernet.NetworkSettings.IPAddress, (Font)Resources.GetFont(Resources.FontResources.Arial10), GT.Color.White, 10, _lineHeight * _line++);
  
             // nastartování časovače
             _timer.Start();
         }
  
         // zpracování odpovědi z Twitter
         void _hr_ResponseReceived(HttpRequest sender, HttpResponse response)
         {
             if (response.StatusCode != "200")
             {
                 return;
             }
  
             
  
             XmlReader reader = XmlReader.Create(response.Stream);
             reader.MoveToContent();
  
             string lastTweet = string.Empty;
             
             while (reader.Read())
             {
                 // zajímá nás pouze obsah elementu content 
                 if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "content"))
                 {
                     lastTweet = reader.ReadElementString();
                     
                     // zajímájí nás jen Tweety délky 4 znaky 
                     if (lastTweet.Length == 4)
                     {
                         break;
                     }
                 }                
             }
  
             response.Stream.Close();
  
             if ((lastTweet.Length != 4) || lastTweet == _lastSetup)
             {
                 return;
             }
  
             _lastSetup = lastTweet;
  
             // kontrolní výpis na displej
             display.SimpleGraphics.DisplayText(lastTweet, (Font)Resources.GetFont(Resources.FontResources.Arial10), GT.Color.Red, 10, _lineHeight * _line++);
  
             // nastavení relé
             // zapínáme preventivně postupně
             relays.Relay1 = lastTweet[0] == '1';
             Thread.Sleep(100);
             relays.Relay2 = lastTweet[1] == '1';
             Thread.Sleep(100);
             relays.Relay3 = lastTweet[2] == '1';
             Thread.Sleep(100);
             relays.Relay4 = lastTweet[3] == '1';            
         }
     }
 }

Štěpán

NetworkBasics.zip