GSM modul SIM900, Avtomatsko pošiljanje SMS sporočila ob nastanku požara

V tem poglavju bomo prikazali različne metode interakcije med razvojno ploščo Arduino Uno in mobilnim omrežjem GSM (Global System for Mobile communications) z uporabo razvojne plošče GSM/GPRS SIM900 proizvajalca SIMCOM. Omogoča nam pošiljanje ali sprejemanje podatkov iz oddaljenega kraja s pomočjo pametnega telefona. GPRS (General Packet Radio Service) je mobilna podatkovna storitev v okviru standarda GSM).

Razvojna plošča GSM/GPRS SIM900 ima enak razpored pinov (pinout) kot razvojna plošča Arduino Uno, zato jo lahko enostavno priključimo nanjo. Z Arduino Uno komunicira preko UART s pošiljanjem ukazov AT (attention).

Slika 1: Razvojna plošča GSM/GPRS SIM900 (vir: http://www.geeetech.com/wiki/images/6/63/GPRS1.jpg)

Poleg nastavitve razvojne plošče z SIM900 bomo:

Glavne zahteve za delovanje modula SIM900:

Modul SIM900 lahko vklapljamo (ON) in izklapljamo (OFF) s stikalom PWRKEY, ki se nahaja ob robu ploščice. Ob vklopu napetostnega napajanja z adapterjem je privzeto stanje tega stikala OFF. Če hočemo zagnati program, napisan v okolju Arduino, moramo postaviti pin 9 (D9) za 1 sekundo v stanje logične 1 in po izvršitvi ponovno postaviti za 1 sekundo v stanje logične 1, da ga spravimo v sleep mode (v tem stanju je poraba modula SIM900 zelo mala, okoli 1,5 mA).

Po opravljenih nastavitvah priključimo naš modul v mobilno omrežje:

Slika 2: Vključitev knjižnice in določitev pinov za komunikacijo

Sedaj lahko vzpostavimo telefonski klic na izbrano telefonsko številko.

Program:

/*

  Arduino Uno in modul GSM/GPRS SIM900.

  Klicanje izbrane telefonske številke. 

 */

 #include <SoftwareSerial.h>            //Uvoz knjižnice SoftwareSerial.

 SoftwareSerial Modul_SIM900(7, 8);   //GSM modul SIM900 => Pin 7 RX, Pin 8 TX.

 void setup()

 {

   Modul_SIM900.begin(19200);    //Komunikacija 19200 bit/s.

   Modul_SIM900_ON_OFF();       //Klicanje funkcije za vklop (ON) modula SIM900.

   delay(10000);                        //Čas, da se SIM900 vključi v omrežje.

 }

 

 void Modul_SIM900_ON_OFF()

 //Programska koda, ki nadomešča pritiskanje na stikalo PWRKEY:

 {

   digitalWrite(9, HIGH);     //Pin 9 za 1 sekundo v stanje logične 1.

   delay(1000);

   digitalWrite(9, LOW);     //Po 1 sekundi na pin 9 pošljemo logično 0.

   delay(5000);                 //Čas za vključitev v mobilno omrežje. Če je potrebno, ta čas podaljšamo.

 }

 //Programska koda za klicanje izbrane telefonske številke:

 void Telefonski_Klic()

 {   

    Modul_SIM900.println("ATD + +38641xxxxxx;");     //Klicanje telef. št. 386xxxxxxxx. (Mobilna št. 041xxxxxx, Slovenija 386).

    delay(100);

    Modul_SIM900.println();            //Na koncu moramo poslati prazni niz, da začne modul klicati izbrano številko.

    delay(20000);                      //Počakaj 20 sekund. Daljši je čas, dalj časa zvoni.

    Modul_SIM900.println("ATH");       //Prekini klicanje.  

 }

 

 void loop()

 {  

   Telefonski_Klic();         //Klic funkcije za klicanje izbrane telefonske številke.

   Modul_SIM900_ON_OFF();     //Izklopi (OFF) modul SIM900.

   while(1==1)

   {    

     delay(10);

   } 

 }

Z vklučitvijo knjižnice SoftwareSerial smo kreirali serijski port, preko katerega komunicirata Arduino Uno in modul SIM900. V naših vajah bomo uporabljali pin 7 za RX in pin 8 za TX. Serijsko komunikacijo smo zagnali v nastavitveni funkciji void setup(). S klicanjem funkcije Modul_SIM900_ON_OFF smo vklopili (ON) modul SIM900 tako, da smo za 1 sekundo postavili pin 9 v stanje logične 1. Z zakasnitvijo 10 s v nastavitveni funkciji void setup() smo določili čas, ki ga ima modul SIM900 na razpolago, da se poveže z mobilnim omrežjem. Če se v tem času ne poveže (zelena LED dioda mora utripati vsake 3 sekunde), ta čas podaljšamo.

Iz glavne funkcije void loop() najprej kličemo funkcijo za klicanje izbrane telefonske številke (Telefonski_Klic()). V njej se izvede klicanje izbrane telefonske številke tako, da modulu SIM900 pošljemo tekstovni niz, ki ga sestavlja AT ukaza. AT ukazi so "jezik" za modeme, ki se uporabljajo za različna opravila. Mi smo uporabili ukaz ATD za klicanje (AT ... D za klicanje) napisane telefonske številke. Telefonska številka mora biti v svetovnem formatu. Če kličemo v območju Slovenije, moramo najprej vpisati karakteristično številko za Slovenijo, ki je 386. Nato smo določili čas (delay (20000)), kako dolgo naj kliče izbrano telefonsko številko. Če ta čas podaljšamo, bo pri prejemniku klica telefon dalj časa zvonil.

V glavni zanki void loop() smo nato poklicali funkcijo Modul_SIM900_ON_OFF za izklop modula (sleep mode). Da ne pride do ponovnega klica izbrane telefonske številke, smo dodali zanko while(1==1), v kateri se vrti program, dokler je razvojna plošča Arduino Uno vklopljena oziroma dokler je ne resetiramo s pritiskom na tipko Reset.  Če hočemo ponovno poklicati na izbrano telefonsko številko, moramo ponovno naložiti program v razvojno ploščo Arduino Uno, ali pa pritisnemo na tipko Reset na razvojni plošči Arduino Uno.

Pošiljanje SMS sporočila na izbrano številko mobilnega telefona.

Program:

 /*

  Arduino Uno in modul GSM/GPRS SIM900.

  Pošiljanje SMS sporočila na izbrano številko mobilnega telefona. 

 */

 #include <SoftwareSerial.h>         //Uvoz knjižnice SoftwareSerial.

 SoftwareSerial ModulSIM900(7, 8);   //GSM modul SIM900 => Pin 7 RX, Pin 8 TX.

 void setup() 

 {

   ModulSIM900.begin(19200);      //Komunikacija 19200 bit/s.

   ModulSIM900_Vklop_Izklop();         //Klicanje funkcije za vklop (ON) modula SIM900.

   delay(10000);                        //Čas, da se SIM900 vključi v omrežje.

 }

 void ModulSIM900_Vklop_Izklop()

 /*

  GSM modul lahko vklopimo (ON) in izklopimo (OFF) s stikalom (Power), ki je nameščeno na modulu.

  Privzeti način je stanje OFF. Lahko pa to storimo programsko:

  Za vklop (ON) v programu postavimo pin 9 za 1 sekundo v stanje logične 1. Enako storimo za

  izklop (OFF), če je bil modul pred tem v stanju ON:

 */

 {

   digitalWrite(9, HIGH);

   delay(1000);

   digitalWrite(9, LOW);

   delay(5000);

 }

 //Funkcija za pošiljanje SMS sporočila:

 void Poslji_SMS()

 {

   ModulSIM900.print("AT+CMGF=1\r");            //AT ukaz za pošiljanje SMS spročila (1 => text mode, \r => začni skrajno levo).

   delay(100);

   ModulSIM900.println("AT + CMGS = \"+38641xxxxxx\"");     //Mobilna številka prejemnika SMS sporočila, mednarodna oznaka.

   delay(100);

   ModulSIM900.println("Pozdravlja vas Arduino Uno.");      //Besedilo sporočila.

   delay(100);

   ModulSIM900.println((char)26);                           //AT ukaz za konec pošiljanje SMS sporočila => ASCII koda 26.

   delay(5000);                                             //Čas za pošiljanje SMS sporočila.

 }

 void loop()       //Glavna zanka.

 {

   Poslji_SMS();

   ModulSIM900_Vklop_Izklop();      //Klicanje funkcije za izklop modula SIM900. 

   while (1==1)

   {

     delay(10);

   }

 }

V funkciji Poslji_SMS() smo z AT ukazom AT+CMGF modulu SIM900 povedali, da želimo poslati tekstovno SMS sporočilo, nato pa smo z ukazom AT+CMGS izbrali številko mobilnega telefona, kamor želimo sporočilo poslati. Po ukazih za pošiljanje SMS sporočila ima modul SIM900 5 sekund časa, da ga pošlje, preden ga izklopimo (OFF).

Vsebino sporočila potrdimo s CTRL+Z simbolom. ASCII vrednost simbola CTRL+Z je 26, zato modulu SIM900 pošljemo char(26) s stavkom ModulSIM900.println((char)26).

Sprejemanje SMS sporočila in prikaz sporočila na serijskem monitorju.

Program:

/*

  Arduino Uno in modul GSM/GPRS SIM900.

  Sprejemanje SMS sporočila. 

 */

 #include <SoftwareSerial.h>            //Uvoz knjižnice.

 SoftwareSerial Modul_SIM900(7, 8);     //GSM modul SIM900 => Pin 7 RX, Pin 8 TX.

 

 char Prejeto_Sporocilo=0;              //Deklariranje in inicializacija znakovne spremenljivke (char).

 

 void setup()

 {

   Serial.begin(19200);                     //Komunikacija s serijskim potrom 19200 bit/s.

   Modul_SIM900.begin(19200);               //Komunikacija z modulom SIM900.

   ModulSIM900_Vklop_Izklop();              //Klicanje funkcije za vklop (ON) modula SIM900.

   delay(10000);                            //Čas, da se SIM900 vključi v omrežje.

 

   Modul_SIM900.print("AT+CMGF=1\r");  //SMS => tekstovno sporočilo.

   delay(100);  

   Modul_SIM900.print("AT+CNMI=2,2,0,0,0\r");   //Pošiljanje AT ukaza modulu SIM900 za prejemanje SMS sporočila. 

   delay(100);

 }

 

 void ModulSIM900_Vklop_Izklop()

 /*

   GSM modul lahko vklopimo (ON) in izklopimo (OFF) s stikalom (Power), ki je nameščeno na modulu.

   Privzeti način je stanje OFF. Lahko pa to storimo programsko:

   Za vklop (ON) v programu postavimo pin 9 za 1 sekundo v stanje logične 1.

  */

 {

   digitalWrite(9, HIGH);

   delay(1000);

   digitalWrite(9, LOW);

   delay(7000);

 }

 

 void loop()

 {

   //Prikažemo besedilo sporočila, ki ga na serijski monitor pošlje modul SIM900.

   if(Modul_SIM900.available() > 0)

   {

     Prejeto_Sporocilo=Modul_SIM900.read();     //Branje sporočila.

     Serial.print(Prejeto_Sporocilo);           //Izpis besedila.

   }

 }

V funkciji void setup() imamo dva AT ukaza. Prvi AT+CMGF=1\r pomeni, da želimo prejemati tekstovno SMS sporočilo, z drugim AT+CNMI=2,2,0,0,0\r pa modulu SIM900 povemo, naj vsako prejeto SMS sporočilo pošlje na serijski port, da ga lahko prikažemo na serijskem monitorju.

Ko naložimo program na razvojno ploščo Arduino Uno, odpremo serijski monitor. Čez nekaj nekaj časa (cca 15 do 20 sekund) se na serijskem monitorju prikažeta AT ukaza, ki se zaključita z OK (Slika 3).

Slika 3: Prikaz na serijskem monitorju pred prejemanjem SMS sporočila

Sedaj lahko sprejemamo SMS sporočila. Prejeto SMS sporočilo prikazuje slika 4. Vsebuje številko mobilnega telefona, iz katerega je bilo SMS sporočilo poslano, datum, uro in vsebino sporočila.

Slika 4: Prejeto SMS sporočilo

Pošiljanje SMS sporočila s pomočjo izbire na serijskem monitorju.

Program:

/*

  Arduino Uno in modul GSM/GPRS SIM900.

  Pošiljanje SMS sporočila z izbiro na serijskem monitorju. 

 */

 #include <SoftwareSerial.h>          //Uvoz knjižnice.

 SoftwareSerial ModulSIM900(7, 8);    //GSM modul SIM900 => Pin 7 RX, Pin 8 TX.

 

 void setup()

 {

   ModulSIM900.begin(19200);        //Komunikacija 19200 bit/s.

   Serial.begin(19200);             //Serijski monitor.

   ModulSIM900_Vklop_Izklop();      //Klicanje funkcije za vklop (ON) oz. izklop (OFF).

   delay(10000);                    //Čas, da se modul poveže z omrežjem.

 }

 

 void ModulSIM900_Vklop_Izklop()

 /*

   GSM modul lahko vklopimo (ON) in izklopimo (OFF) s stikalom (Power), ki je nameščeno na modulu.

   Privzeti način je stanje OFF. Lahko pa to storimo programsko:

   Za vklop (ON) v programu postavimo pin 9 za 1 sekundo v stanje logične 1. Enako storimo za

   izklop (OFF), če je bil modul pred tem v stanju ON:

  */

 {

   digitalWrite(9, HIGH);

   delay(1000);

   digitalWrite(9, LOW);

   delay(5000);

 }

 //Funkcija za pošiljanje SMS sporočila:

 void sendSMS()

 {

   ModulSIM900.print("AT+CMGF=1\r");          //AT ukaz za pošiljanje SMS spročila (1 => text mode, \r => začni skrajno levo).

   delay(100);

   ModulSIM900.println("AT + CMGS = \"+38641xxxxxx\"");   //Mobilna številka prejemnika, mednarodna oznaka.

   delay(100);

   ModulSIM900.println("Pozdravlja vas Arduino Uno.");          //Besedilo sporočila.

   delay(100);

   ModulSIM900.println((char)26);                               //AT ukaz za konec pošiljanje SMS sporočila => ASCII koda 26.

   delay(5000);                                                 //Čas za pošiljanje SMS sporočila.

   ModulSIM900_Vklop_Izklop();                                  //Klicanje funkcije za izklop GSM modula.

 }

 

 void loop()       //Glavna zanka.

 {

   if(Serial.available()>0)

   switch(Serial.read())

   {

     case's':                           //SMS sporočilo pošljemo, če v serijski monitor vpišemo s in pritisnemo tipko enter.

     sendSMS();                         //Klicanje funkcije za pošiljanje SMS sporočil.

     break;

   }

 }

SMS sporočilo pošljemo na izbrano mobilno številko, če odpremo serijski monitor, vpišemo s in pritisnemo na tipko Enter.

Avtomatsko pošiljanje SMS sporočila na izbrano mobilno številko v primeru nevarnosti (povišanja temperature).

Program:

/*

  Arduino Uno in modul GSM/GPRS SIM900.

  Pošiljanje SMS sporočila v primeru nevarnosti.

 */

 #include <SoftwareSerial.h>          //Uvoz knjižnice.

 SoftwareSerial ModulSIM900(7, 8);    //GSM modul SIM900 => Pin 7 RX, Pin 8 TX.

 #include <LiquidCrystal.h>           //Knjižnica za LCD display.

 LiquidCrystal lcd(12,6,2,3,4,5);

 /* Priključitev LCD displaya:

 RS: Pin12

 EN: Pin6

 D4: Pin2

 D5: Pin3

 D6: Pin4

 D7: Pin5

 */

 int Senzor_LM35 = A1;        //Temp. senzor je priključen na analogni vhod A1.

 float Temperatura;           //Tip spremenljivke float => realna števila (z decimalno vejico).

 float Previsoka_temp;

 float Dovoljena_temp;

 int Stevilo_SMS_sporocil;     //Tip spremenljivke int => cela števila.

 int Opozorilo;

 void setup()

 {

   pinMode(Senzor_LM35, INPUT);        //Pin A1, kamor je priključen temp. senzor je vhodni pin.

   ModulSIM900.begin(19200);           //Komunikacija na portu med Arduino in SIM900 je 19200 bit/s.

   Serial.begin(19200);

   lcd.begin(16,2);                    //Dvovrstični LCD display, vsaka vrstica po 16 znakov.

   ModulSIM900_Vklop_Izklop();         //Klicanje funkcije za programski ON/OFF modula SIM900.

   delay(10000);

   lcd.clear();

 }

 void ModulSIM900_Vklop_Izklop()

 {

   digitalWrite(9, HIGH);

   delay(1000);

   digitalWrite(9, LOW);

   delay(5000);

 }

 void loop()                //Glavna funkcija, zanka, ki se neprestano ponavlja. Iz glavne zanke kličemo dve funkciji.

 {

   Preveri_Previsoka_temp();

   Preveri_Dovoljena_temp();

 }

 void Preveri_Previsoka_temp()

 {

   lcd.setCursor(1,0);

   lcd.print("Temp.(C): ");              //Izpis v prvi vrstici od znaka 2 naprej (prvi znak je znak 0).

   Previsoka_temp = Preveri_temp();      //Kličemo funkcijo Preveri_temp(), ki vrača (return Temperatura) vrednost temperature.

   lcd.setCursor(11,0);

   lcd.print(Previsoka_temp);

   if(Previsoka_temp > 30)               //Ali je temperatura večja od 30 °C? (Normalno bi bila ta meja višja, npr 45 °C).

   {

     Poslji_Sporocilo();                 //Temperatura je večja od 30 °C, pokliči funkcijo za pošiljanje SMS sporočila.

   }

 }

 float Preveri_temp()

 {

   Temperatura = analogRead(Senzor_LM35);    //V spremenljivko Temperatura se shrani prebrana vrednost iz senzorja.

   Temperatura = Temperatura * 5;            //Pretvorba v °C, decimalni prikaz vrednosti.

   Temperatura = Temperatura/10;

   return Temperatura;                       //Funkcija Preveri_temp() vrača (return) vrednost spremenljivke Temperatura.

 }

 void Poslji_Sporocilo()

 {

   while(Stevilo_SMS_sporocil < 1)           //Število SMS sporočil, ki jih želimo poslati.

   {

     Poslji_tekst_SMS();                     //Funkcija za pošiljanje AT ukazov SIM900 modulu.

   }

   Opozorilo = 1;  

   lcd.setCursor(0,1);                       //Izpis na LCD display, piši v drugo vrstico od prvega znaka naprej.

   lcd.print("Ogenj SMS poslan");

 }

 void Preveri_Dovoljena_temp()

 {

   if(Opozorilo == 1)                        //Potem ko je bilo sporočilo poslano, ponovno preveri izmerjeno temperaturo.

   {

     Dovoljena_temp = Preveri_temp();

     if(Dovoljena_temp < 27)                 //Ali je temperatura manjša od 27 °C?

     {

       lcd.clear();

       lcd.setCursor(0,1);

       lcd.print("Ni nevarnosti!");

       Stevilo_SMS_sporocil = 0;           //Inicializacija.

       Opozorilo = 0;                      //Inicializacija.

     }

   }

 }

 void Poslji_tekst_SMS()

 {

   ModulSIM900.println("AT+CMGF=1\r");       //AT ukaz za pošiljanje SMS spročila (1 => text mode, \r => začni skrajno levo).

   delay(100);

   ModulSIM900.println("AT + CMGS = \"+38641xxxxxx\"");     //Mobilna številka prejemnika SMS sporočila, mednarodna oznaka.

   delay(100);

   ModulSIM900.println("Pozor OGENJ!");                     //Besedilo sporočila.

   delay(100);

   ModulSIM900.println((char)26);                           //AT ukaz za konec pošiljanje SMS sporočila => ASCII koda 26.

   delay(5000);                                             //Čas za pošiljanje SMS sporočila.

   ModulSIM900_Vklop_Izklop();                              //Klicanje funkcije za izklop GSM modula.

   Stevilo_SMS_sporocil = Stevilo_SMS_sporocil + 1;

 }

Priključitev elementov:

Razvojno ploščo GSM/GPRS SIM900, ki ima enak razpored pinov (pinout) kot razvojna plošča Arduino Uno, vstavimo v konektorje plošče Arduino Uno.

Izhod temperaturnega senzorja LM35 (sredinski priključek) priključimo na analogni pin A1.

LCD display priključimo:

 * Odvisno od tipa LCD displaya.

Opis programa:

Iz glavne zanki void loop(), ki se neprestano izvaja, kličemo dve funkciji: Preveri_Previsoka_temp() in Preveri_Dovoljena_temp().

V funkciji Preveri_Previsoka_temp() najprej določimo znak na LCD displayu, kjer naj se prične izpisovati besedilo Temp.(C): . Nato pokličemo funkcijo Preveri_temp(), ki je tipa float in vrača vrednost (return) izmerjene temperature. Ta vrednost se shrani v spremenljivko Previsoka_temp in prikaže v prvi vrstici LCD-ja od znaka 12 naprej (prva vrstica je vrstica 0, prvi znak v vrstici je znak 0). Če je izmerjena temperatura večja od 30 °C, se izvede blok if stavka, ki pokliče funkcijo za pošiljanje SMS sporočila. Če je temperatura manjša od 30 °C, se blok if stavka ne izvede, saj pogoj ni resničen.

V funkciji void Poslji_Sporocilo() smo uporabili zanko while, ki se izvaja tako dolgo, dokler je pogoj resničen. S pogojem lahko določimo, da se pošlje več SMS sporočil, v našem primeru se pošlje eno.

V funkciji Preveri_Dovoljena_temp(), imamo if stavek, katerega blok se izvede le v primeru, ko je vrednost spremenljivke Opozorilo enako 1. To pomeni, da je bilo pred tem poslano SMS sporočilo zaradi previsoke temperature. Najprej se izvede meritev temperature, katere vrednost se shrani v spremenljivko Dovoljena_temp. Vgnezden imamo še drugi if stavek, katerega blok se izvede, če je izmerjena vrednost temperature manjša od 27 °C.

Za pošiljanje SMS sporočil v primeru nevarnosti lahko uporabimo druge pogoje in senzorje, lahko je pogojev več. Uporabimo lahko senzor dima, senzor ognja, senzor gibanja, skrita mikro stikala, odvisno od našega namena, kdaj, kakšno in komu vse naj se pošlje SMS sporočilo.