Automatizace pomocí SMS zpráv – díl II.

Ještě než se pustíte do čtení, vřele Vám doporučujeme přečíst si první díl našeho seriálu, na který tento článek přímo navazuje. 

V druhém díle seriálu o automatizaci pomocí SMS zpráv si ukážeme praktickou ukázku ovládání Arduina s relé modulem pomocí SMS zprávy. Ptáte se, proč se chystáme ovládat zrovna relé modul? Vždyť spínat relé je naprosto banální věc – a máte pravdu. S aplikací a knihovnou Adeon je to totiž opravdu hračka a zároveň perfektní výchozí bod k vysvětlení důležitých funkcí Arduino knihovny. Koneckonců spínání relé je sice primitivní, avšak velmi efektivní forma automatizace. A přiznejte se, kdo z vás někdy ovládal  relátko SMSkou?

Ukázka zahrne schéma zapojení Arduina, relé modulu a GSM modulu od společnosti SIMCom. Samotná knihovna Adeon ale není závislá na konkrétním GSM modulu a můžete využít hardware libovolného výrobce GSM zařízení – musíte si ale doprogramovat komunikaci právě mezi GSM modulem a Arduinem. U modulů  SIMCom (lze zakoupit na našem e-shopu) toto řešit nemusíte, protože  jejich podpora je zabudována přímo v knihovně Adeon, tudíž je práce s nimi maximálně usnadněna.

Nezbytnou součástí ukázky je rovněž software pro Arduino. Fragmenty softwaru, které si v článku rozebereme, jsou standardně součástí knihovny Adeon. Popíšeme si základní funkce knihovny, které slouží jak pro komunikaci s GSM modulem a příjem SMS zpráv, tak pro správu uživatelů (tel. čísel) a uživatelem nastavených parametrů. 

Celý kód této ukázky naleznete zde nebo v Arduino IDE v Soubor → Příklady → Adeon → SIMComGsm.ino

Zapojení

Celá sestava se skládá pouze ze tří komponent. Jako mikrokontrolér nám poslouží Arduino Uno (1424115860). Dále použijeme již zmíněný základní jednokanálový relé modul (1517442331) a GSM modul (1557993824). 

GSM modul komunikuje s Arduinem pomocí sériového rozhraní UART, přičemž RX pin (GSM) je připojen k IO pinu 10 (Arduino) a TX pin (GSM) k IO pinu 11 (Arduino). Pro GSM modul je doporučeno použít nezávislé napájení (v tomto případě 12 V DC). Pokud je GSM napájeno nezávisle na Arduinu, je nezbytné propojit GND Arduina a GSM modulu. 

Relé modul je připojen na IO pin 6 Arduina (více informací o spínacích prvcích naleznete v tomto článku). 

Poznámka pro zvídavé: Jelikož Arduino Uno má pouze jedno sériové rozhraní UART (jednu sériovou linku), kterou využíváme pro výpis na sériový terminál v PC, musíme pro komunikaci s GSM modulem vytvořit druhou (emulovanou) sériovou linku. Využíváme k tomu knihovnu SoftwareSerial.

 

 

Aby byl GSM modul schopen se přihlásit do mobilní sítě, budeme samozřejmě potřebovat aktivní SIM kartu s dobitým kreditem či paušálem. Pro správnou funkci SIMCom modulů doporučujeme odstranit PIN kód SIM karty.

Import knihovny do Arduino IDE

Knihovna Adeon pro Arduino je k dispozici ke stažení přímo ve vývojovém prostředí Arduino IDE. Pro pokročilejší uživatele je knihovna k dispozici i ve vývojovém prostředí PlatformIO. Knihovna je rovněž dostupná k samostatnému stažení zde.

  • Spusťte vývojové prostředí Arduino IDE
  • Otevřete Manažér knihoven (Projekt → Přidat knihovnu → Spravovat knihovny)
  • Do pole vyhledávání napište Adeon
  • Klikněte na Instalace

