Arduino GSM Shield obsahuje GSM modul SIM900. Tento populární obvod od firmy Simcom nám umožňuje vytvořit z Arduina vlastní mobilní telefon. Můžeme tedy pomocí Arduina volat na různá telefonní čísla, zároveň i hovory přijímat a to samé se SMS zprávami. Dále je možné se pomocí GPRS připojit na Internet, avšak tato funkce není součástí tohoto návodu. Díky podpoře Quad-Band (850/900/1800/1900 MHz) je možné používat modul téměř po celém světě. Komunikace s Arduinem probíhá přes sériovou linku pomocí AT příkazů.

Arduino GSM Shield SIM900

Pro úspěšné propojení GSM Shieldu s Arduinem tedy stačí vespod GSM shieldu vložit SIM kartu (je nutné odstranit zadávání PINu) a do desky Arduino Uno (či jiné kompatibilní) zapojit Shield. Na některých Shieldech lze pomocí propojek nastavit ručně piny TX a RX pro komunikaci se senzorem, u novějších jsou to pak většinou piny 7 a 8. A jako třetí je použit pin 9 pro zapínání napájení pro GSM modul.

Pokud byste chtěli využít GSM shield na jiných deskách, tak na deskách Mega a Mega 2560 je možné pro pin RX využít pouze tyto piny: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69). A na deskách Leonardo a Micro lze pro pin RX využít tyto piny: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

Schéma zapojení Arduino GSM Shieldu SIM900

Pro správnou funkci uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu GPRS_SIM900, návod jak na to je uveden zde. Ukázkový kód obsahuje na svém začátku připojení potřebných knihoven a poté nastavení propojovacích pinů a rychlosti komunikace se SIM modulem. Jako další jsou vytvořeny proměnné jako detekované číslo, se kterým budeme ovládat modul, a proměnné pro práci se SMS zprávami. Následně provedeme inicializaci modulu SIM900 z knihovny. V podprogramu setup zahájíme komunikaci po sériové lince pro výpis ladících informací a následně provedeme kontrolu napájení pro SIM modul. Pokud je modul vypnutý, provedeme jeho zapnutí a poté vyčkáme ve smyčce while na kompletní inicializaci modulu. Pokud by se nedařilo navázat spojení se SIM modulem, budeme dostávat každou vteřinu informaci o chybě inicializace. Po úspěšné inicializaci se posuneme do hlavní smyčky loop, kde jako první načteme aktuální čas od spuštění napájení a převedeme si ho na textový tvar, který je poté použit při odesílání SMS odezvy. Následují ukázky různých funkcí modulu SIM900. Jako první je uvedena ukázka načtení počtu nepřečtených zpráv a v případě existence alespoň jedné nepřečtené zprávy si nejprve do proměnných načteme všechny informace, následně zprávu smažeme a vytiskneme po sériové lince všechny dostupné informace. Poté proběhne kontrola, jestli zpráva přišla od našeho nastaveného čísla a v případě že ano, tak jestli obsahuje očekávaný text „Ahoj“ nebo „Zavolej“. Pokud jsou obě podmínky splněny, vypíšeme hlášku o přijaté zprávě, u zprávy „Zavolej“ také zavoláme na nastavené číslo. V opačném případě si vypíšeme chybovou hlášku. Druhá ukázka funkce modulu SIM900 souvisí s detekcí telefonátu. Pokud je tedy splněna if podmínka o příchozím hovoru, vytiskneme si po sériové lince číslo volajícího a následně po jedné sekundě zavěsíme. Poté zkontrolujeme, jestli se číslo volaného shoduje s naším nastaveným a pokud tato podmínka platí, načteme si v našem příkladu hodnotu z analogového portu A0 a vytvoříme odpověď obsahující čas od spuštění a naměřenou hodnotu z portu A0. Následně ji převedeme na formát vhodný pro SIM modul a odešleme na uložené telefonní číslo. Pokud by byl detekován hovor od cizího čísla, dostaneme o tomto pouze informaci po sériové lince. Na konci programu se nachází už jen krátká pauza před novým během smyčky loop.

// SIM 900 GSM Shield

// připojení potřebných knihoven
#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>
// nastavení propojovacích pinů a rychlosti
// komunikace se SIM modulem,
// novější Shieldy používají pro
// komunikaci TX a RX piny 7 a 8
#define pinTX 2
#define pinRX 3
#define pinPower 9
#define rychlostSim 9600
// vytvoření proměnné s detekovaným číslem
char mojeCislo[16] = "+420721******";
// vytvoření proměnných pro práci s SMS
#define delkaZpravy 160
char smsZprava[delkaZpravy];
int smsIndex = 0;
char telCislo[16];
char casDatum[24];
// inicializace SIM900 modulu z knihovny
GPRS sim900(pinTX, pinRX, rychlostSim);

