GSM zásuvka

Po veľmi dlhom čase mam tu konečne niečo do sekcie arduino a je to znova projekt založený na GSM module SIM800L, no tento projekt môžem konečne ako prvý označiť ako kompletne hotový.

SIM800L

Dôvod výroby a použitie

Najprv chcem uviesť prečo som sa rozhodol pustiť do tohto projektu. Žijeme v dobe modernej a na našej zemi už asi nenájdeme miesto, kde by sme neboli vystavený nejakému umelému elektromagnetickému žiareniu. Neviete čo to je?

[service title=”Elektromagnetické žiarenie” icon=”icon: lightbulb-o”]je prenos energie v podobe elektromagnetického vlnenia ako napríklad Wifi, GSM alebo najnovšie LTE signál. Viac informácii o tomto žiarení nižšie v odkazoch.[/service]

Preto som sa rozhodol v domácnosti obmedziť jeho zdroje. Existujú mnohé štúdie či výskumy, ktoré buď vyvracajú alebo potvrdzujú škodlivosť tohto žiarenia. Keďže wifi používam len pre mobilne zariadenia (smartphone), nepotrebujem ho mať stále zapnutý.

Nie som si istý či wifi viem vypnúť z administratívneho menu môjho routra, ale aj keby som vedel, nepomohlo by mi to, lebo zapnúť by som ho vedel len zo zariadenia, ktoré je pripojené do siete káblom a to by nebolo príliš praktické. Preto som sa rozhodol postaviť niečo, čo budem vedieť zapnúť či vypnúť router (z elektriky).

Najjednoduchšie je vybrať router zo zásuvky ale to je aj naj nepraktickejšie, hlavne ak napájací adaptér je niekde za skriňou. Takisto nepraktické je vyrobiť niečo tlačidlové, pretože vždy tam budem musieť aj prísť. Chcel som niečo čo budem ovládať na diaľku. Wifi ovládanie som hneď vylúčil, pretože vypnutím routra sa vypne aj wifi a znova ho nezapnem. Ďalšou voľbou bolo ovládanie cez GSM, s ktorým mám skúsenosti z predchádzajúceho (ešte nedokončeného projektu) na ovládanie brány. Takže idem vyrobiť zariadenie, ktoré bude ovládané GSM sieťou prezvonením.

SIM800L

Potrebné komponenty

No a čo som použil na zostrojenie tohto projektu? Ako základ som použil Arduino nano, jedno relé, ktoré bude zapínať a vypínať router, gsm modul SIM800L s anténou a adaptér na napájanie no a samozrejme nejakú krabičku a káble a drôtiky.

Jednotlivé komponenty

Postup výroby

Ako prvé čo som si pripravil, bol zdroj napájania. Bol to 5V zdroj s 2A. Najlacnejší bol s americkými konektormi, ale to vôbec nevadilo pretože, som ho chcel aj tak rozobrať a použiť jeho vnútro. No a čuduj sa svete vnútorne komponenty neboli s konektorom napojené natvrdo, stačilo len vytiahnuť plošný spoj.

Vnutro krabičky

Keď som mal všetky plošáky vonku skúšal som ich umiestnenie vo vnútri krabičky, ako by to mohlo vo finále vyzerať a či sa vôbec vojdu do krabičky. Vošli a mohol som sa dať do ich zapájania.

Schéma zapojeniaNajprv som si napajkoval káble ku vstupným konektorom. Tie som najprv očistil pajkovacou tekutinou a tak som napajkoval potrebné drôty. Druhé konce som napájkoval na vstup plošného spoja napájania. K nim som ešte napajkoval ďalšie drôtiky. Fázu som napojil na vstup relé a nulák na výstup krabičky. Uzemnenie som prepojil priamo zo vstupu krabičky na jej výstup.

Zapojenie konektorov krabičky

Keďže napájací adaptér mal USB výstup, plánoval som ho vypajkovať no nemal som chuť sa s ním hrať preto som nechal tam. Na výstup som napajkoval drôtiky pre napájanie arduina a gsm modulu. Obe majú samostatné drotiky, pretože SIM800L musí byť napájaný samostatne, pretože arduino nepretlačí taký veľký prúd (2A), ktorý potrebuje SIM800L.

Napájanie

Zapojené komponenty

