KKM: SIM800 GSM/GPRS MODUL
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
}
}}}}}