Upozornění: Aby byl uživatel schopen přijímat SMS zprávy v kompletní podobě, je nutné provést úpravu konstanty určující velikost přijímacího zásobníku (RX bufferu) v knihovně SoftwareSerial.h, která je standardně součástí balíčku Arduino IDE. Výchozí hodnota je nastavena na 64 bytů. Pro naše účely ovšem potřebujeme maximální možnou kapacitu, tedy 256 bytů (reálná hodnota konstanty je 255). Daná konstanta je zadefinovaná v hlavičkovém souboru knihovny. Cesta k souboru je (v OS Windows) standardně v:

C:/ProgramFiles(x86)/Arduino/hardware/arduino/avr/libraries/SoftwareSerial/src/SoftwareSerial.h

Hodnotu upravte podle následující předlohy:

#define _SS_MAX_RX_BUFF 255 // RX buffer size

Software pro Arduino

V následujících odstavcích si popíšeme fragmenty kódu příkladu SIMComGsm.ino. Příklad je součástí knihovny Adeon a, jak již z názvu vyplývá, jeho implementace podporuje komunikaci s GSM moduly SIMCom.

Funkce pro přidávání uživatelů

Aby byla sestava schopna přijímat SMS zprávy, které ji odešleme z mobilní aplikace Adeon, je nezbytné, abychom své telefonní číslo zadali do programu. Během zadávání telefonního čísla do seznamu uživatelů můžeme určit jeho práva. Práva jsou celkem tři, a to ADMIN, USER a HOST. Na základě těchto oprávnění software určuje, zda je telefonní číslo oprávněné měnit hodnoty určitých parametrů.

void userInit(){
 //add users with ADMIN, USER or HOST rights 
 adeon.addUser("420123456789", ADEON_ADMIN); 
 adeon.addUser("420987654321", ADEON_HOST); 
 adeon.printUsers();
}

Funkce pro přidávání parametrů

Nyní máme zadefinované dvě telefonní čísla. Nicméně, abychom byli schopni obsahem SMS zprávy něco měnit/ovládat, musíme do programu zadat také parametry. Parametry a jejich hodnoty mohou být použity například k určení či změně stavu zařízení, které je připojeno k Arduinu. Každý parametr musí mít unikátní název, díky kterému je v seznamu identifikovatelný. Součástí parametru je rovněž proměnná nesoucí aktuální hodnotu parametru (výchozí hodnota je 0), která se v závislosti na přijímání zpráv může dynamicky měnit. 

Pro přidání nových parametrů nám poslouží dvě funkce. Funkce addParam(parametr, hodnota) přidá do seznamu parametr, na jehož změnu hodnoty není navázána žádná funkce. V takovém případě není určeno, co se má po změně hodnoty parametru stát. Můžeme tedy proměnnou hodnoty cyklicky číst a na základě čtení se rozhodnout, zda provedeme nějakou akci. V případě, že bychom chtěli při změně hodnoty parametru volat nějakou konkrétní funkci, můžeme využít metodu knihovny addParamWithCallback(funkce, parametr, hodnota), přičemž do parametru funkce zadáme, společně se standardními hodnotami, i ukazatel na funkci, která má být po změně hodnoty parametru zavolána.

Každý parametr obsahuje také informaci o tom, která skupina (skupiny) uživatelů má oprávnění jej měnit (výchozí hodnota je ADMIN). Pokud bychom chtěli přístupová práva parametru změnit, můžeme využít funkci setParamAccess(parametr, skupina).

Poznámka: Pokud má tel. číslo (uživatel) přidělené oprávnění ADMIN, může příchozí zpráva od takového čísla měnit hodnoty všech parametrů uložených v seznamu. Má-li tel. číslo oprávnění USER, jeho zprávy jsou schopné měnit pouze hodnoty parametrů s oprávněním USER a HOST. Číslo s právem HOST může manipulovat pouze s parametry s oprávněním HOST.

void paramInit(){ 
 //add parameters
 adeon.addParam(callbackLed, "LED", 0); 
 adeon.addParamWithCallback(callbackRel, "RELAY", 0);  
 adeon.setParamAccess("RELAY", ADEON_USER);
 adeon.printParams();
}

Zpracování SMS zprávy

Kontrolu výstupu GSM modulu provádí hlavní programová smyčka (loop). Ve chvíli kdy se na výstupu GSM modulu objeví údaje o přijaté SMS zprávě, Arduino je zpracuje. Zpracování výstupu probíhá ve dvou fázích – v první fázi je zjištěno telefonní číslo, od kterého zpráva pochází, v druhé fázi je z výstupu vyčleněn samotný text zprávy.

