KKM: SIM800 GSM/GPRS MODUL

KKM: SIM800 GSM/GPRS MODUL-Uncategorized

Početnik si s Dasduinom. Ili s elektronikom? Za oko ti je zapeo određeni modul, ali ne znaš kako ga koristiti? Bez brige, tu je KKM! Kako Koristiti Module (KKM) je serija blog tutorijala tvrtke soldered na kojoj ćeš pronaći sve što ti treba kako bi započeo rad sa svojim omiljenim modulom. Tutorijali obuhvaćaju: tehničke karakteristike, princip rada, upute kako povezati modul s Dasduinom te osnovni kod. Sve ostalo prepuštamo tebi na maštu.

UVOD

U ovom tutorijalu opisat ćemo GSM/GPRS modul SIM800L koji služi za uspostavljanje i primanje poziva, poruka te povezivanje na Internet putem GSM mreže. Modul nam daje jako puno mogućnosti jer s njim projekte koji su povezani na Internet možemo postaviti bilo gdje, te nismo ovisni o kućnom ADSL internetu ili WiFi mreži. U tutorijalu ćemo ukratko opisati kako modu radi te ćemo opisati postupak uspostave poziva, slanja poruka te povezivanje na Internet.

KAKO RADI?

Ovaj modul koristi GSM tehnologiju, te se preko nje povezuje na Internet, ili šalje poruke i upućuje pozive. GSM je mrežna tehnologija koja je najkorištenija za mobilnu komunikaciju. U GSM mreži imamo nekoliko cjelina koje zajedno omogućuju komunikaciju, a to su mobilna stanica (naš GSM modul ili mobilni telefon), podsustav bazne stanice i mrežni podsustav.
Mobilna stanica (MS) sastoji se od samog GSM uređaja i kartice poznate kao SIM kartice. Pomoću SIM kartice omogućuje se neovisnost o uređaju jer vlasnik SIM kartice može koristiti GSM usluge na bilo kojem uređaju koristeći svoju SIM karticu. SIM kartica sadrži IMSI broj prema kojem se korisnik identificira sustavu. Mobilna stanica se povezuje na najbližu baznu stanicu (primopredajni uređaj) te s njom razmjenjuje podatke.
Podsustav bazne stanice sastoji se od primopredajne bazne stanice i upravljačkog djela bazne stanice, te sadrži primopredajne uređaje koji se povezuju s mobilnim stanicama.
Mrežni podsustav sadrži mobilni servisni komutacijski centar koji radi poput običnog komutacijskog čvorišta, vrši registraciju korisnika, provjerava autentičnost, usmjerava pozive itd. ovaj sustav se sastoji od nekoliko cjelina koje obavljaju sve potrebne funkcije te se dalje vežu na fiksnu telefonsku mrežu.

Naš modul je mobilna stanica koja sadrži SIM karticu te se brine za povezivanje na baznu stanicu, a sa Dasduinom komunicira preko serijske komunikacije, te koristi AT komande sa kojima upravljamo modulom.

 

KAKO POVEZATI?

Modul koristi samo 2 pina jer komunicira preko serijske komunikacije. Kako za komunikaciju s računalom i programiranje našeg mikrokontrolera koristimo serijsku komunikaciju i pinove 0 i 1, onda za komunikaciju s našim GSM modulom moramo koristiti SoftwareSerial biblioteku i pinove koje sami definiramo. Za napajanje modula je potrebno koristiti vanjski izvor napajanja jer nam Dasduino ne može isporučiti dovoljno struje koja je potrebna modulu. Modu može najviše povući do 2A struje kada se spaja na Internet te je potrebno koristiti napajanje koje može dati toliko struje. Za napajanje je potrebno osigurati da napon ne prelazi vrijednost od 4.4 volta i da nije ispod 3.7 V te za to možemo koristiti step-down konverter koji ćemo podesiti na 4.2 V.
Modul možemo napajati LI-po baterijom čiji nazivni napon iznosi 3.7V, a maksimalni napon potpuno napunjene baterije iznosi 4.2V što je ispod maksimalnog napona modula.
Shema koja koristi bateriju za napajanje i shema koja koristi izvor sa step-down konverterom prikazane su na slikama.
Pinovi za serijsku komunikaciju koje koristimo na shemama i u primjeru koda su 9 za RX liniju i 10 za TX. Kako modul nije 5 V tolerantan RX liniju spajamo preko otpornog dijelila koje smo sastavili od 10 k ohm otpora i 5.6 k ohm.