void setup() {
  // zahájení komunikace po sériové lince
  Serial.begin(9600);
  // kontrola napájení modulu SIM900,
  // v případě vypnutého modulu ho zapneme
  if(!sim900.checkPowerUp()) {
    sim900.powerUpDown(pinPower);
  }
  // vyčkávací smyčka, dokud není správně nainicializován
  // SIM modul
  while(!sim900.init()) {
      Serial.println("Chyba inicializace!");
      delay(1000);
  }
  delay(2000);  
  Serial.println("Inicializace uspesna!");
}

void loop() {
  // načtení a přepočet času od spuštění Arduina
  // do tvaru 1h2m3s
  long cas = millis()/1000;
  long casSekundy = cas % 60;
  long casMinuty = (cas / 60) % 60;
  long casHodiny = cas / 3600;
  String casKomplet = String(casHodiny);
  casKomplet += "h";
  casKomplet += String(casMinuty);
  casKomplet += "m";
  casKomplet += String(casSekundy);
  casKomplet += "s";
  // kontrola SMS zpráv - načtení počtu nepřečtených zpráv
  smsIndex = sim900.isSMSunread();
  // pokud existuje alespoň jedna nepřečtená zpráva,
  // provedeme její přečtení a detekci textu
  if (smsIndex > 0) {
    // načtení SMS zprávy do proměnných ve funkci
    sim900.readSMS(smsIndex, smsZprava, delkaZpravy, telCislo, casDatum);
    // vymazání aktuálně přečtené zprávy
    sim900.deleteSMS(smsIndex);
    // vytištění informací o přijaté SMS zprávě
    Serial.print("Od cisla: ");
    Serial.println(telCislo);  
    Serial.print("Datum a cas: ");
    Serial.println(casDatum);
    Serial.print("Zprava: ");
    Serial.println(smsZprava);
    // kontrola přijetí SMS zprávy od našeho nastaveného čísla
    // strcmp porovná 2 stringy a nula znamená počet odlišných znaků
    if (strcmp(telCislo, mojeCislo)==0) {
      // proměnná s detekovaným textem v SMS zprávě
      char mojeZprava1[delkaZpravy] = "Ahoj";
      char mojeZprava2[delkaZpravy] = "Zavolej";
      // kontrola přijetí detekovaného textu
      if (strcmp(smsZprava, mojeZprava1)==0) {
        Serial.println("Prijata zprava Ahoj!");
      }
      else if (strcmp(smsZprava, mojeZprava2)==0) {
        Serial.println("Prijata zprava Zavolej, tak volam!");
        sim900.callUp(mojeCislo);
      }
      else {
        Serial.println("Prijata neznama zprava.");
      }
    }
    else {
        Serial.println("Prijata neznama zprava od neznameho cisla.");
    }
  }
  // kontrola příchozího hovoru s uložením čísla do proměnné
  if(sim900.isCallActive(telCislo)) {
    // vytištění informací o příchozím hovoru
    Serial.print("Vola cislo: ");
    Serial.println(telCislo);
    // pauza po dobu 1 sekundy a následné zavěšení hovoru
    delay(1000);
    sim900.hangup();
    // kontrola hovoru od našeho nastaveného čísla
    if (strcmp(telCislo, mojeCislo)==0) {
      // vytištění informace o poslání zprávy
      Serial.println("Zname cislo, odeslana SMS.");
      // načtení hodnoty analogového pinu
      // do proměnné typu String
      String analog = String(analogRead(A0));
      // složení celé zprávy do proměnné odpoved
      String odpoved = "Cas od spusteni: ";
      odpoved += casKomplet;
      odpoved += " vterin. A0: ";
      odpoved += analog;
      // převedení textu na proměnnou kompatibilní se SIM modulem
      odpoved.toCharArray(smsZprava, 160);
      // poslání SMS zprávy na nastavené číslo
      sim900.sendSMS(telCislo, smsZprava);
    }
    else {
      // vytištění informací o volání neznámého čísla
      Serial.println("Nezname cislo - bez odezvy.");
      Serial.print("Ulozene : ");
      Serial.println(mojeCislo);
      Serial.print("Volajici: ");
      Serial.println(telCislo);
    }
  }
  // krátká pauza před novou komunikací se SIM modulem
  delay(10);
}

Po nahrání ukázkového kódu do Arduino desky s připojeným GSM Shieldem dostaneme například tento výsledek:

Schéma zapojení Arduino GSM Shield SIM900 SMS

Arduino GSM Shield s modulem SIM900 je velice šikovný komunikační doplněk, který nám umožňuje doplnit Arduino o funkce mobilního telefonu. Můžeme ho pak využívat pro dálkovou kontrolu a ovládání různých zařízení, kdy může reagovat jak na příchozí nastavovací zprávy, tak jen na jednoduché prozvonění. A to vše samozřejmě jen u povolených telefonních čísel.

 

Seznam použitých komponent:

http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html

http://dratek.cz/arduino/1215-arduino-gprs-gsm-shield-sim900-850-900-1800-1-1458073747.html

nebo

http://dratek.cz/arduino/905-arduino-gsm-shield-1420739952.html

FB tw

Další podobné články