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