ARDUINO KOD

Za komunikaciju s modulom moramo koristiti SoftwareSerial biblioteku, ali ju nije potrebno preuzimati jer se ona već nalazi u Arduino IDE.
Primjer koda nam pokazuje kako s AT naredbama možemo kreirati poziv, poslati poruku, te se povezati na Internet. Popis svih AT naredbi se nalazi na linku.
U primjeru putem Serial monitora odabiremo što želimo. Za pozivanje upisanog broja koristimo P, za javljanje J, a za prekid poziva K. Za slanje poruke S te za povezivanje na Internet i odlazak na upisanu stranicu I.

//uključujemo SoftwareSerial biblioteku koja nam služi serijsku komunikaciju sa GPRS/GSM modulom
#include <SoftwareSerial.h>
String unos;// string u koji spremamo tekst sa Serial monitora
String str; // string u koji spremamo tekst koji nam vrati GSM modul
String poruka="Poruka poslana sa SIM800L modula"; //poruka koju šaljemo kada pozovemo funkciju sms
String web="http://educ8s.tv/test.txt"; //web stranica na koju odlazimo kada pozovemo funkciju internet
String number="+385xxxxxxxxx"; //broj koji pozivamo funkcijom call ili na koji šaljemo poruku(upisati broj koji želimo)
//varijable koje se koriste u funkcijama
int br;
int mult;
char buf[10];
int flag;
//Konstruktor za našu biblioteku, uspostavljamo serijsku komunikaciju na pinovima 9 i 10
SoftwareSerial gsm(9,10); // RX, TX
void setup() {
  Serial.begin(9600);//započinjemo serijsku komunikaciju(9600 bauda)
  Serial.println("GSM SIM800L inicijalizacija");
  gsm.begin(9600);//započinjemo serijsku komunikaciju s GSM modulom
  delay(500);//pauza od pola sekunde
  gsm.println("AT");//provjeravamo dali Croduino komunicira s GSM modulom
  //funkcija koja naredbe sa Serial monitora šalje na GSM modul, te s modula šalje na Serial monitor
  updateSerial();
  Serial.println("Jakost signala (0-31):");
  gsm.println("AT+CSQ");// naredba za provjeru jakosti signala
  updateSerial();
  gsm.println("AT+CREG?");//provjeravamo dali smo registrirani na mrežu(1-home network, 5- roaming network)
  updateSerial();
  delay(500);
  Serial.println("primanje poruka");
  gsm.println("AT+CNMI=1,2,0,0,0");//naredba koja omogućuje primanje poruka s GSM modulom
}
void loop() {
 updateSerial();
 
}
//funkcija koju pozivamo kada se hoćemo povezati na internet i posjetiti upisanu web stranicu
void internet(){
  //postavljamo APN za našu mrežu ( A1>>> internet, T-Mobile>>> internet.ht.hr) može se pronaći na internetu za određenog operatera (operater APN)
  gsm.println("AT+SAPBR=3,1,\"APN\",\"internet\"");
  updateSerial();
  gsm.println("AT+SAPBR=1,1");
  updateSerial();
  gsm.println("AT+HTTPINIT");
  updateSerial();
  gsm.println("AT+HTTPPARA=\"CID\",1");
  updateSerial();
  //postavljamo web stranicu na koju se povezujemo
  gsm.println("AT+HTTPPARA=\"URL\",\""+web+"\"");
  updateSerial();
  gsm.println("AT+HTTPACTION=0");
  updateSerial();
  //čitamo web stranicu te ispisujemo podatke na serial monitor( za web stranicu iz primjera ispisat će se It works fine!
  gsm.print("AT+HTTPREAD=0,");
  gsm.println(br);
  updateSerial();
  }
  