void loop() { 
 gsm->checkGsmOutput();
 if(gsm->isNewMsgAvailable()){ 
  pnBuf = gsm->getPhoneNum(); 
  msgBuf = gsm->getMsg(); 
  processMsg(); 
 }
}

V tomto momentu máme v zásobníku uloženou příchozí SMS zprávu. Následují tyto kroky: 

  1. Nejprve se musíme ujistit, zda jsou funkce Adeonu připravené na zpracování příchozí zprávy.

  2.  Pokud ano, zavolá se funkce, která ověří, zda je odesílatel zprávy přítomen v seznamu telefonních čísel. 

  3. V případě, že se zde tel. číslo nachází, přistoupíme k samotnému zpracování zprávy, které zahrnuje validaci zprávy na základě přijatého a vygenerovaného hashe. 

  4. Po provedení validace jsou ze zprávy vyjmuty jednotlivé parametry s hodnotami (zpráva jich může obsahovat několik). 

  5. Následně musí být ověřeno, zda se jedná o známé parametry uložené v programu. 

  6. Pokud jsou parametry známé, porovnají se přístupová práva odesílatele SMS s nastavenými právy pro daný parametr. 

  7. Pokud je odesílatel oprávněn s parametrem manipulovat, přepíše se v programu hodnota parametru na hodnotu z SMS zprávy. 

  8. Pokud je na parametr navázaná nějaká funkce (callback), po změně hodnoty se zavolá (využíváme pro spínání relé).

void processMsg(){ 
 Serial.println("nPROCESSING INCOMMING MSG."); 
 //simulation of incomming message  
 if(adeon.isAdeonReady()){ 
  if(adeon.isUserInAdeon(pnBuf)){ 
   Serial.println(F("PHONE NUMBER IS AUTHORIZED")); 
   Serial.println(msgBuf); 
   //parameters are parsed and their values are saved into list    adeon.parseBuf(msgBuf, adeon.getUserRightsLevel(pnBuf));    adeon.printParams(); 
  } 
  else { 
   Serial.println(F("PHONE NUMBER IS NOT AUTHORIZEDn")); 
  } 
 } 
 else{ 
  Serial.println(F("ADEON IS NOT READY TO PROCCESS NEW MESSAGE.")); 
 }
}

Sepnutí relé

Nyní už chápeme jak náš program pracuje a můžeme si konečně ukázat, jak sepnout relé. Při vytváření parametru RELAY (tedy relé) jsme na změnu hodnoty parametru navázali funkci callbackRel(). Tu si ovšem musíme nadefinovat tak, aby byla schopna relé sepnout. Stačí nám tedy podmínka, která vyhodnotí hodnotu parametru. Pokud se hodnota rovná 0, relé se sepne (použitý relé modul spíná do log. 0). V případě, že bude hodnota rozdílná od nuly, relé se rozepne.

void callbackRel(uint16_t val){ 
 //callback function which is called if value of parameter is edited  Serial.print(F("REL VAL: ")); 
 Serial.println(val); 
 Serial.println(); 
 (val == 0) ? digitalWrite(RELAY, HIGH) : digitalWrite(RELAY, LOW); 
}

Poznámka: Ke spínání relé můžete využít knihovnu SimpleRelay.

Závěr

Pokud jste se dostali až sem, pochopili jste základní funkce a podstatu aplikace Adeon a máte dobrý teoretický i praktický základ,  který vám ulehčí tvorbu aplikace pro ,,vzdálenou” automatizaci. Pro začátek si vyzkoušejte příklad SIMComGSM.ino, který jsme si rozebrali v tomto článku. Abychom vám testování daného příkladu maximálně usnadnili, můžete si z přílohy článku stáhnout konfigurační soubor pro mobilní aplikaci.

V třetím díle seriálu si uděláme takovou malou případovou studii. Program rozšíříme o více uživatelů a parametrů – představíme si funkce pro dynamické přidávání, editování a mazání uživatelů a parametrů za běhu programu a vytvoříme tak malé zařízení pro ovládání elektrické brány/vjezdových vrat. Sledujte nás nadále :-).

Další podobné články