Napájanie arduina je pripojené na VIN a GND a ako výstupy som použil len 3 piny. Pin 7 slúži na ovládanie relé. A piny 5 a 6 tie sú prepojené na GSM modul. Z arduina je napájané aj samotné relé.

Samotné relé ma jeden vstup a dva výstupy. Jeden označovaný ako NO a druhy ako NC. Teda Normaly Open a Normaly Closed. Po slovensky v kľudovom stave spojené a rozpojené. Ja som použil ten rozpojený, z neho šiel kábel na výstup krabičky, na fázu.

Všetko toto som pozapájal, niečo pajkoval niečo pripojil na konektory. Jednotlive plošne spoje a kábliky som prilepil tavnou pištoľou.

[Not a valid template]

Programovanie arduina

Ako som už vyššie spomenul, ako podklad pre tento projekt som použil projekt pre otváranie brany. Použil som svoje minimalizované knižnice pre SIM800L, ktoré nájdete rovnako aj so samotným kódom programu zabalené na stiahnutie dole pod článkom. Ale poďme k samotnému kódu. Kód som sa snažil čo najviac okomentovať aby bol čo najviac zrozumiteľný. Tu len niečo málinko navyše.

Týmto riadkom povoľujete vypisovanie hlášok po seriovej linke. Ja som ho využíval na ladenie. Vo finále som ho zakomentoval aby v pamäti arduina zaberal čo najmenej miesta.

#define SERIAL_MSGS

Keďže určite nechcem aby ovládanie bolo prezvonením z hocakého čísla, urobil som ochranu, že zariadenie reaguje len na prezvonenie z konkrétneho čísla či čísel. Tie sú uložené v nasledujúcej premennej. Počet čísel je obmedzený pamäťou arduina.

char *check_number[] = {"cislo1", "cislo2"}
Počas ladenia som prišiel na to, že niektoré čísla arduino zobrazuje s kódom krajiny teda +4219 a tak ďalej a niektoré bez toho, teda 09 a tak ďalej. Prečo je to tak zatiaľ netuším. Na karte som nemal uložene žiadne čisla. Preto odporúčam najprv vyskúšať volať na zariadenie pripojené k PC a podľa toho uložiť čísla.

 

Vyvojovy diagram

Princíp prace je nasledovný:
1. Arduino kontroluje, či SIM800L zaznamenalo prichádzajúci hovor
2. Ak áno zistí či sú to povolené
3. Ak je povolené vykoná akciu a zloží hovor
4. Ak nie je povolené skladá hovor

#include <SoftwareSerial.h>                                     //kniznica pre seriovu komunikaciu
#include "SIM900.h"                                             //zakladna kniznica pre pracu s chipom SIM900
#include "call.h"                                               //kniznica zabezpecujuca telefonovanie

CallGSM call;

#define SERIAL_MSGS                                             //povolenie sprav, pre ladenie

#define RELE 7                                                  //pin pre rele
#define RELE_ON 0                                               //zapnutie relatok
#define RELE_OFF 1                                              //vypnutie relatok
boolean RELE_STAV = RELE_OFF;                                   //vychodzia poloha rele = vypnute

char number[20];                                                //tel cislo
char *check_number[] = {                                        //pole povolenych telefonnych cisiel
  "0901234567",                                                 //cislo 1
  "+421903456789",                                              //cislo 2
  "0902345678"                                                  //cislo 3
  };                                                            
byte stat;                                                      //stav prichadzajuceho hovoru 

void setup() 
  {
    Serial.begin(9600);                                         //nastavenie rychlosti seriovej komunikacie
  
    //spojenie s GSM shieldom
    vypis(1,2);                                                 //spajanie s GSM modulom
    if (gsm.begin(2400)) vypis(2,1);                            //uspesna komunikacia s GSM modulom 
    else vypis(3,1);                                            //komunikacia s GSM modulom sa nepodarila

    pinMode(RELE,OUTPUT);                                       //nastavujem pin ako vystup
    digitalWrite(RELE, RELE_STAV);                              //nastavenie vychodzieho nastavenia rele
  }