//funkcija za pozivanje upisanog broja
void call(){
    gsm.println("ATD+ "+number+';');
    Serial.println("pozivate broj: " + number);
}
//funkcija koja šalje poruku na broj koji smo upisali
void sms(){
  //postavljamo modul u mod za slanje poruka
  gsm.println("AT+CMGF=1");
  updateSerial();
  gsm.print("AT+CMGS=");// naredba kojom postavljamo broj na koji ćemo poslati poruku te unosimo poruku
  gsm.print('"');
  gsm.print(number);
  gsm.println('"');
  gsm.println(poruka);
  updateSerial();
  gsm.write(26);//ASCII vrijednost ctrl+Z, završavamo unos poruke i šaljemo poruku
  }
//funkcija koja naredbe sa Serial monitora šalje na GSM modul, te s modula šalje na Serial monitor
  void updateSerial()
{
  delay(1000);//pauza od jedne sekunde
  while (Serial.available())//sve dok imamo nešto u Serial bufferu nalazimo se u petlji
  {
    unos=Serial.readString();//spremamo tekst iz Serial monitora u String unos
    //provjeravamo dali unos sa Serial monitora odgovara određenom znaku, te prema tome pozivamo određene funkcije
    if(unos=="I"){
      //pozivamo funkciju za internet
      unos="";//brišemo vrijednost iz Stringa unos
      internet();//pozivamo funkciju za internet
      }
    if(unos=="S"){
      unos="";//brišemo vrijednost iz Stringa unos
      sms();//pozivamo funkciju za slanje poruke
    }
    if(unos=="P"){
      unos="";//brišemo vrijednost iz Stringa unos
      call();//pozivamo funkciju za kreiranje poziva
    }
    if(unos=="K"){
      unos="";//brišemo vrijednost iz Stringa unos
      gsm.println("ATH");//prekidamo poziv
      Serial.println("poziv zavrsen");
    }
    if(unos=="J"){
      unos="";//brišemo vrijednost iz Stringa unos
      Serial.println("javljanje");
      gsm.println("ATA");//naredba za javljanje
    }
   //ako String unos nije bio jedan od prethodnih znakova onda ga prosljeđujemo na GSM modul
    gsm.println(unos);
  }
  //sve dok imamo nešto s GSM modula nalazimo se u petlji
  while(gsm.available()){
   
  str=gsm.readString();//spremamo tekst s GSM modula u String str
  Serial.println(str);//prosljeđujemo tekst na Serial monitor
  //daljnji kod traži određenu naredbu koju vraća GSM modul prilikom ispisa web stranice
  // iz povratne naredbe uzimamo broj za sljedeću naredbu pa moramo imati ovaj dio
  //provjeravamo dali imamo unutar stringa str tekst "+HTTPACTION:" i ako imamo vraćamo indeks na kojem mjestu unutar str počinje
  // ako nemamo taj tekst onda je povratna vrijednost -1
  flag=str.indexOf("+HTTPACTION:");
  // provjeravamo dali je flag veći od 0 odnosno dali smo imali traženi tekst unutar Stringa str
    if(flag>0){
    str.remove(0,flag);//brišemo tekst iz stringa str od početka(0) do indeksa flag ( tu nam započinje traženi tekst)
    flag=str.indexOf("200,");//tražimo indeks u Stringu gdje nam je broj 200
    str.remove(0,flag);// brišemo sve iz Stringa do broja 200
    str.toCharArray(buf,10);//pretvaramo String u polje znakova
    str="";//ispraznimo String str
    mult=1;// varijabla koja označava desetice, stotice i tisućice
    br=0;// varijabla u koju spremamo broj koji kasnije koristimo
    
    for(int i=0;i<10;i++){ 
      // idemo redom po polju znakova buf i tražimo dali ima zarez
      if(buf[i]==','){
        //ako ima zarez onda spremamo broj iza zareza u varijablu br
        // i to tako da svaku decimalu spremamo posebno
        if(isDigit(buf[i+3])){
      br += (buf[i+3] - '0') * mult;
      mult *= 10; // mult koristimo kako bi dobili desetice, stotice i tisućice
        }
        if(isDigit(buf[i+2])){
      br += (buf[i+2] - '0') * mult;
      mult *= 10; // mult koristimo kako bi dobili desetice, stotice i tisućice
        }
        if(isDigit(buf[i+1])){
      br += (buf[i+1] - '0') * mult;
      mult *= 10; // mult koristimo kako bi dobili desetice, stotice i tisućice
        }
      }}}}}