void loop()
  {
    if(call.CallStatus() == CALL_INCOM_VOICE)                   //zistuje ci niekto vola
        {
          for (byte i = 0; i < (sizeof(check_number)/2); i++)   //zistuje pocet cisel a porovnava cisla
            {
              stat = call.CallStatusNumber(number,check_number[i]);
              if(stat == CALL_INCOM_VOICE_AUTH) break;          //ak sa zhoduju cisla prerusuje a nastavi stat
            }
  
          if(stat == CALL_INCOM_VOICE_AUTH)                     //ak volalo povolene cislo
            {
              vypis(4,1);
              if(RELE_STAV == RELE_ON) RELE_STAV = RELE_OFF;    //ak je aktualne rele zapnute, nastavi vypnutie rele
              else RELE_STAV = RELE_ON;                         //ak je aktualne rele vypnute, nastavi zapnutie rele
              digitalWrite(RELE, RELE_STAV);                    //vykona akciu na rele
            }
          
          else vypis(5,1);                                      //ak volalo nepovolene cislo
    
          Serial.print(number);                                 //vypis volaneho cisla
          call.HangUp();                                        //rusi hovor
        }
  }
//funkcia pre vypis sprav
void vypis(byte msg, boolean type)
{
#ifdef SERIAL_MSGS
const char *sprava;
switch (msg)
{
case 1:
sprava = "Spajanie s GSM modulom.";
break;

case 2:
sprava = "\nStav: spojenie uspesne";
break;

case 3:
sprava = "\nStav: spojenie neuspesne";
break;

case 4:
sprava = "\nVolalo autorizovane cislo: ";
break;

case 5:
sprava = "\nVolalo neautorizovane cislo: ";
break;
}

if(type == 1) Serial.print(sprava);
if(type == 2) Serial.println(sprava);
#endif
}

Po spustení zaujímavosťou bolo to, že arduinu veľmi dlho trvalo kým sa spojí s GSM modulom. Ten už bol hodnú dobu prihlásený do siete no arduino s ním ešte nemalo nadviazane spojenie. Prečo je to tak zatiaľ netuším. Overené som to mal tak, že na GSM modul som sa už vedel dovolať ale arduino nereagovalo na prichadzajúci hovor. Skúšal som meniť rýchlosť no nemalo to efekt.

Spätná väzba

Aktuálne to ja v kóde nemám nijako ošetrené, ale zvažoval som možnosť ako vedieť či ste zariadenie na výstupe zapli alebo vypli. Ak to budete používať na wifi viete, že ste to vypli, lebo nebudete mať wifi signál, ale pri inom zariadení asi ťažko. Preto som skúšal variantu, že pre ukončením som dal delay a tok rozlíšil akciu. Presnejšie arduino ukončilo hovor po pár zazvoneniach.

Cenová kalkulácia (približná)

Arduino nano: £1.94 (2.28€)
Relé: £0.41 (0.48€)
SIM800l: £5.62 (6.6€)
Antena: £0.22 + shipping£0.66 (0.77€)
5V zdroj: £1.58 (1.86€)
Krabička (Strapubox SG 422): 9€ (poštovne cca 4€)

Ceny elektroniky mam v librách pretože tak to mam nastavene na Aliexpresse. Prepočet na eura je orientačný podľa aktuálneho kurzu. Ale je jasne vidieť, že vnútro krabičky je lacnejšie ako samotná plastová krabička. Presnejšie podľa prepočtu 10.99€ stalo vnútro (s poštovným z činy) a krabička z čiech a poštovným cca 13€. Teda spolu komplet zo všetkým to bude do 25€. Ušetriť na tomto sa už asi dá len na krabičke alebo GSM module. Na krabičke jedine tak, že sa použije jedna krabička ako zástrčka a v nej budú uložene jednotlive komponenty a z nej pôjde kábel so zásuvkou do ktorej budete zapájať potrebné zariadenie. Alebo výmenou GSM modulu. Našiel som nový modul A6 mini GSM, ktorý je lacnejší, no mne nefungoval. Asi došiel nefunkčný.

[service title=”Elektromagnetické žiarenie” icon=”icon: lightbulb-o”]SIM800L musí byť napájaný samostatne, potrebuje zdroj s 2A
Overte si formát čísel volaním na modul
Arduinu dlho trvá pokiaľ nadviaže spojenie s GSM modulom [/service]

Odkazy

Elektromagnetické žiarenie
Elektrosmog Info